背景
WebRTC由于license及其他的一些原因,默认的视频编解码只有使用vp8跟vp9,没有支持h264的编解码,但是我经过一些对比测试(vp9 vs h264)的测试数据发现,vp9的优势在于1080p以上才开始渐渐追上h264的效率,并且目前大多数的视频设备,还是使用h264的比较多,因此要实现对h264的编解码,就必须重新编译WebRTC添加对h264的支持。
实现
通过研究WebRTC的源码发现,对于视频编解码的部分,移动端的使用有两方面需要考虑:
- 硬件方式编解码
- 软件方式编解码
1.硬件编解码
WebRTC从r5X版本开始,Android/iOS 平台开始支持HW en/decoder, 查看r67版本WebRTC,其中:
- Android平台的支持情况分别为:
- 支持硬编硬解vp8 codec的平台:qcom/Nvidia/Exynos/Intel/MTK
- 支持硬编硬解vp9 codec的平台:qcom/Exynos
- 支持硬编硬解h264 codec的平台:qcom/Exynos/Intel/MTK
Android判断是否支持硬件编解码,是在org.webrtc.HardwareVideoEn/Decoder.java中supportedVP8/VP9/H264HwCodecPrefixes这个字符串数组中定义,可根据需要对手机做机型适配,比如华为的某些手机处理器,CPU本身支持硬件编解码,但是检测不到.
- iOS处理器只支持h264的硬编硬解。
软件使用的基本逻辑为先去判断自身平台是否支持硬件编解码,如果支持则使用,如果不支持则回退到软件编解码,具体使用上层代码HardwareVideoEn/Decoder.java和RTCVideoEn/DecoderH264.mm分别去实现Android和iOS平台的h264硬件编解码.
在native c/c++代码中的调用方式代码片段如下:
#if defined(WEBRTC_ANDROID)
webrtc::jni::MediaCodecVideoEncoderFactory* encoder_factory = new webrtc::jni::MediaCodecVideoEncoderFactory();
video_send_config.rtp.payload_name = "H264";
video_send_config.rtp.payload_type = kWtkPayloadTypeH264;
cricket::VideoCodec codec("H264")