通过 ffmpeg 串流对接 OBS 等直播软件

通过 ffmpeg 串流对接 OBS 等直播软件_第1张图片

我们要将设备通过私有通道输出到 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 的视频源。

添加“媒体视频源”:

通过 ffmpeg 串流对接 OBS 等直播软件_第2张图片

配置“媒体视频源”:

通过 ffmpeg 串流对接 OBS 等直播软件_第3张图片

  • 取消选择“本地文件”
  • 输入 sdp URL(file:C:/ffmpeg.sdp)
  • 输入 ffmpeg 选项:“protocol_whitelist=file,udp,rtp”(ffmpeg 默认不支持 file sdp,需要通过选项参数打开)

通过 ffmpeg 串流对接 OBS 等直播软件_第4张图片

配置完成后,稍等一会儿就可以看到视频内容了。 

通过 ffmpeg 串流对接 OBS 等直播软件_第5张图片

 

 

你可能感兴趣的:(音视频经验杂谈,ffmpeg)