webrtc 默认实现都是去系统获取音视频源, 而我们往往想要传输自己的音视频, 所以需要换源.
要实现的效果是(可惜这是web的实现方式!):
https://stackoverflow.com/questions/40363110/webrtc-stream-local-video-file
https://docs.google.com/document/d/1JmWfOtUP6ZqsYJ--U8y0OtHkBt-VyjX4N-JqIjb1t78/edit
而我需要的是C++的实现方式(native实现方式); 所以看上去只有看看代码了.
理论上, 我们想要实现自定义视频的发送, 可以从webrtc的视频发送流程入手:
视频捕获 (yuv数据) --> 视频编码 (vp8数据) --> 视频打包(rtp-packet)及发送.
目前准备一个webM视频源, 里边包含vp8视频流和opus音频流; 我们以发送vp8视频流为例来简单说明.
可能的3种实现方法:
1. 替换捕获的数据 (绕过编码, 直接发送)
2. 替换编码数据 (不捕获原始数据, 不编码数据, 直接解析来自文件的编码数据, 发送)
3. 直接发送自定义视频 (绕过捕获, 绕过编码)
方案1分析:
视频的捕获都是在添加video track的时候, 添加video source, video source添加 video capture. 然后替换capture里边的数据即可, 但是capture之后的数据流用的数据结构为VideoFrame, 该结构体没办法装下已编码的数据buffer和size. 它的size直接是根据视频宽和高计算出来的, 明显不能直接用. 放弃.
方案2分析:
方案2可以实现我们的需求, 具体分析见实现篇.
方案3分析:
为什么要有上边3种方式来分析, 而不是直接使用第三种方法, 简单粗暴呢? 这可能需要从webrtc的api说起(至少目前我还没有看到webrtc的api有发送已编码视频流的api).
网友评论