我们要将设备通过私有通道输出到 H264 流,传给 OBS 等直播软件使用。为此,设计了上图所示的串流工具。
设计思路
私有通道通过 API 接口提供 H264 流,要传给 ffmpeg ,最简单的方法是通过进程间管道传输数据。这里 Dump 工具直接输出一帧帧符合 H264 ES(Annex B)格式的数据。
然后 ffmpeg 要输出标准协议的视频流给 OBS,最简单的协议是 RTP 组播,这样不需要安排服务器。比如 RTSP、RTMP 都需要配置 ffserver ,增加了系统的复杂性。用流文件格式,比如 FLV、TS,也需要 HTTP 服务器。
串流的工作(从裸的 H264 转换为 RTP/UDP)就交给 ffmpeg 完成了。下面来看看如何配置 ffmpeg。
串流配置
-fflags nobuffer | 不缓冲数据 | 减少延迟 |
-flags low_delay | 低延迟编码 | 减少延迟 |
-analyzeduration 10 | 分析输入最大时长 | 减少延迟 |
-probesize 3200 | 分析输入最大字节 | 减少延迟 |
-f h264 | 输入格式 | h264 裸流 |
-i pipe: | 输入源 | 从管道输入 |
-vcodec copy | 视频格式 | 仅拷贝输入,不转换格式 |
-f rtp | 输出格式 | RTP 协议封装 |
rtp://127.0.0.1:1234 | 输出目标 | 本地 udp 1234 端口 |
RTP 协议一般使用组播地址(224.0.2.0~238.255.255.255),但是我们的串流使用本地回环地址(127.0.0.1)单播就足够了,只有同一个设备的程序能够收到RTP数据。
ffmpeg 正常启动 RTP 串流后,会输出串流 RTP 的描述信息(称为 SDP),比如:
v=0
o=- 0 0 IN IP4 127.0.0.1
s=No Name
c=IN IP4 127.0.0.1
t=0 0
a=tool:libavformat LIBAVFORMAT_VERSION
m=video 1234 RTP/AVP 96
a=rtpmap:96 H264/90000
a=fmtp:96 packetization-mode=1; sprop-parameter-sets=Z0LAH42NUCSC2TZAAAADAEAAAA8jwiEagA==,aM4xsgA=; profile-level-id=42C01F
将这段信息保存到一个 sdp 文件中 (如:ffmpeg.sdp ),以备后用。
OBS 配置
在 OBS 中使用 RTP 流有两种方式:使用 VLC 视频源,使用媒体视频源。
VLC 视频源
使用 VLC 视频源需要先安装 VLC(Video Lan) 软件。另外,这种方式只在 OBS Windows 版本中支持。
媒体视频源
使用媒体视频源,本质上就是使用 OBS 内部集成的 ffmpeg 解码,因此 ffmpeg 支持的视频流,都能够用作 OBS 的视频源。
添加“媒体视频源”:
配置“媒体视频源”:
- 取消选择“本地文件”
- 输入 sdp URL(file:C:/ffmpeg.sdp)
- 输入 ffmpeg 选项:“protocol_whitelist=file,udp,rtp”(ffmpeg 默认不支持 file sdp,需要通过选项参数打开)
配置完成后,稍等一会儿就可以看到视频内容了。