SRS 推流实战:使用 OBS 通过 RTMP 推送 HEVC(H.265)直播流
【免费下载链接】srsSRS is a simple, high-performance, AI-driven real-time media server supporting RTMP, WebRTC, HLS, HTTP-FLV, HTTP-TS, SRT, MPEG-DASH, and GB28181, with codec support for H.264, H.265, AV1, VP9, AAC, Opus, and G.711.项目地址: https://gitcode.com/GitHub_Trending/sr/srs
本文讲解如何在 SRS 实时媒体服务器上,使用 OBS 通过 RTMP 协议推送 HEVC(H.265)直播流,涵盖 Enhanced RTMP 规范、
hvc1fourCC 编解码标识、环境要求、Docker 部署、OBS 配置与 HTTP-FLV 播放的完整流程,并结合 SRS 源码深入解析 HEVC-over-RTMP 的底层实现原理。读完本文,你将掌握从 OBS 到 SRS 再到浏览器播放的 HEVC 直播全链路搭建能力。
背景:为什么 HEVC 需要新的 RTMP 封装方式
HEVC(H.265)相比 H.264 在同等画质下可以节省约 50% 的带宽成本,是 8K 直播等场景的必选编码。但传统 RTMP/FLV 规范(video_file_format_spec_v10_1.pdf)中定义的 Video Tag 仅支持 Sorenson H.263、Screen Video、VP6、H.264(AVC)等 CodecID,并没有为 HEVC 分配官方标识,这导致 HEVC 无法通过标准 RTMP 直接封装。
行业对此有两种解决路径:
- 非标准 CodecID 方案:沿用 FLV 视频 Tag 结构,将 CodecID 扩展为
12(即SrsVideoCodecIdHEVC,见 srs_kernel_codec.hpp),这是国内 CDN 厂商普遍采用的兼容做法; - Enhanced RTMP 标准方案:由 veovera 社区提出的 Enhanced RTMP 规范,为视频 Tag 引入扩展头(ExHeader),通过 fourCC 字符标识编码格式,HEVC 对应
hvc1。OBS 29.1 与 SRS 6.0.42+ 均支持该规范,这也是本篇文章的主角。
SRS 6.0 在此之前已经通过 SRT、HTTP-TS、HLS、MPEG-DASH 以及 WebRTC(Safari)等链路支持 HEVC 直播,本次 OBS 29.1 支持 HEVC-over-RTMP 之后,RTMP 这条最主流的推流链路也正式打通,具体能力清单可参见 H.265 直播流成本节约 50% 一文。
前置条件
使用 OBS 通过 RTMP 推送 HEVC 到 SRS,需要同时满足推流端、服务端与播放端的要求:
| 组件 | 版本要求 | 说明 |
|---|---|---|
| SRS | 6.0.42+(或最新 develop 分支) | 服务端需支持 Enhanced RTMP 中hvc1的解析与转封装 |
| OBS | 29.1+ | OBS 29.1 起支持通过 RTMP 输出 HEVC 编码流 |
| H5 播放器 | mpegts.js 1.7.3+ | SRS 已内置升级后的 mpegts.js,用于浏览器播放 HTTP-FLV/HTTP-TS |
| FFmpeg | 6.x | FFmpeg 6 原生支持通过 RTMP 读写 HEVC 流 |
注意:HEVC 软件编码器编码速度过慢,会导致画面明显卡顿,因此推荐在 OBS 中优先选择 HEVC 硬件编码器。
快速上手:Docker 启动 SRS 并推送 HEVC 流
第一步:启动 SRS
在仓库根目录下,使用官方 Docker 镜像启动 SRS 6,并加载 HEVC 直播专用配置:
docker run --rm -it -p 1935:1935 -p 8080:8080 ossrs/srs:6 \ ./objs/srs -c conf/hevc.flv.conf其中hevc.flv.conf位于仓库的 trunk/conf/hevc.flv.conf,完整内容如下:
max_connections 1000; daemon off; srs_log_tank console; # RTMP server configuration rtmp { listen 1935; } srt_server { enabled on; listen 10080; } http_api { enabled on; listen 1985; } http_server { enabled on; listen 8080; } vhost __defaultVhost__ { srt { enabled on; srt_to_rtmp on; } http_remux { enabled on; mount [vhost]/[app]/[stream].flv; } }对该配置的关键项逐一说明:
rtmp.listen 1935:RTMP 推流/拉流监听端口,OBS 将向此端口推流;srt_server:监听 10080 端口并开启srt_to_rtmp,即 SRT 流会被转封装为 RTMP 流,与 RTMP 推流共用同一路流媒体通道;http_api:开启 HTTP API(1985),用于查询流状态、流统计等管理接口;http_server:开启 HTTP 服务(8080),负责对外提供 HTTP-FLV 拉流与内置播放器页面;vhost __defaultVhost__ > http_remux:开启 HTTP 转封装(remux),mount [vhost]/[app]/[stream].flv定义了 HTTP-FLV 的访问路径模板,即http://<ip>:8080/live/livestream.flv将映射到应用live、流名livestream的流。
第二步:OBS 推流设置
打开 OBS 的Settings > Stream(设置 > 推流)选项卡,填写以下参数:
- Server(服务器):
rtmp://localhost/live - Stream Key(串流密钥):
livestream - Encoder(编码器):选择 HEVC 硬件编码器(如 Intel QSV、NVIDIA NVENC、AMD AMF 中的 H.265/HEVC 选项)
务必使用 HEVC硬件编码器。HEVC 软件编码器(如 x265)编码速度过慢,会造成推流帧率不足、画面卡顿。
第三步:浏览器播放验证
推流成功后,打开内置播放器页面播放 HTTP-FLV 直播流:
http://localhost:8080/players/srs_player.html
在播放器地址栏输入:
http://localhost:8080/live/livestream.flv即可看到 HEVC 直播画面。
如果需要播放 HLS、DASH 或 HTTP-TS 形态的流,只需在配置文件中对对应模块(如hls、dash、http_remux的 TS 挂载)启用即可,推流端无需任何改动——SRS 会在服务端完成从 RTMP 到各协议封装格式的转码与分发。
深入原理:SRS 如何识别并封装 HEVC-over-RTMP
两种 HEVC 视频 Tag 封装方式
在 SRS 源码中,HEVC 视频帧到 FLV 视频 Tag 的封装存在两套实现,均位于 srs_protocol_raw_avc.cpp:
mux_hevc2flv(非标准 CodecID=12 方案),见 L583-L624:
1bytes, FrameType | CodecID(CodecID = 12 表示 HEVC) 1bytes, AVCPacketType(沿用 AVC 的包类型语义) 3bytes, CompositionTime(CTS = PTS - DTS)该方案与国内 CDN 的 H.265-over-RTMP 实现一致,兼容性更贴近存量生态。
mux_hevc2flv_enhanced(Enhanced RTMP 标准方案),见 L626-L658:
1bytes, IsExHeader | FrameType | PacketType 4bytes, Video FourCC:HEVC = { 'h', 'v', 'c', '1' }这正是 Enhanced RTMP 规范定义的标准扩展头结构,OBS 29.1 推流采用的就是该格式。SRS 在生成 RTMP 序列头(Sequence Header)时,会将 HEVC 的 VPS/SPS/PPS 封装为hvc1扩展头数据包。
服务端如何判别 hvc1
SRS 在 FLV 视频 Tag 解析层同时兼容上述两种封装。核心逻辑位于 srs_kernel_codec.cpp 的SrsFlvVideo::hevc()(L353-L380):
- 读取首字节,若最高位
0x80未置位,则按传统结构取低 4 位 CodecID,判断是否为12(HEVC); - 若最高位置位(ExHeader),则进一步校验第 1~4 字节是否为
'h' 'v' 'c' '1'四个字符,命中即判定为 HEVC; acceptable()(L382-L424)还会对 FrameType、PacketType 的取值区间做合法性校验,仅接受 AVC、HEVC、AV1 三种编码。
跨协议转封装的统一出口
值得注意的是,mux_hevc2flv_enhanced并不仅服务于 RTMP 推流这一条链路,它同时也是 SRS 把其他协议的 HEVC 流统一转封装进 RTMP/FLV 的出口:
- 在 srs_app_srt_source.cpp 中,SRT 推流(对应配置中的
srt_to_rtmp on)的 VPS/SPS/PPS 序列头经mux_hevc2flv_enhanced封装为hvc1RTMP 序列头后送入流媒体管线; - 在 srs_app_rtc_source.cpp 中,WebRTC(Safari)推流的 HEVC 序列头同样以
hvc1形式转封装进 RTMP,并会抑制重复序列头,避免每个关键帧都触发 HLS 分片不连续标记。
这意味着:无论是 OBS 的 RTMP 推流、FFmpeg 的 SRT 推流,还是 Safari 的 WebRTC 推流,最终都能以统一的hvc1标准格式在 RTMP/HTTP-FLV 链路中分发,服务端架构高度收敛。
已知限制与后续规划
- RTMP(HEVC) → WebRTC 转封装尚未支持:SRS 已支持 Safari 通过 WebRTC 播放/推流 HEVC,但目前尚不支持把 RTMP 推入的 HEVC 流转换为 WebRTC 输出,官方正在推进中;
- 编码器性能要求高:OBS 的 HEVC 软件编码器编码速度过慢,会导致视频卡顿,务必使用硬件编码器;
- 播放端解码能力依赖硬件:浏览器(Chrome)通过 MSE 播放 HEVC 依赖 GPU 硬件解码,可在
chrome://gpu中搜索hevc验证当前环境是否具备解码能力。
结语
借助 Enhanced RTMP 规范与hvc1fourCC,OBS 29.1 与 SRS 6.0.42+ 打通了"OBS → RTMP → SRS → HTTP-FLV/HLS/DASH/HTTP-TS → 浏览器"的 HEVC 直播全链路。对运维与开发者而言,只需替换编码器为 HEVC 硬件编码器并升级 SRS 版本,即可在不改变既有 RTMP 架构的前提下享受到 H.265 带来的带宽成本优势。尽管 RTMP 到 WebRTC 的 HEVC 转换仍在推进中,但这一步已经是 HEVC 直播生态的重要里程碑。
如需进一步了解 SRS 在 HLS、DASH、SRT、WebRTC 等链路上的完整 HEVC 支持状态与踩坑指南,可继续阅读仓库内同系列的 H.265 直播流专题文档。
【免费下载链接】srsSRS is a simple, high-performance, AI-driven real-time media server supporting RTMP, WebRTC, HLS, HTTP-FLV, HTTP-TS, SRT, MPEG-DASH, and GB28181, with codec support for H.264, H.265, AV1, VP9, AAC, Opus, and G.711.项目地址: https://gitcode.com/GitHub_Trending/sr/srs
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考