1.前言 在使用大疆机场直播的时候,本来我用了阿里云的rtmp服务,结果阿里云的rtmp服务总是非常的卡,非常的慢,多次联系阿里云之后,他们说解决不了这个东西,不支持120帧的高刷,也不支持 “大疆的无人机推流,分析推过来的流,在每个 P 帧前面都有插入 SEI ,导致播放卡顿,要在推流端把这个 SEI 和 AUD 去掉 再推流。” 这就是让我去改大疆的设备,这个让我怎么处理呢?
参考文章:
【1】.
快速入门 这里是官方的文档,说明了如何配置这个东西。
【2】.
标准直播服务费用 直播流量和直播带宽,不同的计费标准,基本上是 0.26 元每GB。
2.添加域名 在云直播控制台,域名管理,增加推流直播和拉流直播,根据提示进行操作,主要就是配置DNS映射。
3.获取推流地址 我这里使用Java代码获取推流和拉流地址。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 private static final char [] DIGITS_LOWER = {'0' , '1' , '2' , '3' , '4' , '5' , '6' , '7' , '8' , '9' , 'a' , 'b' , 'c' , 'd' , 'e' , 'f' }; private static String getSafeUrl (String key, String streamName, long txTime) { String input = new StringBuilder (). append(key). append(streamName). append(Long.toHexString(txTime).toUpperCase()).toString(); String txSecret = null ; try { MessageDigest messageDigest = MessageDigest.getInstance("MD5" ); txSecret = byteArrayToHexString( messageDigest.digest(input.getBytes("UTF-8" ))); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return txSecret == null ? "" : new StringBuilder (). append("txSecret=" ). append(txSecret). append("&" ). append("txTime=" ). append(Long.toHexString(txTime).toUpperCase()). toString(); } private static String byteArrayToHexString (byte [] data) { char [] out = new char [data.length << 1 ]; for (int i = 0 , j = 0 ; i < data.length; i++) { out[j++] = DIGITS_LOWER[(0xF0 & data[i]) >>> 4 ]; out[j++] = DIGITS_LOWER[0x0F & data[i]]; } return new String (out); } public String generateTcPushUrl (String streamName) { String pushUrl = "" ; if (tcPushKey.isEmpty()) { pushUrl = "rtmp://" +tcPushDomain+"/" +tcAppName+"/" +streamName; }else { long timeStamp = System.currentTimeMillis()/1000L + tcExpireTime; pushUrl = "rtmp://" +tcPushDomain+"/" +tcAppName+"/" +streamName+"?" +getSafeUrl(tcPushKey,streamName,timeStamp); } return pushUrl; } public String generaTcPullUrl (String streamName,String type) { String result="" ; String rtmpUrl = "" ; String hlsUrl = "" ; String flvUrl = "" ; String artcUrl = "" ; if (pullKey.isEmpty()) { rtmpUrl = "rtmp://" +tcPullDomain+"/" +appName+"/" +streamName; hlsUrl = "http://" +tcPullDomain+"/" +appName+"/" +streamName+".m3u8" ; flvUrl = "http://" +tcPullDomain+"/" +appName+"/" +streamName+".flv" ; artcUrl = "webrtc://" +tcPullDomain+"/" +appName+"/" +streamName; }else { long timeStamp = System.currentTimeMillis()/1000L + tcExpireTime; rtmpUrl = "rtmp://" +tcPullDomain+"/" +appName+"/" +streamName+"?" +getSafeUrl(tcPullKey,streamName,timeStamp); hlsUrl = "http://" +tcPullDomain+"/" +appName+"/" +streamName+".m3u8" +"?" +getSafeUrl(tcPullKey,streamName,timeStamp); flvUrl = "http://" +tcPullDomain+"/" +appName+"/" +streamName+".flv" +"?" +getSafeUrl(tcPullKey,streamName,timeStamp); artcUrl = "webrtc://" +tcPullDomain+"/" +appName+"/" +streamName+"?" +getSafeUrl(tcPullKey,streamName,timeStamp); } switch (type){ case "flv" : result=flvUrl; break ; case "rtmp" : result=rtmpUrl; break ; case "webrtc" : result=artcUrl; break ; case "m3u8" : result=hlsUrl; break ; } return result; }
4.直播推流 PC 端推流,建议使用 OBS WebRTC 推流。
5.获取播放地址 通过地址生成器,或者控制台,都可以获取播放地址。登录云直播控制台 > 进入常用工具 > 地址生成器 进入地址生成器页面,获取播放地址。推流成功后,选择 流管理 > 在线流,查看推流地址状态,单击预览在线播放观看。
6.TCPlayer Web 端直播流测试:建议您使用 TCPlayer Demo 工具进行播放体验。
1.申请License
2.通过 npm 集成 1 pnpm install tcplayer.js
3.放置 video 1 2 <video id ="player-container-id" width ="414" height ="270" preload ="auto" playsinline webkit-playsinline > </video >
4.播放器初始化 1 2 3 4 5 6 7 8 9 10 11 12 var player = TCPlayer ('player-container-id' , { sources : [{ src : 'path/to/video' , }], licenseUrl : 'license/url' , }); rtmp :rtmp :
参考文章:
【1】.
TCPlayer 集成指引 【2】.
WEB 体验馆 这里可以测试相关的url是否可用。
【3】.
Web 本文档是介绍适用于直播和点播播放的 Web 播放器( TCPlayer )的相关参数以及 API。本文档适合有一定 Javascript 语言基础的开发人员阅读。
5.VUE版 使用 TCPlayer 接入还是挺方便的,播放器初始化需要传入两个参数,第一个为播放器容器 ID,第二个为功能参数对象。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 function createTcPlay (id, pullUrl ) { let domId = id; let dom = document .createElement ('video' ); dom.setAttribute ('class' , 'player video-screen-shot' ); dom.setAttribute ('id' , domId); dom.setAttribute ('autoplay' , 'autoplay' ); dom.setAttribute ('playsinline' , 'playsinline' ); dom.setAttribute ('webkit-playsinline' , 'webkit-playsinline' ); let videoWrap = videoWrapRef.value as any; videoWrap.appendChild (dom); let video = new TCPlayer (id, { sources : [ { src : pullUrl, }, ], licenseUrl : 'https://license.vod2.myqcloud.com/license/v2/1251578519_1/v_cube.license' , controls : false , webrtcConfig : { receiveSEI : true , }, }); video.on ('error' , function ( ) { livePara.liveState = false ; }); video.on ('webrtcevent' , function (event ) { let data = event.data ; let code = data.code ; if (code == 1003 ) { livePara.liveState = true ; } }); return video; }
6.直播转码 配置转码需要一定的费用,按不同的功能进行收费,H.264的720P,每分钟 0.0325元。
(1)配置转码模版 可以设置帧率,gop,美颜等功能。
(2)绑定域名 设置完转码模版之后,就可以绑定域名。
(3)播放流在 StreamName 后面增加 “_模版名”
错误 (1)Cannot read properties of null 当我调用 dispose() 方法销毁播放器的时候,就会报这个错误。 Uncaught (in promise) TypeError: Cannot read properties of null (reading ‘trigger’) at e.onReceiveSEI (TXLivePlayer-1.3.5.min.js:1:373508) at TXLivePlayer-1.3.5.min.js:1:315904 at Array.forEach () at Object.transform (TXLivePlayer-1.3.5.min.js:1:315837) 【解决方案】 主要解决方案就是延迟销毁
1 2 3 setTimeout (() => { videoAiPlay.dispose (); }, 1000 );
(2)直播流自动断链 在直播过程中,播放着播放着,直播流就中断了,我刷新页面,或者重建 TcPlayer ,结果又能继续的直播了,我提交了工单,工单就开始敷衍我,说我是主动断流的。我用的是大疆的无人机进行的直播推流,我开启直播之后,就一直不动,然后过一会自己就断开了,我刷新之后重新打开播放器,结果又可以继续的直播了。我确定我没有关闭直播流,而且如果我交替打开两个播放器,那么在工单中说的,说我主动断流的,但是两个播放器并不是同时断流,而是交替断流的。