牢骚
团队要搞什么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、钻研任意一套开源项目,万变不离其宗。