
音视频编解码VP8 / VP9 / H.264 / OpusWebRTC 支持哪些音视频编解码器各有什么优缺点怎么选码率怎么设这篇讲 WebRTC 常用的视频编码VP8/VP9/H.264/AV1和音频编码Opus/G.711对比选型、码率配置、以及编码相关的优化。大家好我是黒漂技术佬。原始音视频数据量巨大1080P 30帧的视频一秒钟就要几百兆根本没法传。所以要编码压缩——用更少的数据量尽量保留画质。WebRTC 支持多种编解码器视频有 VP8、VP9、H.264、AV1音频主要是 Opus。选哪个码率设多少有什么区别这篇讲 WebRTC 的音视频编解码从原理到选型到配置。一、为什么需要编解码原始数据量有多大以 1080P 30帧的视频为例每帧像素1920 × 1080 ≈ 200 万像素每个像素 YUV4201.5 字节每帧大小~3MB每秒 30 帧~90MB/s 720Mbps720Mbps 的带宽家用宽带上行一般只有几 Mbps完全传不了。编码压缩后H.264 编码 1080P 30帧一般 2-4Mbps 就够了压缩了几百倍。音频同理原始 PCM 48kHz 16bit 立体声是 1536kbpsOpus 编码后语音只要 32kbps 左右。二、视频编解码器对比1. VP8出品Google收购 On2 后开源定位WebRTC 默认视频编码特点免版税不用交钱兼容性好所有浏览器都支持编码速度快低延迟压缩率中等2. VP9出品GoogleVP8 的下一代特点免版税压缩率比 VP8 高 30-50%同画质码率更低支持更高分辨率4K编码复杂度高CPU 占用大兼容性比 VP8 差一点现在主流浏览器都支持了3. H.264 / AVC出品MPEG 组织定位业界最通用的视频编码标准特点硬件支持好手机电脑都有硬编硬解压缩率不错和 VP8 差不多或略好有专利商用可能涉及授权费WebRTC 里用一般不用操心兼容性最好所有设备都支持4. AV1出品AOMediaGoogle、Netflix、微软等联合定位下一代开放视频编码特点免版税压缩率比 VP9/H.264 再高 30%编码特别慢软件编码 CPU 占用爆炸硬件支持还在普及中WebRTC 支持度逐渐完善对比表编码免版税压缩率速度硬件支持WebRTC兼容性适用场景VP8✅一般快一般最好默认、兼容优先VP9✅好中一般好省带宽、画质优先H.264❌好快很好很好移动端、硬件加速AV1✅很好慢普及中逐渐支持未来、超高清怎么选通用场景VP8兼容性最好编码快默认选择H.264移动端硬件加速好省电适合移动场景带宽敏感 / 画质优先VP9同码率画质更好或者同画质省带宽适合网络不好、或者想要更高清的场景未来方向AV1压缩率最高但编码慢硬件支持还不够适合点播、直播等预编码场景实时通信还不太普及三、音频编解码器对比1. Opus出品Xiph.Org Mozilla定位WebRTC 默认音频编码特点免版税音质好低码率下也不错码率范围大6kbps ~ 510kbps低延迟语音和音乐都擅长所有浏览器都支持WebRTC 音频首选基本没有争议。2. G.711 (PCMU/PCMA)传统电话用的编码码率固定 64kbps音质一般只适合语音优点极低复杂度兼容性极好和传统电话系统对接的时候用3. G.722宽带语音音质比 G.711 好码率 64kbps也是老标准主要用于兼容对比编码码率音质延迟适用Opus6-510kbps 可调很好低通用首选G.71164kbps 固定一般极低电话对接G.72264kbps较好低兼容场景结论音频就用 Opus不用想。四、码率怎么设置视频码率参考分辨率帧率推荐码率最低码率320×24015150kbps100kbps640×48024500kbps300kbps640×48030750kbps400kbps1280×720301.5Mbps800kbps1920×1080303Mbps1.5Mbps1920×1080605Mbps3Mbps只是参考实际看场景会议/通话可以低一点动的少游戏/运动要高一点画面变化快音频码率参考场景推荐码率语音通话32kbps高质量语音48kbps音乐/立体声128kbps高音质音乐192-256kbps一般语音通话 32kbps 就够了Opus 在这个码率音质很不错。怎么设置码率方式 1SDP 里改修改 SDP 中的 bAS 行或者用 RTCP REMB 反馈。方式 2用 setParameters推荐constsenderpc.getSenders().find(ss.track.kindvideo);constparameterssender.getParameters();if(!parameters.encodings){parameters.encodings[{}];}parameters.encodings[0].maxBitrate1500000;// 1.5Mbpsawaitsender.setParameters(parameters);动态调整网络好的时候调高不好的时候调低。五、编码协商SDP 中的编解码怎么看用了什么编码建立连接后看 SDP或者 chrome://webrtc-internals 里看。怎么指定优先用某个编码修改 SDP把想要的编码移到前面functionpreferCodec(sdp,codecName){// 找到视频媒体行调整编码优先级// 把目标编码的 rtpmap 移到最前面// ...}或者用 SDP Semantics 的方式比较复杂。一般默认协商的就够用。编解码协商过程Offer 里列出自己支持的所有编码按优先级排Answer 里从 Offer 的列表中选双方都支持的最终用双方都支持、优先级最高的那个所以想让对方用 H.264就把 H.264 放 Offer 最前面。六、Simulcast多流联播是什么发送方同时推多路不同分辨率/码率的视频流接收方选最合适的一路看。发送方 → 1080P高码率 → 720P中码率 → 360P低码率 接收方根据自己的网络和屏幕大小选一路为什么需要多人会议时每个人网络不一样网络好的看高清网络差的看低清不卡SFU 架构常用 Simulcast。配置pc.addTrack(videoTrack,stream);constsenderpc.getSenders()[0];constparameterssender.getParameters();parameters.encodings[{rid:high,maxBitrate:1500000,scaleResolutionDownBy:1},{rid:mid,maxBitrate:500000,scaleResolutionDownBy:2},{rid:low,maxBitrate:150000,scaleResolutionDownBy:4}];sender.setParameters(parameters);同时发三路原始、1/2、1/4 分辨率。七、自适应码率是什么网络好的时候调高码率画质好网络差的时候调低不卡。WebRTC 自带带宽估计GCC会自动调整码率但也可以手动干预。怎么做监听网络状态丢包、RTT、带宽估计动态调整 maxBitrate极端情况降低分辨率和帧率配合编码切换带宽特别差的时候从 720P 降到 360P帧率从 30 降到 15保证通话不卡。八、硬件编解码硬编 vs 软编软件编码CPU硬件编码GPU/NPUCPU占用高低功耗高手机发烫低画质可调一般更好取决于硬件兼容性好看设备支持移动端一定要硬编手机上软编 720P 30帧CPU 满载发烫还卡。硬编码省电又流畅。H.264 的硬件支持最广泛VP9 也逐渐有了。WebRTC 会自动用硬件编码吗会的浏览器会自动尝试硬件加速能用上就用用不上就软件编码。九、常见问题1. 为什么视频模糊码率太低了调高 maxBitrate分辨率太低了检查采集分辨率动态场景码率不够运动多的画面需要更高码率2. 为什么视频卡、延迟高网络不好码率太高降码率用了 TURN 中继延迟会高一些编码复杂度太高比如 VP9 软编换 VP8/H.2643. 移动端发热严重分辨率/帧率太高降一点用硬件编码H.264 硬编比 VP8 软编省电关闭不必要的处理4. 不同浏览器编码不一样是的各浏览器支持的编码有差异。SDP 协商的时候会选双方都支持的。Chrome 支持 VP8/VP9/H.264/AV1Safari 对 VP9 支持晚一些。5. 可以强制用某个编码吗可以修改 SDP 只保留想要的编码。但对方不支持的话就会失败。十、选型建议一对一视频通话视频VP8 或 H.264720P 1.5Mbps音频Opus 32kbps简单稳定兼容性好多人会议SFU视频VP8 Simulcast三路音频Opus不同人看不同清晰度低带宽场景视频VP9压缩率高省带宽或者降低分辨率到 360P音频Opus 24kbps移动端为主视频H.264硬件加速好省电音频Opus高质量直播/录制视频VP9 或 H.264 High Profile高码率高分辨率十一、本篇小结原始音视频数据量巨大必须编码压缩才能传输视频编码VP8默认、兼容好、VP9压缩高、省带宽、H.264硬件好、通用、AV1未来音频编码Opus 是首选音质好、码率范围大、低延迟码率设置根据分辨率和帧率720P 30帧大概 1.5MbpsSimulcast同时发多路不同质量接收方选合适的多人场景常用自适应码率根据网络动态调整保证流畅硬件编码移动端重要省电省 CPUH.264 支持最好选型看场景通用选 VP8省带宽选 VP9移动优先选 H.264下一篇讲RTCDataChannel 数据通道除了音视频WebRTC 还能传任意数据。我是黒漂技术佬。