webrtc嵌入式中转推流端

牢骚

团队要搞什么webrtc,一天假回来啥都没了,抢回来了一个webrtc推流端模块,不然整个webrtc就没我啥事了。webrtc是现在的热门,刷boss的适合发现很多媒体开发岗都蹭热度要webrtc相关经验。所以同事看到webrtc眼睛放光,啥都没给我留。系统用的是kurento。

推流端有两种,一种是直接运行在相机上,直接代码上拿流,这个比较简答,rtsp模块是我做的,砍了砍就实现了。另一种就是我这里要写的内容。从成品相机拉rtsp视频再推给kurento 的 kms。这个复杂一些,需要有 rtsp client 功能和 rtp push 功能,以前也做过 rtsp client ,但心灰意冷不想再手写了。直接用 ffmpeg 接口吧。

框架

信令服务器走wss,所以推流端需要有websocket,查可一下选用 libwebsockets 。rtsp client 和 rtp push 用的是 ffmpeg 接口。ffmpeg 是一个媒体学习工具,不建议在不改动的情况下直接拿来工程用!在这里用它存在一个弊端,那就是延时问题,ffmpeg 是拿了一个完整的视频帧后,再按rtp推走。一帧视频几十几百 tcp/udp包,ffmpeg相当于先收了100个tcp包拼成完整帧,再打成100包发走。这个逻辑是完全没有必要的!浪费了很多的性能增大了不必要的延时。所以建议自己开发或ffmpeg深度修改,精简网络媒体数据处理逻辑!这不是ffmpeg的问题,ffmpeg是学习交流工具!它兼顾整个系统架构和学习者阅读方便性,只有这样才能让大家更快的入门流媒体和ffmpeg!如果你也是用kurento,建议钻研源码!

libwebsocets

推流端要同时支持多路,每路单独走wss链接(走一个还是走多个都可以,我为了迁就kurento端开发,正好多路也能好好学习一下,查过baidu会发现没有多路文章,但Google上存在)。代码不再详述了,我会把demo上传,需要请积分下载。如果想自己学习欢迎私信,尽量帮忙。官方libwebsockets-4.0-stable/minimal-examples/http-client/minimal-http-cli
ent-multi例子是多路的处理方式,可以参考。

ffmpeg

ffmpeg在这里使用非常简单,不涉及内容的转换和变换,就是input-->output-->readframe-->writeframe。但这里推流有两个问题,一个是替换payload值,另一个是修改ssrc,需要注意。代码不再详述了,我会把demo上传,需要请积分下载。如果想自己学习欢迎私信,尽量帮忙。

题外话

读到这里会发现这哪是webrtc,确实这并不是webrtc。仅仅是借用ewbrtc的开源项目来缩短以前视频的延时、增大网络适应性、web端无插件(264不转vp8也是可以的噢)。rtmp等毕竟都是tcp协议,各种框架大家又没有时间去修改,刚好kurento原生完美解决了这些问题。想学好流媒体有两点:1、项目落地,实验室的东西不靠谱没意义,上量后会有各种问题等你处理。2、钻研任意一套开源项目,万变不离其宗。

### WebRTC 视频与拉实现方式 #### 使用WebRTC进行视频和拉的概念理解 WebRTC是一种支持网页浏览器之间的实时通信的技术,能够实现在无需插件的情况下,在浏览器间直接传递音频、视频以及任意数据[^1]。 #### 基于WebRTC的视频程 当涉及到基于WebRTC的视频时,通常会遵循如下过程: - **建立连接**:两个点(通常是客户和服务)通过信令服务器交换SDP(Session Description Protocol)消息来协商媒体参数并创建ICE候选者列表以发现最佳路径。 - **获取本地媒体资源**:利用`getUserMedia()` API请求用户的摄像头权限,并捕获音视频轨道作为发送源。 - **准备传输通道**:设置PeerConnection对象配置项如iceServers等,并监听其状态变化事件以便处理异常情况;同时注册ontrack回调函数用于接收远传来的多媒体。 - **启动数据传送**:调用addTrack()方法向peer connection添加想要分享给对方的一条或多条media track(s),从而触发实际的数据包封装与转发动作。 ```javascript // 创建一个新的 RTCPeerConnection 对象实例 const pc = new RTCPeerConnection({ iceServers: [{ urls: 'stun:stun.l.google.com:19302' }] }); // 获取用户设备上的媒体输入(麦克风/摄像机) navigator.mediaDevices.getUserMedia({ audio: true, video: true }) .then(stream => { stream.getTracks().forEach(track => pc.addTrack(track, stream)); }) .catch(error => console.error('Error accessing media devices.', error)); // 处理接收到的远程媒体 pc.ontrack = event => { const remoteVideoElement = document.getElementById('remote-video'); if (!remoteVideoElement.srcObject) { remoteVideoElement.srcObject = event.streams[0]; } }; ``` 上述代码片段展示了如何初始化一个简单的WebRTC应用框架,其中包含了基本组件间的交互逻辑。 #### 利用第三方工具辅助完成更复杂的场景构建 对于某些特定需求下的复杂应用场景,则可能需要用到额外的支持库或服务。例如,可以借助Janus Gateway这样的中间件简化多路复用操作,或是采用Kurento Media Server增强对高级功能的支持力度,像录制会议内容等功能都可以依靠这些平台得以高效实施[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值