直播流)
SRS 推流实战使用 OBS 通过 RTMP 推送 HEVCH.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 协议推送 HEVCH.265直播流涵盖 Enhanced RTMP 规范、hvc1fourCC 编解码标识、环境要求、Docker 部署、OBS 配置与 HTTP-FLV 播放的完整流程并结合 SRS 源码深入解析 HEVC-over-RTMP 的底层实现原理。读完本文你将掌握从 OBS 到 SRS 再到浏览器播放的 HEVC 直播全链路搭建能力。背景为什么 HEVC 需要新的 RTMP 封装方式HEVCH.265相比 H.264 在同等画质下可以节省约 50% 的带宽成本是 8K 直播等场景的必选编码。但传统 RTMP/FLV 规范video_file_format_spec_v10_1.pdf中定义的 Video Tag 仅支持 Sorenson H.263、Screen Video、VP6、H.264AVC等 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 以及 WebRTCSafari等链路支持 HEVC 直播本次 OBS 29.1 支持 HEVC-over-RTMP 之后RTMP 这条最主流的推流链路也正式打通具体能力清单可参见 H.265 直播流成本节约 50% 一文。前置条件使用 OBS 通过 RTMP 推送 HEVC 到 SRS需要同时满足推流端、服务端与播放端的要求组件版本要求说明SRS6.0.42或最新 develop 分支服务端需支持 Enhanced RTMP 中hvc1的解析与转封装OBS29.1OBS 29.1 起支持通过 RTMP 输出 HEVC 编码流H5 播放器mpegts.js 1.7.3SRS 已内置升级后的 mpegts.js用于浏览器播放 HTTP-FLV/HTTP-TSFFmpeg6.xFFmpeg 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 1935RTMP 推流/拉流监听端口OBS 将向此端口推流srt_server监听 10080 端口并开启srt_to_rtmp即 SRT 流会被转封装为 RTMP 流与 RTMP 推流共用同一路流媒体通道http_api开启 HTTP API1985用于查询流状态、流统计等管理接口http_server开启 HTTP 服务8080负责对外提供 HTTP-FLV 拉流与内置播放器页面vhost __defaultVhost__ http_remux开启 HTTP 转封装remuxmount [vhost]/[app]/[stream].flv定义了 HTTP-FLV 的访问路径模板即http://ip:8080/live/livestream.flv将映射到应用live、流名livestream的流。第二步OBS 推流设置打开 OBS 的Settings Stream设置 推流选项卡填写以下参数Server服务器rtmp://localhost/liveStream Key串流密钥livestreamEncoder编码器选择 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.cppmux_hevc2flv非标准 CodecID12 方案见 L583-L6241bytes, FrameType | CodecIDCodecID 12 表示 HEVC 1bytes, AVCPacketType沿用 AVC 的包类型语义 3bytes, CompositionTimeCTS PTS - DTS该方案与国内 CDN 的 H.265-over-RTMP 实现一致兼容性更贴近存量生态。mux_hevc2flv_enhancedEnhanced RTMP 标准方案见 L626-L6581bytes, IsExHeader | FrameType | PacketType 4bytes, Video FourCCHEVC { h, v, c, 1 }这正是 Enhanced RTMP 规范定义的标准扩展头结构OBS 29.1 推流采用的就是该格式。SRS 在生成 RTMP 序列头Sequence Header时会将 HEVC 的 VPS/SPS/PPS 封装为hvc1扩展头数据包。服务端如何判别 hvc1SRS 在 FLV 视频 Tag 解析层同时兼容上述两种封装。核心逻辑位于 srs_kernel_codec.cpp 的SrsFlvVideo::hevc()L353-L380读取首字节若最高位0x80未置位则按传统结构取低 4 位 CodecID判断是否为12HEVC若最高位置位ExHeader则进一步校验第 14 字节是否为h v c 1四个字符命中即判定为 HEVCacceptable()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 中WebRTCSafari推流的 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 规范与hvc1fourCCOBS 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),仅供参考