菜单

编码器

相关源文件

本文档描述了 OBS 编码器系统,该系统负责将视频和音频压缩成适合流媒体和录制的格式。编码器是实现 obs_encoder_info 接口的插件,允许不同的压缩算法和硬件加速选项被互换使用。

有关编码器如何与输出系统集成的更多信息,请参阅 输出

架构概述

OBS 中的编码器将原始音视频数据转换为 H.264、HEVC、AV1、AAC 等压缩格式。编码器系统被设计为模块化和可扩展的,支持软件和硬件加速。

来源: plugins/obs-x264/obs-x264.c67-97 plugins/obs-ffmpeg/obs-ffmpeg-nvenc.c32-42 plugins/obs-qsv11/obs-qsv11.c84-103

编码器接口

所有编码器都实现 obs_encoder_info 接口,该接口定义了一组通用的函数和行为。

关键接口函数包括:

  • create():初始化编码器。
  • destroy():清理资源。
  • encode():处理帧并生成压缩输出。
  • update():动态更改编码器设置。
  • get_properties():定义可配置的设置。
  • get_extra_data():返回特定于编解码器的头信息(H.264 的 SPS/PPS 等)。

来源: plugins/obs-x264/obs-x264.c576-591 plugins/obs-ffmpeg/obs-ffmpeg-nvenc.c577-593 plugins/obs-qsv11/obs-qsv11.c783-806

编码器类型

OBS 提供了多种编码器实现以满足不同需求:

软件编码器

x264 编码器

x264 编码器提供基于软件的 H.264 编码。它具有出色的质量和压缩效果,但需要大量的 CPU 资源。

主要功能

  • 多种码率控制模式(CBR、VBR、CQP)
  • 可配置的预设(veryfast、medium 等)
  • 通过 x264 参数进行高级设置

来源: plugins/obs-x264/obs-x264.c100-117 plugins/obs-x264/obs-x264.c225-269

硬件编码器

NVENC 编码器 (NVIDIA)

NVENC 使用 NVIDIA GPU 加速编码,减少 CPU 使用。

主要功能

  • 支持 H.264、HEVC 和 AV1(较新的显卡)
  • 硬件加速编码
  • 质量预设和视觉优化
  • B 帧支持

来源: plugins/obs-ffmpeg/obs-ffmpeg-nvenc.c43-49 plugins/obs-ffmpeg/obs-ffmpeg-nvenc.c93-197

QSV 编码器 (Intel)

QSV (QuickSync Video) 使用 Intel 的专用编码硬件。

主要功能

  • 支持 H.264、HEVC 和 AV1(较新的处理器)
  • 硬件加速编码,对 CPU 影响最小
  • 低延迟模式
  • 各种目标使用配置档

来源: plugins/obs-qsv11/obs-qsv11.c111-133 plugins/obs-qsv11/obs-qsv11.c200-366

FFmpeg 编码器

OBS 通过 FFmpeg 提供额外的编码器

  • FFmpeg AAC (音频)
  • FFmpeg Opus (音频)
  • AOM AV1 (视频)
  • SVT-AV1 (视频)

来源: plugins/obs-ffmpeg/obs-ffmpeg-av1.c40-50 plugins/obs-ffmpeg/data/locale/en-US.ini6-13

编码过程

编码过程遵循以下一般流程:

  1. 来自源的原始帧经过滤镜。
  2. 编码器接收帧并进行压缩。
  3. 编码后的数据包传递给输出系统。
  4. 不同的输出类型(流媒体、录制)使用这些数据包。

来源: plugins/obs-outputs/rtmp-stream.c399-457 plugins/obs-x264/obs-x264.c394-464

视频编码器设置

每个编码器都通过属性接口公开设置。常见设置包括:

设置描述适用编码器
码率控制确定码率管理(CBR、VBR、CQP)所有视频编码器
比特率目标比特率(单位:Kbps)所有视频编码器
关键帧间隔关键帧之间的时间(秒)所有视频编码器
CPU 使用率/预设质量与性能的权衡x264、NVENC
配置文件编解码器配置文件(baseline、main、high)所有视频编码器
B 帧双向帧的数量x264、NVENC、QSV
视觉优化感知质量改进NVENC
显卡硬件编码器的 GPU 选择NVENC

来源: plugins/obs-x264/obs-x264.c170-222 plugins/obs-ffmpeg/obs-ffmpeg-nvenc.c463-548 plugins/obs-qsv11/obs-qsv11.c371-426

码率控制方法

编码器支持几种码率控制方法:

  1. CBR (恒定比特率):保持稳定的比特率,适合流媒体。
  2. VBR (可变比特率):根据内容复杂度改变比特率,更适合录制。
  3. CQP/CRF (恒定质量):无论比特率如何,都保持一致的质量。
  4. ICQ (Intel 恒定质量):QSV 特有的恒定质量模式。

来源: plugins/obs-x264/obs-x264.c151-168 plugins/obs-ffmpeg/obs-ffmpeg-nvenc.c442-461 plugins/obs-qsv11/obs-qsv11.c313-342

编解码器支持

不同的编码器支持不同的视频编解码器。

编码器H.264HEVCAV1
x264
NVENC
QSV
FFmpeg

来源: plugins/obs-ffmpeg/obs-ffmpeg-nvenc.c577-611 plugins/obs-qsv11/obs-qsv11.c783-806 plugins/obs-qsv11/obs-qsv11.c200-210

颜色格式支持

编码器在处理各种颜色格式和 HDR 内容方面具有不同的能力。

编码器8 位 (NV12/I420)10 位 (P010/I010)HDR (PQ/HLG)
x264
NVENC
QSV

来源: plugins/obs-ffmpeg/obs-ffmpeg-nvenc.c313-336 plugins/obs-qsv11/obs-qsv11.c527-566 plugins/obs-x264/obs-x264.c458-488

输出系统的编码器集成

编码器由输出系统用于生成用于流媒体和录制的压缩媒体

输出系统

  1. 根据输出设置选择合适的编码器
  2. 将编码后的数据包传递给正确的复用器
  3. 处理时间戳和数据包排序
  4. 管理流媒体和录制状态

来源: plugins/obs-outputs/rtmp-stream.c637-694 plugins/obs-outputs/flv-mux.c398-458

动态比特率调整

一些编码器,特别是硬件编码器,支持在流式传输期间动态调整比特率

此功能允许 OBS 适应不断变化的***网络条件,在拥塞期间降低比特率,有助于防止流断开连接。

来源: plugins/obs-outputs/rtmp-stream.c585-610 plugins/obs-qsv11/obs-qsv11.c1305-1311 plugins/obs-ffmpeg/obs-ffmpeg-nvenc.c200-214

编码器头信息和附加数据

视频编码器会生成特定于编解码器的头信息(例如 H.264 的 SPS/PPS),这些信息必须包含在流中

这些头信息包含有关视频流的基本信息,包括分辨率、帧率和其他编码参数。

来源: plugins/obs-x264/obs-x264.c559-566 plugins/obs-ffmpeg/obs-ffmpeg-nvenc.c254-269 plugins/obs-qsv11/QSV_Encoder_Internal.cpp157-159

结论

OBS 编码器系统为视频和音频压缩提供了一个灵活、模块化的框架。通过通用的接口支持多种编码器实现,OBS 允许用户为其特定的硬件和需求选择最佳编码器。

该系统通过各种编码器选项和设置平衡性能、质量和灵活性,使其适用于各种流媒体和录制场景。