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

一、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));
}

相关推荐

  1. Webrtc支持HEVC解码器创建

    2024-06-06 14:58:02       28 阅读
  2. Webrtc支持HEVCMediasoup SDP协商编码流程(三)

    2024-06-06 14:58:02       27 阅读
  3. Webrtc支持FFMPEG硬解码NVIDA(

    2024-06-06 14:58:02       35 阅读
  4. Webrtc支持FFMPEG硬解码解码实现(三)

    2024-06-06 14:58:02       44 阅读
  5. Webrtc支持FFMPEG硬解码Intel(一)

    2024-06-06 14:58:02       26 阅读
  6. webrtc vp8/9视频解码介绍

    2024-06-06 14:58:02       26 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-06 14:58:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-06 14:58:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-06-06 14:58:02       82 阅读
  4. Python语言-面向对象

    2024-06-06 14:58:02       91 阅读

热门阅读

  1. cuda 存储相关博客收藏

    2024-06-06 14:58:02       26 阅读
  2. 注解 - @RequestParam

    2024-06-06 14:58:02       24 阅读
  3. Python正则表达式匹配中文:深入解析与实战应用

    2024-06-06 14:58:02       26 阅读
  4. git -- 清除本地分支以及删除远程分支

    2024-06-06 14:58:02       32 阅读
  5. STM32开发遇见问题解决2024.6.6

    2024-06-06 14:58:02       32 阅读
  6. Elasticsearch核心概念解析:索引、文档与类型

    2024-06-06 14:58:02       29 阅读
  7. MQ基础(RabbitMQ)

    2024-06-06 14:58:02       31 阅读
  8. Linux系统编程之进程间通信(IPC)

    2024-06-06 14:58:02       29 阅读
  9. websocket链接携带参数

    2024-06-06 14:58:02       31 阅读
  10. EVO轨迹评估工具基本使用教程(学习记录)

    2024-06-06 14:58:02       29 阅读
  11. Selenium自动化测试入门:cookie 处理

    2024-06-06 14:58:02       32 阅读