本文档描述了 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 编码器提供基于软件的 H.264 编码。它具有出色的质量和压缩效果,但需要大量的 CPU 资源。
主要功能
来源: plugins/obs-x264/obs-x264.c100-117 plugins/obs-x264/obs-x264.c225-269
NVENC 使用 NVIDIA GPU 加速编码,减少 CPU 使用。
主要功能
来源: plugins/obs-ffmpeg/obs-ffmpeg-nvenc.c43-49 plugins/obs-ffmpeg/obs-ffmpeg-nvenc.c93-197
QSV (QuickSync Video) 使用 Intel 的专用编码硬件。
主要功能
来源: plugins/obs-qsv11/obs-qsv11.c111-133 plugins/obs-qsv11/obs-qsv11.c200-366
OBS 通过 FFmpeg 提供额外的编码器
来源: plugins/obs-ffmpeg/obs-ffmpeg-av1.c40-50 plugins/obs-ffmpeg/data/locale/en-US.ini6-13
编码过程遵循以下一般流程:
来源: 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
编码器支持几种码率控制方法:
来源: plugins/obs-x264/obs-x264.c151-168 plugins/obs-ffmpeg/obs-ffmpeg-nvenc.c442-461 plugins/obs-qsv11/obs-qsv11.c313-342
不同的编码器支持不同的视频编解码器。
| 编码器 | H.264 | HEVC | AV1 |
|---|---|---|---|
| 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
编码器由输出系统用于生成用于流媒体和录制的压缩媒体
输出系统
来源: 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 允许用户为其特定的硬件和需求选择最佳编码器。
该系统通过各种编码器选项和设置平衡性能、质量和灵活性,使其适用于各种流媒体和录制场景。