Webrtc支持HEVC之编解码器创建(二)

一、Webrtc编码器创建流程

cpp 复制代码
// 第一帧图片到达
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)

二、编码器创建流程部分详解

cpp 复制代码
//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));
}
相关推荐
Black蜡笔小新11 小时前
国标GB28181视频监控平台EasyCVR赋能平安乡村建设,构筑乡村治理“数字防线”
java·网络·音视频
中小企业实战军师刘孙亮11 小时前
组织赋能+体系搭建,破解中小企业增长困局-佛山鼎策创局破局增长咨询
架构·产品运营·音视频·制造·业界资讯
幽络源小助理11 小时前
X4独角兽视频网站新版源码_整站视频系统_带CMS后台_幽络源源码
音视频·php源码
EasyGBS13 小时前
国密GB35114协议国标GB28181平台EasyGBS双标融合筑牢金融视频监控安全技术底座
安全·金融·音视频
二等饼干~za89866814 小时前
GEO 源码部署搭建详细操作教程(2026 最新版)
线性代数·django·开源·音视频·ai-native
EasyDSS15 小时前
私有化视频会议系统/视频直播点播EasyDSS一体化音视频平台打造全链路企业培训解决方案
音视频
EasyDSS16 小时前
私有化音视频系统/智能会议管理系统EasyDSS私有化视频门户重构企业安全协作新模式
安全·重构·音视频
独占的甜蜜16 小时前
从FLAC到WAV:whisper.cpp中的FFmpeg音频预处理全解析过程
ffmpeg·whisper·音视频
鼹鼠SDN16 小时前
手机随时看电脑里的视频!局域网在家看,出门在外也能看,无需公网IP
服务器·科技·智能手机·电脑·音视频·远程工作
独占的甜蜜16 小时前
从FLAC到WAV:whisper.cpp中的FFmpeg音频预处理全解析
ffmpeg·whisper·音视频