本文WebRtc 视频编码器选择代码分析,基于M105版本。
编码参数设置到WebRtcEngine
模块里 WebRtcVideoChannel
,会调用到这里:
bool WebRtcVideoChannel::GetChangedSendParameters(
const VideoSendParameters& params,
ChangedSendParameters* changed_params) const {
if (!ValidateCodecFormats(params.codecs) ||
!ValidateRtpExtensions(params.extensions, send_rtp_extensions_)) {
return false;
}
std::vector<VideoCodecSettings> negotiated_codecs =
SelectSendVideoCodecs(MapCodecs(params.codecs));
SelectSendVideoCodecs
函数:
std::vector<WebRtcVideoChannel::VideoCodecSettings>
WebRtcVideoChannel::SelectSendVideoCodecs(
const std::vector<VideoCodecSettings>& remote_mapped_codecs) const {
std::vector<webrtc::SdpVideoFormat> sdp_formats =
encoder_factory_ ? encoder_factory_->GetImplementations()
: std::vector<webrtc::SdpVideoFormat>();
会调用encoder_factory_->GetImplementations()
函数,
std::vector<SdpVideoFormat>
NebulaVideoEncoderFactory::GetSupportedFormats() const {
NSLog(@"yinyinyin NebulaVideoEncoderFactory::GetSupportedFormats ");
std::vector<SdpVideoFormat> supported_formats;
for (RTC_OBJC_TYPE(RTCVideoCodecInfo) * supportedCodec in
[encoder_factory_ supportedCodecs]) {
SdpVideoFormat format = [supportedCodec nativeSdpVideoFormat];
supported_formats.push_back(format);
}
for (const webrtc::SdpVideoFormat &format : SupportedX264Codecs())
supported_formats.push_back(format);
return supported_formats;
}
最终调用到 RTCDefaultVideoEncoderFactory
的 supportedCodecs
,里面是所有支持的视频编码能力集合,这里添加需H265支持。
+ (NSArray<RTC_OBJC_TYPE(RTCVideoCodecInfo) *> *)supportedCodecs {
NSDictionary<NSString *, NSString *> *constrainedHighParams = @{
@"profile-level-id" : kRTCMaxSupportedH264ProfileLevelConstrainedHigh,
@"level-asymmetry-allowed" : @"1",
@"packetization-mode" : @"1",
};
RTC_OBJC_TYPE(RTCVideoCodecInfo) *constrainedHighInfo =
[[RTC_OBJC_TYPE(RTCVideoCodecInfo) alloc] initWithName:kRTCVideoCodecH264Name
parameters:constrainedHighParams];
NSDictionary<NSString *, NSString *> *constrainedBaselineParams = @{
@"profile-level-id" : kRTCMaxSupportedH264ProfileLevelConstrainedBaseline,
@"level-asymmetry-allowed" : @"1",
@"packetization-mode" : @"1",
};
RTC_OBJC_TYPE(RTCVideoCodecInfo) *constrainedBaselineInfo =
[[RTC_OBJC_TYPE(RTCVideoCodecInfo) alloc] initWithName:kRTCVideoCodecH264Name
parameters:constrainedBaselineParams];
#if defined(WEBRTC_MAC)
NSDictionary<NSString *, NSString *> *constrainedMainParams = @{
@"profile-level-id" : kRTCSupportedH264ProfileLevelConstrainedMain,
@"level-asymmetry-allowed" : @"1",
@"packetization-mode" : @"1",
};
RTC_OBJC_TYPE(RTCVideoCodecInfo) *constrainedMainInfo =
[[RTC_OBJC_TYPE(RTCVideoCodecInfo) alloc] initWithName:kRTCVideoCodecH264Name
parameters:constrainedMainParams];
#endif
RTC_OBJC_TYPE(RTCVideoCodecInfo) *vp8Info =
[[RTC_OBJC_TYPE(RTCVideoCodecInfo) alloc] initWithName:kRTCVideoCodecVp8Name];
NSMutableArray<RTC_OBJC_TYPE(RTCVideoCodecInfo) *> *result = [@[
constrainedHighInfo,
constrainedBaselineInfo,
#if defined(WEBRTC_MAC)
constrainedMainInfo,
#endif
vp8Info,
] mutableCopy];
if ([RTC_OBJC_TYPE(RTCVideoEncoderVP9) isSupported]) {
[result
addObject:[[RTC_OBJC_TYPE(RTCVideoCodecInfo) alloc] initWithName:kRTCVideoCodecVp9Name]];
}
#if defined(RTC_USE_LIBAOM_AV1_ENCODER)
[result addObject:[[RTC_OBJC_TYPE(RTCVideoCodecInfo) alloc] initWithName:kRTCVideoCodecAv1Name]];
#endif
#ifdef WEBRTC_USE_H265
RTC_OBJC_TYPE(RTCVideoCodecInfo) *h265Info = [[RTC_OBJC_TYPE(RTCVideoCodecInfo) alloc] initWithName:kRTCVideoCodecH265Name];
[result addObject:h265Info];
#endif
return result;
}
作者:pixpark
来源:像素公园PixPark
原文:https://mp.weixin.qq.com/s/xxaxRKU2Z-nLbS8rQayojA
版权声明:本文内容转自互联网,本文观点仅代表作者本人。本站仅提供信息存储空间服务,所有权归原作者所有。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至1393616908@qq.com 举报,一经查实,本站将立刻删除。