C# 实现腾讯云多路直播流的云端混合录制

目录

 应用场景

腾讯云直播和云点播

产品架构

混流显示示例 

关键代码

API实现

小结


 应用场景

在云考试或视频面试中,除了对考生、考官的实时音视频监控以防止作弊行为的发生以外,对直播流的音视频录制也尤为重要,可做为后期证据材料进行追溯、举证。

在实际的应用场景中,会有多路直播流的产生,因此根据业务需要可以将多路直播流混合录制成一个视频文件,腾讯云称其为云端混录。混录后的视频可以更加直观的进行回放,可以同时查看多路直播流的视频情况。

混录场景举例:

场景1:在线考试回放,三路混流。主图像显示考生面部及背后方视频、副图1显示考生正前方视频、副图2显示屏幕共享视频。

场景2:一对一视频面试,两路混流。主图显示考生答题情况视频、副图1显示考官提问情况视频。

腾讯云直播和云点播

云端混流涉及腾讯云直播和云点播服务。

腾讯云直播(Cloud Streaming Services,CSS)提供极速、稳定、专业的云端直播处理服务,根据业务的不同直播场景需求,提供标准直播、快直播、云导播台三种服务,分别针对大规模实时观看、超低延时直播、便捷云端导播的场景,配合腾讯云视立方·直播 SDK,提供一站式的音视频直播解决方案。具体可访问该网址进行了解:https://cloud.tencent.com/product/css

腾讯云点播(VOD)面向音视频、图片等媒体,提供制作上传、存储、转码、媒体处理、媒体 AI、加速分发播放、版权保护等一体化的高品质媒体服务。具体可访问该网址进行了解:https://cloud.tencent.com/product/vod

产品架构

下图是我们基于腾讯云产品架构图的部分采用和实现方案:

​ 

混流显示示例 

我们的混流设计输出如下图演示:

副图1显示在右上方,如果有副图2则依次向下排列。

​关于更多布局设计和产品文档请参考腾讯云产品网址进行了解:https://www.tencentcloud.com/zh/document/product/267/37665

关键代码

API实现

//混录方法,参数 mixtype,默认为混录,填写cancel为申请取消,roomid为直播房间号,userid1 为主图直播流名称,userid2 为副图直播流名称,videosize为视频分辨率,如“720p"           public string MixRecord(string mixtype,string roomid,string userid1,string userid2,string videosize){roomid = int.Parse(roomid).ToString();  //对roomid进行一次转int的特殊处理
//计算主图尺寸int vw = 640;int vh = 480;switch (videosize){case "240p":vw=320;vh=240;break;case "360p":vw=640;vh=360;break;case "480p":vw=640;vh=480;break;case "720p":vw=1280;vh=720;break;case "1080p":vw=1920;vh=1080;break;case "1440p":vw=2560;vh=1440;break;case "4K":vw=3840;vh=2160;break;}
//计算副图尺寸int svw = vw / 4;int svh = vh / 4;switch (videosize){case "240p":svh=60; break;case "360p":svh=90; break;case "480p":svh=120; break;case "720p":svh=180; break;case "1080p":svh=270; break;case "1440p":svh=360; break;case "4K":svh = 540; break;}
//提供在腾讯云申请的开发帐号及开发KEY等string _appid = "";   string _sdkappid = "";string _key = "";
//调用腾讯云混流APIstring _interface = "Mix_StreamV2";MD5 md5 = new MD5();string _t=getTimestamp(60); //加偏移量60秒string _sign = md5.GetMD5Hash(_key+_t).ToLower(); //计算MD5var url = string.Format("http://fcgi.video.qcloud.com/common_access?appid={0}&interface={1}&t={2}&sign={3}",_appid,_interface,_t,_sign);string _timestamp = getTimestamp(0);string _eventid = getTimestamp(0);string _app_id = _appid;string mix_stream_session_id = roomid;string output_stream_id = _sdkappid + "_" + roomid + "_" + userid1 + "_main";string input_stream_id1 = _sdkappid + "_" + roomid + "_" + userid1 + "_main";string input_stream_id2 = _sdkappid + "_" + roomid + "_" + userid2 + "_main";var postData = "{\"timestamp\":" + _timestamp + ",\"eventId\":" + _eventid + ",\"interface\":{\"interfaceName\":\"Mix_StreamV2\",\"para\":{\"app_id\":\"" + _app_id + "\",\"interface\": \"mix_streamv2.start_mix_stream_advanced\",\"mix_stream_session_id\" : \"" + mix_stream_session_id + "\",\"output_stream_id\": \"" + output_stream_id + "\",\"input_stream_list\":[{\"input_stream_id\":\"" + input_stream_id1 + "\",\"layout_params\":{\"image_layer\":1}},{\"input_stream_id\":\"" + input_stream_id2 + "\",\"layout_params\":{\"image_layer\": 2,\"image_width\": "+svw+",\"image_height\": "+svh+",\"location_x\": "+(vw-svw-20).ToString()+",\"location_y\": 20}}]}}}";if (mixtype == "cancel"){postData = "{\"timestamp\":"+_timestamp+",\"eventId\":"+_eventid+",\"interface\":{\"interfaceName\":\"Mix_StreamV2\",\"para\":{\"app_id\":\""+_app_id+"\",\"interface\": \"mix_streamv2.cancel_mix_stream\",\"mix_stream_session_id\" : \""+mix_stream_session_id+"\",\"output_stream_id\": \""+output_stream_id+"\"}}}";}System.Net.HttpWebRequest request;request = (System.Net.HttpWebRequest)WebRequest.Create(url);request.Method = "POST";request.ContentType = "application/json;charset=UTF-8";byte[] payload;payload = System.Text.Encoding.UTF8.GetBytes(postData);request.ContentLength = payload.Length;try{Stream writer = request.GetRequestStream();writer.Write(payload, 0, payload.Length);writer.Close();System.Net.HttpWebResponse response;response = (System.Net.HttpWebResponse)request.GetResponse();System.IO.Stream stream;stream = response.GetResponseStream();List<byte> bytes = new List<byte>();int temp = stream.ReadByte();while (temp != -1){bytes.Add((byte)temp);temp = stream.ReadByte();}byte[] result = bytes.ToArray();return System.Text.Encoding.Default.GetString(result);}catch (Exception ee){return  "{\"errcode\":2,\"errmsg\":\"" + ee.Message + "\"}";}}//request mix
public class MD5{public  string GetMD5Hash(string str){//就是比string往后一直加要好的优化容器StringBuilder sb = new StringBuilder();using (MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider()){//将输入字符串转换为字节数组并计算哈希。byte[] data = md5.ComputeHash(Encoding.UTF8.GetBytes(str));//X为     十六进制 X都是大写 x都为小写//2为 每次都是两位数//假设有两个数10和26,正常情况十六进制显示0xA、0x1A,这样看起来不整齐,为了好看,可以指定"X2",这样显示出来就是:0x0A、0x1A。 //遍历哈希数据的每个字节//并将每个字符串格式化为十六进制字符串。int length = data.Length;for (int i = 0; i < length; i++)sb.Append(data[i].ToString("X2"));}return sb.ToString();}}
            public string getTimestamp(int seconds){TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);return Convert.ToInt64(ts.TotalSeconds+seconds).ToString();}

小结

以上提供的代码仅供参考,在实际的应用中,我们要编写符合自己业务的逻辑,比如多路混流,还要考虑实际的运营成本,比如录制费用、存储费用等。有关腾讯云点播产品的价格情况,可以访问:https://cloud.tencent.com/act/pro/vod

云端混录在直播时进行合成,腾讯的建议是延迟一段时间再进行API申请,我在这里设置为5秒以后再申请。

为防止混录失败,我们可以在腾讯云直播管理后台,设置自动生成各路直播流的录制,以做为素材备用(会产生存储费用和录制费用),后期可以下载视频进行再合成。

以上就是自己的一些分享,时间仓促,不妥之处还请大家批评指正!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/149315.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

斯坦福机器学习 Lecture2 (假设函数、参数、样本等等术语,还有批量梯度下降法、随机梯度下降法 SGD 以及它们的相关推导,还有正态方程)

假设函数定义 假设函数&#xff0c;猜一个 x->y 的类型&#xff0c;比如 y ax b&#xff0c;随后监督学习的任务就是找到误差最低的 a 和 b 参数 有时候我们可以定义 x0 1&#xff0c;来让假设函数的整个表达式一致统一 如上图是机器学习中的一些术语 额外的符号&#xf…

spring boot加mybatis puls实现,在新增/修改时,对某些字段进行处理,使用的@TableField()

1.先说场景&#xff0c;在对mysql数据库表数据插入或者更新时都得记录时间和用户id 传统实现有点繁琐&#xff0c;这里还可以封装一下公共方法。 2.解决方法&#xff1a; 2.1&#xff1a;使用aop切面编程&#xff08;记录一下&#xff0c;有时间再攻克&#xff09;。 2.2&…

宝塔站点配置

我这里使用的thinkphp 框架部署的

SaleSmartly新增AI意图识别触发器!让客户享受更精准的自动化服务

AI意图识别技术是对话式AI中很重要的组成部分&#xff0c;通俗点来说就是一种可以识别用户在对话中表达的意图的技术。通过对大量数据的分析和学习&#xff0c;AI可以理解用户想要获得的信息&#xff0c;并根据这些信息来采取相应的行动或提供相应的响应。而在对话式AI中&#…

手机LiDAR-based激光雷达标定板提高无人汽车智能化程度

手机LiDAR-based 3D扫描和建模测试系统是一种利用激光雷达&#xff08;LiDAR&#xff09;技术进行三维扫描和模型创建的工具&#xff0c;它可以在手机上运行。这种测试系统可以用于各种应用&#xff0c;如地形测绘、建筑物建模、机器人视觉、无人驾驶汽车导航等。 手机LiDAR-ba…

云端援手:智能枢纽应对数字资产挑战 ——华为云11.11应用集成管理与创新专区优惠限时购

现新客3.96元起&#xff0c;下单有机会抽HUAWEI P60 Art 福利仅限双十一 机会唾手可得&#xff0c;立即行动&#xff01; 「有效管理保护应用与数据的同时实现高效互通」——华为云全力满足企业需求&#xff0c;推出全套「应用集成管理与创新」智能解决方案&#xff1a;华为云…

家电电器展示预约小程序的作用是什么

电器产品已经成为人们生活的必备品&#xff0c;如冰箱、电视机、洗衣机等&#xff0c;而这些产品的购买方式也很多&#xff0c;可以到线下门店购买&#xff0c;也可以到线上多个电商平台购买&#xff0c;如今互联网高速发展以及民众享受线上服务带来的便捷性&#xff0c;同时商…

SSL证书对网站SEO的好处

随着网络安全意识的提高&#xff0c;越来越多的网站开始采用SSL证书来保护自己的数据传输过程。那么&#xff0c;SSL证书真的能为网站SEO带来好处吗&#xff1f;下面将为您分析这个问题。 加强用户体验和信任度 SSL证书不仅能确保数据传输的安全性&#xff0c;还能让客户感受…

『亚马逊云科技产品测评』活动征文|基于next.js搭建一个企业官网

『亚马逊云科技产品测评』活动征文&#xff5c;基于next.js搭建一个企业官网 授权声明&#xff1a;本篇文章授权活动官方亚马逊云科技文章转发、改写权&#xff0c;包括不限于在 Developer Centre, 知乎&#xff0c;自媒体平台&#xff0c;第三方开发者媒体等亚马逊云科技官方…

MySQL数据库入门到大牛_基础_09_子查询(子查询分类方法;单行子查询,多行子查询;相关子查询)

前面的第三章到第八章中&#xff0c;我们讲的是查询&#xff0c;查询的基本结构已经进行了介绍&#xff0c;聚合函数学习完后已经介绍了查询语句的完整的执行流程。 子查询指一个查询语句嵌套在另一个查询语句内部的查询&#xff0c;这个特性从MySQL 4.1开始引入。本章也是查询…

3D建模基础教程:编辑多边形功能命令快捷方式

一、打开3D软件并创建新模型 首先&#xff0c;打开你的3D建模软件&#xff0c;比如Blender、Maya或3ds Max。然后&#xff0c;创建一个新的3D模型。你可以使用基本几何体来创建模型&#xff0c;也可以导入现有的模型。 二、进入编辑多边形模式 在主工具栏中&#xff0c;找到并…

使用JDK自带java.util.logging.Logger引起的冲突问题

现象&#xff1a; 应用代码如下&#xff1a; import javax.script.ScriptEngineManager;ScriptEngineManager manager new ScriptEngineManager(); manager.getEngineByName("JavaScript"); 在TongWeb8上运行出错&#xff0c;日志如下&#xff1a; Servlet.servi…

WinForms C# 导入和导出 CSV 文件 Spread.NET

使用 WinForms C# 和 VB.NET 导入和导出 CSV 文件 2023 年 11 月 17 日 使用 Spread.NET 直接在 .NET WinForms 应用程序中处理 CSV 文件。 Spread.NET可帮助您创建电子表格、网格、仪表板和表单。它包括一个强大的计算引擎&#xff0c;具有 450 多个函数以及导入和导出 Micros…

安全测试工具分为 SAST、DAST和IAST 您知道吗?

相信刚刚步入安全测试领域的同学都会发现&#xff0c;安全测试领域工具甚多&#xff0c;不知如何选择&#xff01;其实安全测试工具大致分为三类&#xff1a;SAST、DAST和IAST。本文就带大家快速的了解这三者的本质区别&#xff01; SAST &#xff08;Static Application Secu…

浪涌防护器件要选对,布局布线更重要!|深圳比创达电子EMC(下)

浪涌测试&#xff0c;作为最常见的EMC抗干扰测试项目之一&#xff0c;基本上是家用消费电子必测的项目&#xff1b;其测试目的是为了验证产品在承受外部的浪涌冲击时能否正常工作。 一、比创达整改案例 1) 背景&#xff1a; 某智能插座产品在浪涌测试&#xff0c;需要过2kV差…

基于IDEA进行Maven工程构建

Java全能学习面试指南&#xff1a;https://javaxiaobear.cn 1. 构建概念和构建过程 项目构建是指将源代码、依赖库和资源文件等转换成可执行或可部署的应用程序的过程&#xff0c;在这个过程中包括编译源代码、链接依赖库、打包和部署等多个步骤。 项目构建是软件开发过程中…

振弦式渗压计的安装方式及注意要点

振弦式渗压计的安装方式及注意要点 振弦式渗压计是一种高精度、高效率的地下水位测量仪器。它可以测量地下水位的高度&#xff0c;计算地下水的压力&#xff0c;从而推算出地下水的流量。对于地下水资源管理和保护、治理工程等方面具有非常重要的意义。在安装振弦式渗压计时&a…

【大数据开发】FineReport报表基础入门

博主&#xff1a;&#x1f44d;不许代码码上红 欢迎&#xff1a;&#x1f40b;点赞、收藏、关注、评论。 格言&#xff1a; 大鹏一日同风起&#xff0c;扶摇直上九万里。 文章目录 一 登录账号二 创建一个新的表格三 单元格扩展3.1 无扩展3.2 纵向扩展3.3 横向扩展 四 父子格…

【开源】基于JAVA的超市自助付款系统

项目编号&#xff1a; S 008 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S008&#xff0c;文末获取源码。} 项目编号&#xff1a;S008&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容2.1 商品类型模块2.2 商品模块2.3 超市账…

RabbitMQ消息的可靠性

RabbitMQ消息的可靠性 一 生产者的可靠性 生产者重试 有时候由于网络问题&#xff0c;会出现连接MQ失败的情况&#xff0c;可以配置重连机制 注意&#xff1a;SpringAMQP的重试机制是阻塞式的&#xff0c;重试等待的时候&#xff0c;当前线程会等待。 spring:rabbitmq:conne…