一、Webrtc编码器创建流程
// 第一帧图片到达
VideoStreamEncoder::OnFrame
// 尝试编码图片
VideoStreamEncoder::MaybeEncodeVideoFrame
// 配置编码器
VideoStreamEncoder::ReconfigureEncoder
// 创建代理编码器EncoderSimulcastProxy
EncoderSimulcastProxy::EncoderSimulcastProxy
// 通过传入setting中的factory、video format创建编码器
BuiltinVideoEncoderFactory::CreateVideoEncoder
EncoderSimulcastProxy::EncoderSimulcastProxy
// 判断是否支持,并创建编码器
InternalEncoderFactory::CreateVideoEncoder
// 模版类
VideoEncoderFactoryTemplate::CreateVideoEncoder
VideoEncoderFactoryTemplate::CreateVideoEncoderInternal
template <typename V, typename... Vs>
std::unique_ptr<VideoEncoder> CreateVideoEncoderInternal(
const SdpVideoFormat& format) {
// 通过传入的SDP信息,先要判断是否能支持当前的格式
if (IsFormatInList(format, V::SupportedFormats())) {
return V::CreateEncoder(format);
}
if constexpr (sizeof...(Vs) > 0) {
return CreateVideoEncoderInternal<Vs...>(format);
}
return nullptr;
}
// 创建编码器实现, 注意这里需要已定义: WEBRTC_USE_H264
OpenH264EncoderTemplateAdapter::CreateEncoder
// 创建H264编码器实现
H264Encoder::Create
// 通过配置创建编码器
H264EncoderImpl(const cricket::VideoCodec& codec)
二、编码器创建流程部分详解
//PeerConnectionFactory 传参
factory = webrtc::CreatePeerConnectionFactory(
networkThread.get(),
workerThread.get(),
signalThread.get(),
adm,
webrtc::CreateBuiltinAudioEncoderFactory(), // 创建音频编码器工厂
webrtc::CreateBuiltinAudioDecoderFactory(), // 创建音频解码器工厂
webrtc::CreateBuiltinVideoEncoderFactory(), // 创建视频编码器工厂
webrtc::CreateBuiltinVideoDecoderFactory(), // 创建视频解码器工厂
nullptr,
nullptr);
// 视频编码器工厂
std::unique_ptr<VideoEncoderFactory> CreateBuiltinVideoEncoderFactory() {
return std::make_unique<BuiltinVideoEncoderFactory>();
}
// BuiltinVideoEncoderFactory 创建视频编码器
std::unique_ptr<VideoEncoder> CreateVideoEncoder(
const SdpVideoFormat& format) override {
// 尝试创建编码器
std::unique_ptr<VideoEncoder> internal_encoder;
if (format.IsCodecInList(
internal_encoder_factory_->GetSupportedFormats())) {
internal_encoder = std::make_unique<EncoderSimulcastProxy>(
internal_encoder_factory_.get(), format);
}
// 判断支持哪些类型
std::vector<SdpVideoFormat> InternalEncoderFactory::GetSupportedFormats()
const {
return Factory().GetSupportedFormats();
}
// 定义工厂,支持多少类型,注: 如果需要支持H265这里需要添加H265的Adapter
using Factory =
VideoEncoderFactoryTemplate<
#if defined(WEBRTC_USE_H264)
webrtc::OpenH264EncoderTemplateAdapter, // h264
#endif
webrtc::LibvpxVp8EncoderTemplateAdapter, // vp8
webrtc::LibvpxVp9EncoderTemplateAdapter, // vp9
#if defined(RTC_USE_LIBAOM_AV1_ENCODER)
webrtc::LibaomAv1EncoderTemplateAdapter // AV1
#endif
>;
// 创建编码器
std::unique_ptr<VideoEncoder> OpenH264EncoderTemplateAdapter::CreateEncoder(const SdpVideoFormat& format)
{
return H264Encoder::Create(cricket::VideoCodec(format));
}