webrtc選擇OpenH264的編解碼設置

在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硬解碼。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容