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();
的原因所在。