编译WebRTC后,默认是没有把H264编码编进来的。WebRTC中H264编码采用的是openh264,解码默认采用的是
ffmpeg,移动版本android,ios默认采用的是系统的h264硬件编码,如果你的手机支持H264硬件编码的话,WebRTC
就会默认支持H264.
1.如何在桌面版本中开启H264编码
使用gn生成ninja文件时,加入以下两个选项就可以生成 ffmpeg_branding="Chrome" rtc_use_h264=true,比如我
要编译Linux版本,使用以下命令 gn gen out/linux --args='target_os="linux" target_cpu="x64" is_component_build=false
is_debug=false ffmpeg_branding="Chrome" rtc_use_h264=true',再输入ninja -C out/linux video_loopback,就会在out/linux
目录下生成video_loopback可执行文件,你进入到out/linux目录下,输入./video_loopback
--codec=H264就可以看到效果了,
这个在WebRTC56版本,ubuntu14.04环境下测试。
2.如何在安卓版本中调试h264硬件编解码
WebRTC是通过jni调用Android系统中的MediaCodec api来实现硬件编解码的,我通过分析代码发现,硬件解码的实现在org.webrtc.
MediaCodecVideoDecoder中实现的,目前WebRTC官方只调试过高通,三星等大厂商的芯片,像其它的比如海思,联发科,全志之类等
芯片,你要想把这些芯片的H264硬件解码调出来,就需要自己修改WebRTC的java代码了,在MediaCodecVideoDecoder.java中有以下代码
private static final String[] supportedVp8HwCodecPrefixes = {"OMX.qcom.",
"OMX.Nvidia.", "OMX.Exynos.", "OMX.Intel."};
private static final String[] supportedVp9HwCodecPrefixes = {"OMX.qcom.",
"OMX.Exynos."};
private static final String[] supportedH264HwCodecPrefixes = {"OMX.qcom.",
"OMX.Intel.", "OMX.Exynos."};
以下代码的意思就是VP8硬件解码只支持高通,英伟达,三星,英特尔,VP9硬件解码只支持高通和三星,H264硬件解码只支持高通,英特尔,三星。
比如我知道海思的芯片支持H264硬件解码,我只需要修改一行就可以调试出来。
private static final String[] supportedH264HwCodecPrefixes = {"OMX.qcom.",
"OMX.Intel.", "OMX.Exynos.","OMX.hisi."};
说完解码我们再来看编码,硬件编码在的MediaCodec
api来实现硬件编解码的,我通过分析代码发现,硬件解码的实现在org.webrtc.
MediaCodecVideoEncoder中,关键代码如下,
private static final MediaCodecProperties qcomH264HwProperties = new
MediaCodecProperties(
"OMX.qcom.", Build.VERSION_CODES.KITKAT, BitrateAdjustmentType.NO_ADJUSTMENT);
private static final MediaCodecProperties exynosH264HwProperties = new MediaCodecProperties(
"OMX.Exynos.", Build.VERSION_CODES.LOLLIPOP, BitrateAdjustmentType.FRAMERATE_ADJUSTMENT);
private static final MediaCodecProperties[] h264HwList =
new MediaCodecProperties[] {qcomH264HwProperties, exynosH264HwProperties};
以下代码的意思是WebRTC默认只支持高通和三星的芯片才有H264硬件编码,我现在想把海思的H264硬件编码也加进来,需要修成成以下这样:
private static final MediaCodecProperties qcomH264HwProperties = new MediaCodecProperties(
"OMX.qcom.", Build.VERSION_CODES.KITKAT, BitrateAdjustmentType.NO_ADJUSTMENT);
private static final MediaCodecProperties exynosH264HwProperties = new MediaCodecProperties(
"OMX.Exynos.", Build.VERSION_CODES.LOLLIPOP, BitrateAdjustmentType.FRAMERATE_ADJUSTMENT);
private static final MediaCodecProperties hihsH264HwProperties = new MediaCodecProperties(
"OMX.hisi.", Build.VERSION_CODES.KITKAT, BitrateAdjustmentType.NO_ADJUSTMENT);
private static final MediaCodecProperties[] h264HwList =
new MediaCodecProperties[] {qcomH264HwProperties, exynosH264HwProperties,hihsH264HwProperties};
我模仿高通的编码加了一行,并加入到h264HwList数组中,这样海思的H264硬件编码也在WebRTC中调试出来了。