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

阅读: 评论:0

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

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

目录

 应用场景

腾讯云直播和云点播

产品架构

混流显示示例 

关键代码

API实现

小结


 应用场景

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

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

混录场景举例:

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

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

腾讯云直播和云点播

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

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

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

产品架构

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

​ 

混流显示示例 

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

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

​关于更多布局设计和产品文档请参考腾讯云产品网址进行了解:

关键代码

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("={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();}

小结

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

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

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

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

本文发布于:2024-02-04 08:33:43,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170703196153994.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:腾讯   云端   多路
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23