WebRtc IOS 端默认编码器

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

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

  NSDictionary *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)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 video_encoder_factory = webrtc::CreateBuiltinVideoEncoderFactory();的原因所在。

你可能感兴趣的:(WebRtc IOS 端默认编码器)