WebRtc IOS 端默认编码器

iOS端在获取默认视频编码器的时候采用的是与windows端不同的方式,采用的是oc代码来封装了一层VideoEncoderFactory,也就是RTCDefaultVideoEncoderFactory。这个文件位于src/sdk/objc/components/video_codec下,是一个oc文件。
获取支持的编码器是如下代码:

+ (NSArray<RTCVideoCodecInfo *> *)supportedCodecs {
  NSDictionary<NSString *, NSString *> *constrainedHighParams = @{
    @"profile-level-id" : kRTCMaxSupportedH264ProfileLevelConstrainedHigh,
    @"level-asymmetry-allowed" : @"1",
    @"packetization-mode" : @"1",
  };
  RTCVideoCodecInfo *constrainedHighInfo =
      [[RTCVideoCodecInfo alloc] initWithName:kRTCVideoCodecH264Name
                                   parameters:constrainedHighParams];

  NSDictionary<NSString *, NSString *> *constrainedBaselineParams = @{
    @"profile-level-id" : kRTCMaxSupportedH264ProfileLevelConstrainedBaseline,
    @"level-asymmetry-allowed" : @"1",
    @"packetization-mode" : @"1",
  };
  RTCVideoCodecInfo *constrainedBaselineInfo =
      [[RTCVideoCodecInfo alloc] initWithName:kRTCVideoCodecH264Name
                                   parameters:constrainedBaselineParams];

  RTCVideoCodecInfo *vp8Info = [[RTCVideoCodecInfo alloc] initWithName:kRTCVideoCodecVp8Name];

#if defined(RTC_ENABLE_VP9)
  RTCVideoCodecInfo *vp9Info = [[RTCVideoCodecInfo alloc] initWithName:kRTCVideoCodecVp9Name];
#endif

  return @[
    constrainedHighInfo,
    constrainedBaselineInfo,
    vp8Info,
#if defined(RTC_ENABLE_VP9)
    vp9Info,
#endif
  ];
}

可以很清楚的看到,前面两个是H264的编码器,后面是VP8和VP9编码器。程序获取到支持的编码器后,默认取第一个编码器,也就是H264(high) 进行视频的编码器的创建。

- (id<RTCVideoEncoder>)createEncoder:(RTCVideoCodecInfo *)info {
  if ([info.name isEqualToString:kRTCVideoCodecH264Name]) {
    return [[RTCVideoEncoderH264 alloc] initWithCodecInfo:info];
  } 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;
}

这一段也是oc的代码,根据参数info信息创建编码器的对象。H264由于在IOS端采用的是硬件编码,并且gn文件中并没有将openH264编译进去,所以创建和编码基本都是在oc中完成了。VP8与VP9 由于需要用到C++的代码进行编码,所以编码器创建的过程中需要调用C++的代码。这也是iOS端如果其他不作修改,不可以直接采用std::unique_ptr<webrtc::VideoEncoderFactory> video_encoder_factory = webrtc::CreateBuiltinVideoEncoderFactory();的原因所在。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。