在Mac平臺下,WebRTC的demo默認使用VideoToolbox進行h264硬件編碼。本文檔的目標是調用OpenH264進行軟編碼。
配置與H264相關的宏
兩條命令,第一條生成xcode下的工程文件,第二條查看可用的args選項。
gn gen --args='target_cpu="x64" proprietary_codecs=true rtc_use_h264=true use_openh264=true' --ide=xcode <out_dir>
gn args --list <out_dir>
The variable "rtc_use_264" was set as a build argument
but never appeared in a declare_args() block in any buildfile.
To view all possible args, run "gn args --list <out_dir>"
The build continued as if that argument was unspecified.
修改Demo
Demo調用硬編碼的代碼如下:
std::unique_ptr<VideoEncoder> ObjCVideoEncoderFactory::CreateVideoEncoder(
const SdpVideoFormat &format) {
RTCVideoCodecInfo *info = [[RTCVideoCodecInfo alloc] initWithNativeSdpVideoFormat:format];
id<RTCVideoEncoder> encoder = [encoder_factory_ createEncoder:info];
if ([encoder isKindOfClass:[RTCWrappedNativeVideoEncoder class]]) {
// [read-note] 軟編碼實例化:vp8、vp9,還有這次加的OpenH264
return [(RTCWrappedNativeVideoEncoder *)encoder releaseWrappedEncoder];
} else {
// [read-note] 硬編碼實例化:videotoolbox-h264
return std::unique_ptr<ObjCVideoEncoder>(new ObjCVideoEncoder(encoder));
}
}
如上,vp8、vp9編碼時調用RTCWrappedNativeVideoEncoder類,而H264實現的RTCVideoEncoderH264調用VT進行硬編碼。所以思路是再封裝一個RTCWrappedNativeVideoEncoder類進行OpenH264軟編碼。增加兩個文件:RTCVideoEncoderOpenH264.h、RTCVideoEncoderOpenH264.mm,再創(chuàng)建Encoder時調用RTCVideoEncoderOpenH264,如下:
- (id<RTCVideoEncoder>)createEncoder:(RTCVideoCodecInfo *)info {
if ([info.name isEqualToString:kRTCVideoCodecH264Name]) {
//return [[RTCVideoEncoderH264 alloc] initWithCodecInfo:info];
return [RTCVideoEncoderOpenH264 openH264Encoder];
} else if ([info.name isEqualToString:kRTCVideoCodecVp8Name]) {
return [RTCVideoEncoderVP8 vp8Encoder];
#if defined(RTC_ENABLE_VP9)
} else if ([info.name isEqualToString:kRTCVideoCodecVp9Name]) {
return [RTCVideoEncoderVP9 vp9Encoder];
#endif
}
return nil;
}
修改編譯配置
由于Demo使用gn構建,ninja編譯,所以需要修改gn腳本把剛才添加的兩個文件包含到項目中。
修改sdk/build.gn
rtc_static_library("default_codec_factory_objc") {
sources = [
"objc/components/video_codec/RTCDefaultVideoDecoderFactory.h",
"objc/components/video_codec/RTCDefaultVideoDecoderFactory.m",
"objc/components/video_codec/RTCDefaultVideoEncoderFactory.h",
"objc/components/video_codec/RTCDefaultVideoEncoderFactory.m",
]
deps = [
":base_objc",
":native_video",
":videocodec_objc",
":videotoolbox_objc",
":vp8",
":OpenH264",
":vp9",
":vpx_codec_constants",
]
}
... ...
rtc_static_library("OpenH264") {
visibility = [ "*" ]
allow_poison = [ "software_video_codecs" ]
sources = [
"objc/api/video_codec/RTCVideoEncoderOpenH264.h",
"objc/api/video_codec/RTCVideoEncoderOpenH264.mm",
]
deps = [
":base_objc",
":wrapped_native_codec_objc",
"../modules/video_coding:webrtc_h264",
]
}
最終驗證可以調用OpenH264編碼,解碼使用VT硬解碼。