FFmpeg Protocols Documentation
设置实时模式下单次发送函数调用传输的数据包最大声明大小,文件模式下默认不使用(设为 0),默认值为 -1(自动,通常为 MPEG-TS)。每个值前缀为单个字符表示类型:B(布尔值)、N(数字)、S(字符串)、O(对象)、Z(空值),后跟冒号。该协议提供大多数客户端功能和部分服务器功能,支持 RTMP、HTTP 隧道传输的 RTMP(RTMPT)、加密 RTMP(RTMPE)、SSL/TLS 上的
目录
3.32 librtmp(rtmp、rtmpe、rtmps、rtmpt、rtmpte)
mode=caller|listener|rendezvous
1. 描述
本文档详细说明 libavformat 库提供的输入和输出协议。
2. 协议选项
libavformat 库提供部分通用全局选项,可应用于所有协议。此外,每个协议还支持特定于该组件的 “私有选项”。
可通过以下方式设置选项:
- 在 FFmpeg 工具中指定
-option value; - 在
AVFormatContext选项中显式设置值; - 编程使用时,通过 libavutil/opt.h API 进行设置。
支持的选项如下:
protocol_whitelist(输入)
设置以英文逗号分隔的允许使用的协议列表。"ALL" 表示匹配所有协议,前缀为 "-" 的协议表示禁用。默认情况下允许所有协议,但嵌套协议(被其他协议调用的协议)会受限于对应协议的子集。
3. 协议
协议是 FFmpeg 中经过配置的组件,用于访问需要特定协议的资源。
配置 FFmpeg 编译环境时,所有受支持的协议默认均已启用。可通过配置选项 --list-protocols 列出所有可用协议。
- 可使用配置选项
--disable-protocols禁用所有协议; - 可通过
--enable-protocol=PROTOCOL选择性启用特定协议; - 可通过
--disable-protocol=PROTOCOL禁用特定协议。
ff* 工具的 -protocols 选项会显示所有受支持的协议。
所有协议均接受以下选项:
rw_timeout
网络读写操作的最大等待时间,单位为微秒。
以下是当前可用协议的详细说明:
3.1 amqp
高级消息队列协议(AMQP)版本 0-9-1 是一种基于代理的发布 - 订阅通信协议。
FFmpeg 必须通过 --enable-librabbitmq 编译选项才能支持 AMQP,且需单独运行 AMQP 代理(开源示例为 RabbitMQ)。
启动代理后,FFmpeg 客户端可通过以下命令向代理推送流数据:
plaintext
ffmpeg -re -i input -f mpegts amqp://[[用户名]:[密码]@]主机名[:端口][/虚拟主机]
- 主机名和端口(默认 5672)为代理服务器地址;
- 可指定用户名 / 密码进行身份验证,默认均为 "guest";
- 虚拟主机名称可通过
vhost指定,默认值为 "/"。
多个订阅者可通过以下命令从代理拉取流数据:
ffplay amqp://[[用户名]:[密码]@]主机名[:端口][/虚拟主机]
在 RabbitMQ 中,所有推送到代理的数据都会通过特定交换机流转,每个订阅客户端会分配对应的队列 / 缓冲区。数据包到达交换机后,会根据交换机类型和路由键(routing_key)字段决定是否复制到客户端队列。
支持的选项:
exchange
设置代理使用的交换机。RabbitMQ 包含多个预定义交换机:
- "amq.direct"(默认):发布者和订阅者必须使用匹配的路由键;
- "amq.fanout":等同于广播操作,数据会转发到该交换机下的所有队列,与路由键无关;
- "amq.topic":类似 "amq.direct",但支持更复杂的模式匹配(详见 RabbitMQ 文档)。
routing_key
设置路由键,默认值为 "amqp"。在 "amq.direct" 和 "amq.topic" 交换机中,路由键用于决定是否将数据包写入订阅者队列。
pkt_size
发送 / 接收至代理的每个数据包的最大大小,默认值为 131072 字节,最小值为 4096 字节,最大值为任意大整数(int 类型可表示范围)。接收数据包时,该选项用于设置 FFmpeg 内部缓冲区大小,需大于或等于推送到代理的数据包大小,否则接收的消息可能被截断,导致解码错误。
connection_timeout
与代理建立初始连接的超时时间(单位:秒),默认值为 rw_timeout,若未设置 rw_timeout 则默认 5 秒。
delivery_mode(模式)
设置发送至代理的每条消息的投递模式,支持以下值:
persistent:投递模式设为 “持久化”(值为 2),默认值。消息可能会根据代理配置写入磁盘;non-persistent:投递模式设为 “非持久化”(值为 1)。消息仅存于代理内存,除非代理面临内存压力。
3.2 async
输入流的异步数据填充包装器。
在后台线程中填充数据,实现 I/O 操作与解复用线程解耦。
URL 格式:
async:URL
async:http://主机/资源
async:cache:http://主机/资源
3.3 bluray
读取蓝光光盘(BluRay)播放列表。
支持的选项:
angle
蓝光光盘角度
chapter
起始章节(1...N)
playlist
要读取的播放列表(路径格式:BDMV/PLAYLIST/?????.mpls)
示例:
- 读取挂载到 /mnt/bluray 的蓝光光盘中最长的播放列表:
bluray:/mnt/bluray - 读取挂载到 /mnt/bluray 的蓝光光盘中播放列表 4 的角度 2,从第 2 章节开始:
-playlist 4 -angle 2 -chapter 2 bluray:/mnt/bluray
3.4 cache
输入流的缓存包装器。
将输入流缓存到临时文件,为直播流提供 seek(定位)能力。
支持的选项:
read_ahead_limit
当不支持 seek 时的预读字节数,范围为 -1 到 INT_MAX。-1 表示无限制,默认值为 65536 字节。
URL 格式:
cache:URL
3.5 concat
物理拼接协议。
按顺序读取和定位多个资源,如同操作单个资源。
该协议支持的 URL 格式:
concat:URL1|URL2|...|URLN
其中 URL1、URL2、...、URLN 为待拼接资源的 URL,每个 URL 可指定不同协议。
示例:使用 ffplay 读取 split1.mpeg、split2.mpeg、split3.mpeg 三个文件的拼接流:
ffplay concat:split1.mpeg\|split2.mpeg\|split3.mpeg
注意:由于 "|" 字符在多数 Shell 中具有特殊含义,可能需要进行转义。
3.6 concatf
基于换行符分隔的资源列表的物理拼接协议。
按顺序读取和定位多个资源,如同操作单个资源。
该协议支持的 URL 格式:
concatf:URL
其中 URL 指向一个文件,该文件包含以换行符分隔的待拼接资源列表,每个资源可指定不同协议。特殊字符需使用反斜杠或单引号转义(详见 ffmpeg-utils (1) 手册中的 “引用与转义” 章节)。
示例:split.txt 文件中按行列出 split1.mpeg、split2.mpeg、split3.mpeg,使用 ffplay 读取拼接流:
ffplay concatf:split.txt
split.txt 内容:
split1.mpeg
split2.mpeg
split3.mpeg
3.7 crypto
AES 加密流读取协议。
支持的选项:
key
通过十六进制字符串设置 AES 解密密钥二进制块。
iv
通过十六进制字符串设置 AES 解密初始化向量(IV)二进制块。
支持的 URL 格式:
crypto:URL
crypto+URL
3.8 data
URI 内嵌数据协议(详见 http://en.wikipedia.org/wiki/Data_URI_scheme)。
示例:使用 ffmpeg 转换内嵌的 GIF 文件:
ffmpeg -i "data:image/gif;base64,R0lGODdhCAAIAMIEAAAAAAAA//8AAP//AP///////////////ywAAAAACAAIAAADF0gEDLojDgdGiJdJqUX02iB4E8Q9jUMkADs=" smiley.png
3.9 fd
文件描述符访问协议。
支持的语法:
fd: -fd file_descriptor
若未指定文件描述符,默认情况下:写入操作使用标准输出(stdout)文件描述符,读取操作使用标准输入(stdin)文件描述符。与管道(pipe)协议不同,若文件描述符对应常规文件,fd 协议支持 seek 操作。为安全起见,fd 协议不支持通过 URL 传递文件描述符。
支持的选项:
blocksize
设置 I/O 操作的最大块大小(单位:字节),默认值为 INT_MAX(不限制请求的块大小)。将该值设置为合理的较小值可提升用户终止请求的响应速度,适用于数据传输较慢的场景。
fd
设置文件描述符。
3.10 file
文件访问协议。
用于读取或写入本地文件。
文件 URL 格式:
plaintext
file:filename
未指定协议前缀的 URL 会被视为文件 URL。根据编译环境,类似 Windows 路径(以盘符开头)的 URL 也可能被视为文件 URL(类 Unix 系统编译版本通常不支持此规则)。
示例:使用 ffmpeg 读取 input.mpeg 文件:
plaintext
ffmpeg -i file:input.mpeg output.mpeg
支持的选项:
truncate
写入时是否截断已有文件,1 表示截断,0 表示不截断,默认值为 1。
blocksize
设置 I/O 操作的最大块大小(单位:字节),默认值为 INT_MAX(不限制请求的块大小)。将该值设置为合理的较小值可提升用户终止请求的响应速度,适用于慢速存储介质上的文件。
follow
若设置为 1,协议会在文件末尾重试读取操作,支持读取正在被写入的文件。需通过 rw_timeout 选项或中断回调(API 用户)设置终止条件。
seekable
控制是否声明文件支持 seek 操作:0 表示不支持,-1 表示自动判断(常规文件支持,命名管道不支持)。许多解复用器对支持和不支持 seek 的资源处理方式不同,修改此选项可能加快部分文件的打开速度,但可能会丢失精确 seek 等功能。
3.11 ftp
文件传输协议(FTP),用于读取或写入远程资源。
URL 语法:
ftp://[user[:password]@]server[:port]/path/to/remote/resource.mpeg
支持的选项:
timeout
设置底层套接字 I/O 操作的超时时间(单位:微秒),默认值为 -1(不指定超时时间)。
ftp-user
设置 FTP 服务器认证用户名,会被 URL 中的用户名覆盖。
ftp-password
设置 FTP 服务器认证密码,会被 URL 中的密码或 ftp-anonymous-password(未指定用户名时)覆盖。
ftp-anonymous-password
匿名登录时使用的密码,通常应填写电子邮件地址。
ftp-write-seekable
编码期间控制连接的 seek 能力:1 表示资源支持 seek,0 表示不支持,默认值为 0。
注意:该协议可作为输出协议使用,但不建议这么做,除非经过充分测试或自定义服务器配置。不同 FTP 服务器对 seek 操作的处理方式不同,ff* 工具可能因服务器限制生成不完整内容。
3.12 gopher
Gopher 协议。
3.13 gophers
基于 TLS 封装的 Gopher 协议。
3.14 hls
将符合 Apple HTTP Live Streaming 标准的分段流作为统一流读取。描述分段的 M3U8 播放列表可以是远程 HTTP 资源或本地文件(通过标准文件协议访问)。可通过在 hls URI 方案后指定 "+proto" 声明嵌套协议,其中 proto 为 "file" 或 "http"。
URL 示例:
hls+http://host/path/to/remote/resource.m3u8
hls+file://path/to/local/resource.m3u8
不建议使用该协议:hls 解复用器功能更完整(若使用中遇到问题,请反馈)。如需使用 hls 解复用器,直接使用 M3U8 文件的 URL 即可。
3.15 http
超文本传输协议(HTTP)。
支持的选项:
seekable
控制连接的 seek 能力:1 表示支持,0 表示不支持,-1 表示自动检测,默认值为 -1。
chunked_post
是否使用分块传输编码(chunked Transfer-Encoding)进行 POST 请求,默认值为 1。
http_proxy
设置用于隧道传输的 HTTP 代理,示例:http://example.com:1234。
headers
设置自定义 HTTP 头,可覆盖内置默认头。值为编码后的头信息字符串。
content_type
为 POST 消息或监听模式设置特定的内容类型。
user_agent
覆盖 User-Agent 头,未指定时使用 libavformat 编译信息字符串(格式:"Lavf/<版本号>")。
referer
设置 Referer 头,在 HTTP 请求中包含 "Referer: URL" 头信息。
multiple_requests
是否使用持久连接,1 表示使用,默认值为 0。
post_data
设置自定义 HTTP POST 数据。
mime_type
导出 MIME 类型。
http_version
导出 HTTP 响应版本号,通常为 "1.0" 或 "1.1"。
cookies
设置后续请求中发送的 Cookie,每个 Cookie 格式与 Set-Cookie HTTP 响应字段值一致,多个 Cookie 以换行符分隔。
icy
是否向服务器请求 ICY(SHOUTcast)元数据,默认值为 1。若服务器支持,应用需通过读取 icy_metadata_headers 和 icy_metadata_packet 选项获取元数据。
icy_metadata_headers
若服务器支持 ICY 元数据,该选项包含 ICY 特定的 HTTP 响应头,以换行符分隔。
icy_metadata_packet
若服务器支持 ICY 元数据且 icy 设为 1,该选项包含服务器发送的最后一个非空元数据数据包。关注流中元数据更新的应用需定期轮询该选项。
metadata
设置导出字典,包含码流中的 Icecast 元数据(若存在),仅适用于 C API。
auth_type
设置 HTTP 认证类型(不支持 Digest 认证,因该方式需先从服务器获取 nonce 参数,无法直接使用):
- none:自动选择认证类型,默认值;
- basic:使用 HTTP 基本认证。
注意:基本认证会发送包含用户名和密码的 Base64 编码字符串,Base64 并非加密方式,等同于明文传输。若资源需要保护,强烈建议使用其他认证方案,并结合 HTTPS/TLS。未采取额外安全措施时,不应使用基本认证保护敏感或重要信息。
send_expect_100
是否为 POST 请求发送 Expect: 100-continue 头:1 表示发送,0 表示不发送,-1 表示按需发送,默认值为 -1。
location
导出包含内容位置的字典,仅适用于 C API。
offset
设置初始字节偏移量。
end_offset
限制请求数据的字节偏移量上限(仅请求该偏移量之前的数据)。
method
- 作为客户端选项时:设置 HTTP 请求方法;
- 作为服务器选项时:设置期望客户端使用的 HTTP 方法。若客户端请求方法不匹配,返回 400 Bad Request 响应。未设置时暂不校验,未来将替换为自动检测。
reconnect
断开连接(未到达 EOF)时自动重连。
reconnect_at_eof
若设置为 1,将 EOF 视为错误并触发重连,适用于直播 / 无限流。
reconnect_on_network_error
TCP/TLS 连接过程中发生错误时自动重连。
reconnect_on_http_error
以逗号分隔的 HTTP 状态码列表,遇到列表中的状态码时触发重连,支持具体状态码(如 '503')或状态码段(如 '4xx'/'5xx')。
reconnect_streamed
若设置为 1,即使是流式 / 不支持 seek 的流,发生错误时也会重连。
reconnect_delay_max
设置重连的最大延迟时间(单位:秒),超过后停止重连。
reconnect_max_retries
设置最大重连次数,默认未设置。
reconnect_delay_total_max
设置重连的总最大延迟时间(单位:秒),超过后停止重连。
respect_retry_after
若启用,遇到 Retry-After 头时,将按照头中指定的延迟时间重连,而非使用指数退避策略,适用于 429 和 503 错误,默认启用。
listen
- 设置为 1:启用实验性 HTTP 服务器,作为输出选项时可发送数据,作为输入选项时可通过 HTTP POST 接收客户端数据;
- 设置为 2:启用实验性多客户端 HTTP 服务器(暂未在 ffmpeg.c 中实现,不可作为命令行选项使用)。
# Server side (sending):
ffmpeg -i somefile.ogg -c copy -listen 1 -f ogg http://server:port
# Client side (receiving):
ffmpeg -i http://server:port -c copy somefile.ogg
# Client can also be done with wget:
wget http://server:port -O somefile.ogg
# Server side (receiving):
ffmpeg -listen 1 -i http://server:port -c copy somefile.ogg
# Client side (sending):
ffmpeg -i somefile.ogg -chunked_post 0 -c copy -f ogg http://server:port
# Client can also be done with wget:
wget --post-file=somefile.ogg http://server:port
resource
启用实验性 HTTP 服务器时,客户端请求的资源路径。
reply_code
启用实验性 HTTP 服务器时,返回给客户端的 HTTP 状态码。
short_seek_size
设置阈值(单位:字节),当 seek 操作的字节数小于该阈值时,优先使用预读而非重新发起 HTTP 请求。例如,确保大视频数据包之间的小音频数据包使用同一连接读取。
3.15.1 HTTP Cookie
部分 HTTP 请求需要携带 Cookie 才能正常访问,cookies 选项可用于指定这些 Cookie。每个 Cookie 至少需包含值、路径(path)和域名(domain)。匹配该域名和路径的 HTTP 请求会自动在 Cookie 头中包含对应的 Cookie 值,多个 Cookie 以换行符分隔。
指定 Cookie 播放流的示例:
ffplay -cookies "nlqptid=nltid=tsn; path=/; domain=somedomain.com;" http://somedomain.com/somestream.m3u8
3.16 Icecast
Icecast 协议(向 Icecast 服务器推流)。
支持的选项:
ice_genre
设置流的类型(genre)。
ice_name
设置流的名称。
ice_description
设置流的描述信息。
ice_url
设置流的网站 URL。
ice_public
设置流是否公开,默认值为 0(不公开)。
user_agent
覆盖 User-Agent 头,未指定时使用格式为 "Lavf/<版本号>" 的字符串。
password
设置 Icecast 挂载点密码。
content_type
设置流的内容类型,若与 audio/mpeg 不同则必须指定。
legacy_icecast
启用对 Icecast 2.4.0 以下版本的支持(这些版本不支持 HTTP PUT 方法,仅支持 SOURCE 方法)。
tls
通过 TLS(HTTPS)连接 Icecast 服务器。
icecast://[username[:password]@]server:port/mountpoint
3.17 ipfs
星际文件系统(IPFS)协议支持。可通过所谓的 “网关”(HTTP/HTTPS 端点)访问 IPFS 网络上存储的文件。该协议对 IPFS 原生协议(ipfs:// 和 ipns://)进行封装,使其可通过网关访问。用户可(且建议)部署本地节点,通过本地网关访问 IPFS 网络文件。
支持的选项:
gateway
指定使用的网关。未设置时,协议会按以下顺序查找本地网关:$IPFS_GATEWAY 环境变量、$IPFS_PATH 环境变量、$HOME/.ipfs/ 目录。
使用方式:
- 通过 IPFS 协议:
ffplay ipfs://<hash>
- 通过 IPNS 协议(IPNS 为可变 IPFS):
ffplay ipns://<hash>
3.18 mmst
基于 TCP 的微软媒体服务器(MMS)协议。
3.19 mmsh
基于 HTTP 的微软媒体服务器(MMS)协议。
URL 语法:
mmsh://server[:port][/app][/playpath]
3.20 md5
MD5 输出协议。
计算待写入数据的 MD5 哈希值,关闭时将哈希值写入指定输出目标(未指定时输出到标准输出)。可用于测试复用器,无需写入实际文件。
示例:
- 将编码后的 AVI 文件的 MD5 哈希值写入 output.avi.md5:
ffmpeg -i input.flv -f avi -y md5:output.avi.md5 - 将编码后的 AVI 文件的 MD5 哈希值输出到标准输出:
ffmpeg -i input.flv -f avi -y md5:
注意:部分格式(通常为 MOV)要求输出协议支持 seek,因此无法与 MD5 输出协议配合使用。
3.21 pipe
UNIX 管道访问协议。
用于读取或写入 UNIX 管道。
支持的语法:
pipe:[number]
若未指定编号,默认情况下:写入操作使用标准输出(stdout,编号 1),读取操作使用标准输入(stdin,编号 0)。编号对应管道的文件描述符。
示例:
- 使用
ffmpeg从标准输入读取数据:plaintext
cat test.wav | ffmpeg -i pipe:0 # 等同于: cat test.wav | ffmpeg -i pipe: - 使用
ffmpeg向标准输出写入数据:plaintext
ffmpeg -i test.wav -f avi pipe:1 | cat > test.avi # 等同于: ffmpeg -i test.wav -f avi pipe: | cat > test.avi
支持的选项:
blocksize
设置 I/O 操作的最大块大小(单位:字节),默认值为 INT_MAX(不限制请求的块大小)。将该值设置为合理的较小值可提升用户终止请求的响应速度,适用于数据传输较慢的场景。
fd
设置文件描述符。
注意:部分格式(通常为 MOV)要求输出协议支持 seek,因此无法与管道输出协议配合使用。
3.22 prompeg
Pro-MPEG 实践规范 #3 版本 2 前向纠错(FEC)协议。
Pro-MPEG CoP#3 FEC 是一种基于 2D 奇偶校验的前向纠错机制,适用于通过 RTP 传输的 MPEG-2 传输流。
该协议必须与 rtp_mpegts 复用器和 rtp 协议配合使用。
URL 语法:
-f rtp_mpegts -fec prompeg=option=val... rtp://hostname:port
目标 UDP 端口规则:
- 列 FEC 流:
端口 + 2; - 行 FEC 流:
端口 + 4。
支持的选项:
l=n
列数(4-20,且 L×D ≤ 100)
d=n
行数(4-20,且 L×D ≤ 100)
使用示例:
plaintext
-f rtp_mpegts -fec prompeg=l=8:d=4 rtp://hostname:port
3.23 rist
可靠互联网流传输协议(Reliable Internet Streaming Transport)。
支持的选项:
rist_profile
支持的值:
simple:简单模式;main:主模式(默认);advanced:高级模式。
buffer_size
设置用于数据重传的内部 RIST 缓冲区大小(单位:毫秒),默认值为 0(使用 librist 默认值 1 秒),最大值为 30 秒。
fifo_size
设置 librist 接收端输出队列的数据包数量,必须为 2 的幂,默认值为 8192(librist 默认值为 1024)。
overrun_nonfatal=1|0
是否在 librist 队列缓冲区溢出时继续运行,默认值为 0。
pkt_size
设置发送数据的最大数据包大小,默认值为 1316 字节。
log_level
设置 RIST 日志消息的日志级别,仅在需要启用调试级消息或数据包丢失模拟时设置,否则使用常规日志级别。
secret
设置加密密钥(覆盖默认值),默认未设置。
encryption
设置加密类型,默认禁用,支持值为 128 和 256。
3.24 rtmp
实时消息协议(Real-Time Messaging Protocol)。
用于通过 TCP/IP 网络流式传输多媒体内容。
URL 语法:
plaintext
rtmp://[username:password@]server[:port][/app][/instance][/playpath]
支持的参数:
用户名(username)
可选,主要用于发布流。
密码(password)
可选,主要用于发布流。
服务器(server)
RTMP 服务器地址。
端口(port)
TCP 端口号,默认 1935。
应用(app)
要访问的应用名称,通常对应 RTMP 服务器上的应用安装路径(如 /ondemand/、/flash/live/ 等),也可通过 rtmp_app 选项覆盖 URI 中解析的值。
播放路径(playpath)
相对于 app 中指定应用的资源路径或名称,可前缀 "mp4:",也可通过 rtmp_playpath 选项覆盖 URI 中解析的值。
listen
作为服务器运行,监听传入连接。
timeout
等待传入连接的最大时间(单位:秒),启用后自动开启 listen 模式。
额外可通过命令行选项(或代码中通过 AVOption)设置的参数:
rtmp_app
设置连接 RTMP 服务器时使用的应用名称,覆盖 URI 中指定的参数。
rtmp_buffer
设置客户端缓冲区时间(单位:毫秒),默认值为 3000。
rtmp_conn
额外的任意 AMF 连接参数,通过字符串解析,示例:B:1 S:authMe O:1 NN:code:1.23 NS:flag:ok O:0。每个值前缀为单个字符表示类型:B(布尔值)、N(数字)、S(字符串)、O(对象)、Z(空值),后跟冒号。布尔值必须为 0(FALSE)或 1(TRUE);对象需用 0(结束)或 1(开始)标识;子对象中的数据项可命名(前缀加 'N',格式:NB:myFlag:1)。该选项可多次使用以构建任意 AMF 序列。
rtmp_enhanced_codecs
指定客户端在增强型 RTMP 流中声明支持的编解码器列表,值为逗号分隔的 FourCC 码,示例:hvc1,av01,vp09(多个编解码器)或 hvc1(单个编解码器)。指定的列表会在 Connect 命令消息的 "fourCcLive" 属性中传递。
rtmp_flashver
运行 SWF 播放器的 Flash 插件版本,默认值为 LNX 9,0,124,2(发布流时默认值为 FMLE/3.0 (compatible; <libavformat 版本号>))。
rtmp_flush_interval
同一请求中刷新的数据包数量(仅适用于 RTMPT),默认值为 10。
rtmp_live
指定媒体为直播流(直播流不支持续播或 seek),默认值为 any(订阅者先尝试播放 playpath 指定的直播流,未找到则播放录制流),其他支持值:live(仅直播流)、recorded(仅录制流)。
rtmp_pageurl
媒体嵌入的网页 URL,默认不发送。
rtmp_playpath
设置要播放或发布的流标识符,覆盖 URI 中指定的参数。
rtmp_subscribe
设置要订阅的直播流名称,默认不发送,仅在指定该选项或 rtmp_live 设为 live 时发送。
rtmp_swfhash
解压缩后 SWF 文件的 SHA256 哈希值(32 字节)。
rtmp_swfsize
解压缩后 SWF 文件的大小(用于 SWF 验证)。
rtmp_swfurl
媒体对应的 SWF 播放器 URL,默认不发送。
rtmp_swfverify
播放器 SWF 文件的 URL,自动计算哈希值和大小。
rtmp_tcurl
目标流的 URL,默认值为 proto://host [:port]/app。
tcp_nodelay=1|0
是否设置 TCP_NODELAY 以禁用 Nagle 算法,默认值为 0。
注意:当前套接字写入未优化以减少系统调用,可能降低 TCP_NODELAY 的效率。
示例:
- 使用
ffplay从 RTMP 服务器 myserver 的应用 vod 中读取名为 sample 的多媒体资源:ffplay rtmp://myserver/vod/sample - 向受密码保护的服务器发布流,单独指定 playpath 和 app 名称:
ffmpeg -re -i <输入> -f flv -rtmp_playpath some/long/path -rtmp_app long/app/name rtmp://用户名:密码@myserver/
3.25 rtmpe
加密实时消息协议(Encrypted Real-Time Messaging Protocol)。
基于标准加密原语(Diffie-Hellman 密钥交换和 HMACSHA256),生成一对 RC4 密钥,用于流式传输多媒体内容。
3.26 rtmps
基于安全 SSL 连接的实时消息协议(Real-Time Messaging Protocol over SSL)。
通过加密连接流式传输多媒体内容。
3.27 rtmpt
通过 HTTP 隧道传输的实时消息协议(Real-Time Messaging Protocol tunneled through HTTP)。
将多媒体内容封装在 HTTP 请求中传输,以穿透防火墙。
3.28 rtmpte
通过 HTTP 隧道传输的加密实时消息协议(Encrypted Real-Time Messaging Protocol tunneled through HTTP)。
将加密的多媒体内容封装在 HTTP 请求中传输,以穿透防火墙。
3.29 rtmpts
通过 HTTPS 隧道传输的实时消息协议(Real-Time Messaging Protocol tunneled through HTTPS)。
将多媒体内容封装在 HTTPS 请求中传输,以穿透防火墙。
3.30 libsmbclient
通过 libsmbclient 操作 CIFS/SMB 网络资源。
URL 语法:
smb://[[domain:]user[:password@]]server[/share[/path[/file]]]
支持的选项:
timeout
设置底层套接字 I/O 操作的超时时间(单位:毫秒),默认值为 -1(不指定超时时间)。
truncate
写入时是否截断已有文件,1 表示截断,0 表示不截断,默认值为 1。
workgroup
设置连接使用的工作组,默认未指定。
3.31 libssh
通过 libssh 实现的安全文件传输协议(SFTP)。
用于读取或写入远程资源。
URL 语法:
sftp://[user[:password]@]server[:port]/path/to/remote/resource.mpeg
支持的选项:
timeout
设置底层套接字 I/O 操作的超时时间,默认值为 -1(不指定超时时间)。
truncate
写入时是否截断已有文件,1 表示截断,0 表示不截断,默认值为 1。
private_key
指定身份验证时使用的私钥文件路径,默认 libssh 会在~/.ssh/ 目录中搜索密钥。
示例:播放远程服务器上的文件:
ffplay sftp://user:password@server_address:22/home/user/resource.mpeg
3.32 librtmp(rtmp、rtmpe、rtmps、rtmpt、rtmpte)
通过 librtmp 支持的实时消息协议及其变体。
编译配置时需确保存在 librtmp 头文件和库,需显式通过 --enable-librtmp 配置编译,启用后将替代原生 RTMP 协议。
该协议提供大多数客户端功能和部分服务器功能,支持 RTMP、HTTP 隧道传输的 RTMP(RTMPT)、加密 RTMP(RTMPE)、SSL/TLS 上的 RTMP(RTMPS)以及这些加密类型的隧道变体(RTMPTE、RTMPTS)。
rtmp_proto://server[:port][/app][/playpath] options
其中:
- rtmp_proto 为协议变体字符串,可选值:"rtmp"、"rtmpt"、"rtmpe"、"rtmps"、"rtmpte"、"rtmpts";
- 服务器(server)、端口(port)、应用(app)、播放路径(playpath)含义与原生 RTMP 协议一致;
- 选项(options)为空格分隔的键值对(格式:key=val)。
更多信息详见 librtmp 手册(man 3 librtmp)。
示例:
- 使用
ffmpeg向 RTMP 服务器实时推送文件:plaintext
ffmpeg -re -i myfile -f flv rtmp://myserver/live/mystream - 使用
ffplay播放上述流:plaintext
ffplay "rtmp://myserver/live/mystream live=1"
3.33 rtp
实时传输协议(Real-time Transport Protocol)。
rtp://hostname[:port][?options]
- 端口(port):指定 RTP 端口;
- 选项(options):& 分隔的键值对(格式:key=val)。
支持的 URL 选项:
ttl=n
设置 TTL(生存时间)值(仅适用于多播)。
rtcpport=n
设置远程 RTCP 端口为 n。
localrtpport=n
设置本地 RTP 端口为 n。
localrtcpport=n
设置本地 RTCP 端口为 n。
pkt_size=n
设置最大数据包大小(单位:字节)为 n。
buffer_size=size
设置 UDP 套接字最大缓冲区大小(单位:字节)。
connect=0|1
是否对 UDP 套接字执行 connect() 操作(1 表示执行,0 表示不执行)。
sources=ip[,ip]
允许的源 IP 地址列表。
block=ip[,ip]
禁止(阻塞)的源 IP 地址列表。
write_to_source=0|1
发送数据包的目标地址:1 表示发送至最近接收数据包的源地址,0 表示发送至默认远程地址。
localport=n
设置本地 RTP 端口为 n(已废弃,建议使用 localrtpport)。
localaddr=addr
用于发送数据包或加入多播组的网络接口本地 IP 地址。
timeout=n
设置套接字 I/O 操作的超时时间(单位:微秒)为 n。
重要说明:
- 若未设置 rtcpport,RTCP 端口默认为 RTP 端口 + 1;
- 若未设置 localrtpport(本地 RTP 端口),将使用任意可用端口作为本地 RTP 和 RTCP 端口;
- 若未设置 localrtcpport(本地 RTCP 端口),默认为本地 RTP 端口 + 1。
3.34 rtsp
实时流传输协议(Real-Time Streaming Protocol)。
RTSP 在 libavformat 中并非严格意义上的协议处理器,而是复用器和解复用器:
- 解复用器支持标准 RTSP(数据通过 RTP 传输,如 Apple、Microsoft 使用)和 Real-RTSP(数据通过 RDT 传输);
- 复用器可通过 RTSP ANNOUNCE 命令向支持的服务器(目前支持 Darwin Streaming Server 和 Mischa Spiegelmock 的 RTSP 服务器)推送流。
rtsp://hostname[:port]/path
选项可通过 ffmpeg/ffplay 命令行设置,或在代码中通过 AVOption 或 avformat_open_input 设置。
3.34.1 复用器
支持的选项:
rtsp_transport
设置 RTSP 传输协议,支持值:
udp:使用 UDP 作为底层传输协议;tcp:使用 TCP(RTSP 控制通道内交织传输)作为底层传输协议;默认值为0。
rtsp_flags
设置 RTSP 标志,支持值:
latm:AAC 采用 MP4A-LATM 打包方式,而非 MPEG4-GENERIC;rfc2190:H.263 采用 RFC 2190 打包方式,而非 RFC 4629;skip_rtcp:不发送 RTCP 发送方报告;h264_mode0:H.264 在 RTP 中使用模式 0;send_bye:结束时发送 RTCP BYE 数据包;默认值为0。
min_port
设置本地 UDP 端口最小值,默认值为 5000。
max_port
设置本地 UDP 端口最大值,默认值为 65000。
buffer_size
设置套接字最大缓冲区大小(单位:字节)。
pkt_size
设置最大发送数据包大小(单位:字节),默认值为 1472。
3.34.2 解复用器
支持的选项:
initial_pause
若设置为 1,流不会立即开始播放,默认值为 0。
rtsp_transport
设置 RTSP 传输协议,支持值:
udp:使用 UDP 作为底层传输协议;tcp:使用 TCP(RTSP 控制通道内交织传输)作为底层传输协议;udp_multicast:使用 UDP 多播作为底层传输协议;http:使用 HTTP 隧道传输(适用于穿透代理);https:使用 HTTPS 隧道传输(适用于穿透代理,且安全性更高)。
可指定多个底层传输协议,按顺序尝试(若某一协议设置失败,自动尝试下一个)。复用器仅支持 tcp 和 udp 选项。
rtsp_flags
设置 RTSP 标志,支持值:
filter_src:仅接收来自协商的对等方地址和端口的数据包;listen:作为服务器运行,监听传入连接;prefer_tcp:优先尝试使用 TCP 进行 RTP 传输(若 TCP 作为 RTSP RTP 传输可用);satip_raw:导出原始 MPEG-TS 流,不进行解复用(保留原始 PAT/PMT/PID);默认值为none。
allowed_media_types
设置从服务器接收的媒体类型,支持标志:video(视频)、audio(音频)、data(数据)、subtitle(字幕),默认接收所有媒体类型。
min_port
设置本地 UDP 端口最小值,默认值为 5000。
max_port
设置本地 UDP 端口最大值,默认值为 65000。
listen_timeout
设置建立初始连接的最大超时时间(单位:秒),设置后自动开启 listen 模式,默认值为 -1(listen 模式下无限超时)。
reorder_queue_size
设置用于处理乱序数据包的缓冲区数据包数量。
timeout
设置套接字 TCP I/O 超时时间(单位:微秒)。
user_agent
覆盖 User-Agent 头,未指定时使用 libavformat 标识字符串。
buffer_size
设置套接字最大缓冲区大小(单位:字节)。
通过 UDP 接收数据时,解复用器会尝试对接收的数据包重新排序(因数据包可能乱序到达或丢失),可通过将 AVFormatContext 的 max_delay 字段设为 0 禁用该功能。
使用 ffplay 观看多码率 Real-RTSP 流时,可通过 -vst n(视频)和 -ast n(音频)选择要播放的流,并可通过按 v 和 a 键实时切换。
3.34.3 示例
以下示例均使用 ffplay 和 ffmpeg 工具:
- 通过 UDP 观看流,最大重排序延迟为 0.5 秒:
ffplay -max_delay 500000 -rtsp_transport udp rtsp://server/video.mp4 - 通过 HTTP 隧道观看流:
ffplay -rtsp_transport http rtsp://server/video.mp4 - 向 RTSP 服务器实时推送流(供他人观看):
ffmpeg -re -i input -f rtsp -muxdelay 0.1 rtsp://server/live.sdp - 实时接收流:
ffmpeg -rtsp_flags listen -i rtsp://ownaddress/live.sdp output
3.35 sap
会话通知协议(Session Announcement Protocol,RFC 2974)。
在 libavformat 中并非严格意义上的协议处理器,而是复用器和解复用器,用于 RTP 流的信令传输,通过在独立端口定期广播流的 SDP 信息实现。
3.35.1 Muxer
复用器支持的 SAP URL 语法:
sap://destination[:port][?options]
- RTP 数据包发送至目标地址的指定端口,未指定端口时默认 5004;
- 选项(options)为 & 分隔的键值对。
支持的选项:
announce_addr = 地址
指定发送通知的目标 IP 地址,未指定时:
- IPv4 地址默认发送至 SAP 通知多播地址 224.2.127.254(sap.mcast.net);
- IPv6 地址默认发送至 ff0e::2:7ffe。
announce_port = 端口
指定发送通知的端口,默认值为 9875。
ttl=ttl
设置通知和 RTP 数据包的 TTL 值,默认值为 255。
same_port=0|1
- 1:所有 RTP 流使用同一端口对;
- 0(默认):所有流使用唯一端口,每个流的端口比前一个大 2。
注意:VLC/Live555 要求设置为 1 才能接收流;libavformat 的 RTP 接收栈要求所有流使用唯一端口。
示例:
- 向本地子网广播流(供 VLC 观看):
ffmpeg -re -i input -f sap sap://224.0.0.255?same_port=1 - 向本地子网广播流(供
ffplay观看):ffmpeg -re -i input -f sap sap://224.0.0.255 - 通过 IPv6 向本地子网广播流(供
ffplay观看):ffmpeg -re -i input -f sap sap://[ff0e::1:2:3:4]
3.35.2 解复用器
解复用器支持的 SAP URL 语法:
sap://[address][:port]
- 地址(address):监听通知的多播地址,未指定时默认 224.2.127.254(sap.mcast.net);
- 端口(port):监听端口,未指定时默认 9875。
解复用器在指定地址和端口监听通知,收到通知后尝试接收对应的流。
示例:
- 播放默认 SAP 多播地址上的第一个通知流:
ffplay sap:// - 播放默认 IPv6 SAP 多播地址上的第一个通知流:
ffplay sap://[ff0e::2:7ffe]
3.36 sctp
流控制传输协议(Stream Control Transmission Protocol)。
sctp://host:port[?options]
支持的选项:
listen
若设置为任意值,监听传入连接(默认行为为发起出站连接)。
max_streams
设置最大流数量,默认无限制。
3.37 srt
通过 libsrt 实现的 Haivision 安全可靠传输协议(Secure Reliable Transport)。
支持的 URL 语法:
srt://hostname:port[?options]
(选项为 & 分隔的键值对,格式:key=val)或
选项 srt://主机名:端口
(选项为 "-key val" 格式的键值对)
支持的选项:
connect_timeout = 毫秒
连接超时时间。默认连接超时为 3 秒,SRT 在 RTT > 1500 毫秒(2 次握手交换)时无法连接。该选项适用于调用方(caller)和会合(rendezvous)连接模式,会合模式下连接超时为该值的 10 倍(可作为早期版本连接问题的解决方法)。
ffs = 字节
飞行标志大小(窗口大小),单位为字节。FFS 为内部参数,需不小于 recv_buffer_size 和 mss,默认值较大,除非设置了非常大的接收缓冲区,否则无需修改,默认值为 25600。
inputbw = 字节 / 秒
发送方标称输入速率,单位为字节 / 秒。当 maxbw 设置为相对值(0)时,与 oheadbw 配合计算最大发送速率(含恢复数据包):inputbw * (100 + oheadbw) / 100。若 maxbw 设为 0 但未设置 inputbw,库内部会评估实际输入速率,默认值为 0。
iptos=tos
IP 服务类型(Type of Service),仅适用于发送方,默认值为 0xB8。
ipttl=ttl
IP 生存时间(Time To Live),仅适用于发送方,默认值为 64。
latency = 微秒
基于时间戳的数据包传输延迟,用于吸收数据包重传丢失的突发情况。该标志同时将 rcvlatency 和 peerlatency 设置为相同值。注意:1.3.0 版本前仅支持该标志设置延迟,发送方侧等效于设置 peerlatency,接收方侧等效于设置 rcvlatency,且不支持双向流发送。
listen_timeout = 微秒
设置套接字监听超时时间。
maxbw = 字节 / 秒
最大发送带宽,单位为字节 / 秒:
- -1:无限(CSRTCC 限制为 30 Mbps);
- 0:相对于输入速率(见 inputbw);
-
0:绝对限制值;默认值为 0(相对值)。
mode=caller|listener|rendezvous
连接模式:
- caller:发起客户端连接(默认);
- listener:启动服务器监听传入连接;
- rendezvous:使用会合连接模式。
mss = 字节
最大分段大小(Maximum Segment Size),单位为字节,用于缓冲区分配和基于数据包计数器的速率计算(假设数据包满负载)。使用对等方之间的最小 MSS,互联网环境下默认值为 1500,仅可减小(除非有特殊专用网络配置)。
nakreport=1|0
若设为 1,接收方会定期发送 'UMSG_LOSSREPORT' 消息,直到丢失的数据包被重传或主动丢弃,默认值为 1。
oheadbw = 百分比
恢复带宽相对于输入速率的开销百分比(见 inputbw),默认值为 25%。
passphrase = 字符串
HaiCrypt 加密 / 解密密码字符串,长度为 10-79 字符。密码是发送方和接收方的共享密钥,用于通过 PBKDF2(基于密码的密钥派生函数)生成密钥加密密钥(Key Encrypting Key),仅在 pbkeylen 非零时使用。接收方仅在收到加密数据时使用,配置的密码无法恢复(仅写)。
enforced_encryption=1|0
若设为 true,连接双方必须设置相同的密码(包括空密码,即不加密)。若密码不匹配或仅一方未加密,连接会被拒绝,默认值为 true。
kmrefreshrate = 数据包数
切换到新加密密钥前传输的数据包数量,默认值为 -1(自动,libsrt 中为 0x1000000),取值范围为 0 - INT_MAX。
kmpreannounce = 数据包数
新加密密钥发送与切换之间的间隔,该值同样适用于切换与旧密钥停用之间的间隔,默认值为 -1(自动,libsrt 中为 0x1000),取值范围为 0 - INT_MAX。
snddropdelay = 微秒
发送方丢弃数据包前的额外延迟(添加到默认丢弃延迟时间),特殊值 -1 表示发送方不丢弃任何数据包。
payload_size = 字节
设置实时模式下单次发送函数调用传输的数据包最大声明大小,文件模式下默认不使用(设为 0),默认值为 -1(自动,通常为 MPEG-TS)。若使用 SRT 发送其他类型的负载(如小帧封装的直播流),可设置更大的最大帧大小(不超过 1456 字节)。
pkt_size = 字节
payload_size 的别名。
peerlatency = 微秒
发送方设置的接收方最小延迟值(见 rcvlatency)。
pbkeylen = 字节
发送方加密密钥长度,仅支持 0、16、24、32,非零时启用发送方加密。接收方无需设置(设为 0),密钥大小通过 HaiCrypt 握手从发送方获取,默认值为 0。
rcvlatency = 微秒
数据包从发送到交付给接收方应用的时间,需足够大以覆盖发送时间、意外延长的 RTT 时间和 UDP 数据包重传时间。实际延迟值为该选项值与对等方设置的 peerlatency 值中的较大者。1.3.0 版本前该选项仅可通过 latency 设置。
recv_buffer_size = 字节
设置 UDP 接收缓冲区大小(单位:字节)。
send_buffer_size = 字节
设置 UDP 发送缓冲区大小(单位:字节)。
timeout = 微秒
设置读取、写入和连接操作的错误超时时间。注意:SRT 库有独立的内部超时控制,该值仅作为上限。
tlpktdrop=1|0
迟到数据包丢弃(Too-late Packet Drop):
- 接收方启用时:跳过未及时交付的丢失数据包,在后续数据包到达播放时间时交付给应用,并向发送方发送伪 ACK;
- 发送方启用且接收方支持时:发送方丢弃无法及时交付的旧数据包(默认在接收方支持时自动启用)。
sndbuf = 字节
设置发送缓冲区大小(单位:字节)。
rcvbuf = 字节
设置接收缓冲区大小(单位:字节),接收缓冲区不得大于 ffs。
lossmaxttl = 数据包数
重排序容限(Reorder Tolerance)的最大增长值。重排序容限 > 0 时,数据包丢失报告会延迟到接收该数量的数据包后。当收到 “延迟” 数据包(非重传导致,即 UDP 数据包乱序)时,重排序容限会按最新序列号与该数据包序列号的差值增长,但不超过该选项值。默认值为 0(禁用该机制,丢失报告在检测到序列号间隙时立即发送)。
minversion
要求对等方的最小 SRT 版本,不满足时拒绝连接。版本格式:十六进制 0xXXYYZZ 对应人类可读格式 x.y.z。
streamid = 字符串
连接前设置的套接字流 ID,长度限制为 512 字符,监听方可通过 srt_accept 返回的套接字获取。SRT 不对该字符串内容进行特殊解析,会合连接模式下无意义(可能一方覆盖另一方的值)。
srt_streamid = 字符串
streamid 的别名,避免与 ffmpeg 命令行选项冲突。
smoother=live|file
套接字传输使用的平滑器(Smoother)类型,负责传输和拥塞控制。连接双方的平滑器类型必须完全一致,否则拒绝连接。
messageapi=1|0
是否使用消息 API(Message API),否则使用缓冲区 API(Buffer API):
- 实时模式(见 transtype)仅支持消息 API;
- 文件模式可选择:
- 流 API(默认,messageapi=0):单次发送可传输任意大小数据,支持直接从文件读取,内部处理速度和拥塞控制,接收时可按需读取,数据无边界;
- 消息 API(messageapi=1):单次发送传递一个带边界的数据包,可跨多个 UDP 数据包,大小限制为发送缓冲区,接收方需使用足够大的缓冲区,否则无法接收完整消息(数据包丢失时也无法接收)。
transtype=live|file
设置套接字传输类型,会自动将多个其他参数设为对应类型的默认值:
- live(实时):单次发送仅传输一个 UDP 数据包大小的数据,限制为 payload_size(默认 1316),无速度控制,仅带宽控制(若配置);
- file(文件):非实时传输,详见 messageapi。
linger = 秒
关闭时等待未发送数据的时间,默认值为 -1(自动:实时模式下禁用,0 秒;文件模式下启用,180 秒),取值范围为 0 - INT_MAX。
tsbpd=1|0
是否启用基于时间戳的数据包交付模式(Timestamp-based Packet Delivery),默认行为取决于传输类型:实时模式启用,文件模式禁用。
3.38 srtp
安全实时传输协议(Secure Real-time Transport Protocol)。
支持的选项:
srtp_in_suite
srtp_out_suite
选择输入和输出编码套件,支持值:
AES_CM_128_HMAC_SHA1_80SRTP_AES128_CM_HMAC_SHA1_80AES_CM_128_HMAC_SHA1_32SRTP_AES128_CM_HMAC_SHA1_32
srtp_in_params
srtp_out_params
设置输入和输出编码参数,格式为二进制块的 Base64 编码字符串。二进制块前 16 字节为密钥(master key),后 14 字节为盐值(master salt)。
3.39 subfile
虚拟提取文件或其他流的片段,底层流必须支持 seek。
支持的选项:
start
提取片段的起始偏移量(单位:字节)。
end
提取片段的结束偏移量(单位:字节),设为 0 时提取至文件末尾。
示例:
- 从 DVD VOB 文件中提取章节(起始和结束扇区需外部获取并乘以 2048):
subfile,,start,153391104,end,268142592,,:/media/dvd/VIDEO_TS/VTS_08_1.VOB - 直接从 TAR 归档文件中播放 AVI 文件:
subfile,,start,183241728,end,366490624,,:archive.tar - 从起始偏移量播放 MPEG-TS 文件至末尾:
subfile,,start,32815239,end,0,,:video.ts
3.40 tee
将输出写入多个协议,各输出之间用 | 分隔。
tee:file://path/to/local/this.avi|file://path/to/local/that.avi
3.41 tcp
传输控制协议(Transmission Control Protocol)。
URL 语法:
tcp://hostname:port[?options]
选项(options)为 & 分隔的键值对(格式:key=val)。
支持的选项:
listen=2|1|0
是否监听传入连接:0 禁用,1 启用单客户端模式,2 启用多客户端模式,默认值为 0。
local_addr = 地址
TCP 套接字连接使用的网络接口本地 IP 地址。
local_port = 端口
TCP 套接字连接使用的本地端口。
timeout = 微秒
设置错误超时时间(单位:微秒),仅适用于读取模式:超过该时间无数据到达则触发错误。
listen_timeout = 毫秒
设置监听超时时间(单位:毫秒)。
recv_buffer_size = 字节
设置接收缓冲区大小(单位:字节)。
send_buffer_size = 字节
设置发送缓冲区大小(单位:字节)。
tcp_nodelay=1|0
是否设置 TCP_NODELAY 以禁用 Nagle 算法,默认值为 0。
注意:当前套接字写入未优化以减少系统调用,可能降低 TCP_NODELAY 的效率。
tcp_mss = 字节
设置出站 TCP 数据包的最大分段大小(单位:字节)。
示例:使用 ffmpeg 建立监听 TCP 连接,通过 ffplay 访问:
ffmpeg -i input -f format tcp://hostname:port?listen
ffplay tcp://hostname:port
3.42 tls
传输层安全(Transport Layer Security,TLS)/ 安全套接层(Secure Sockets Layer,SSL)。
URL 语法:
tls://hostname:port[?options]
可通过命令行选项(或代码中通过 AVOption)设置的参数:
ca_file、cafile = 文件名
包含受信任的证书颁发机构(CA)根证书的文件,若链接的 TLS 库包含默认根证书,则无需指定即可完成验证(但并非所有库和配置都内置默认根证书)。文件需为 OpenSSL PEM 格式。
tls_verify=1|0
是否验证通信对等方:
- 启用时,验证对等方证书是否由 CA 数据库中的根证书签名(OpenSSL 暂不验证证书与主机名匹配,其他后端会验证);
- 默认禁用(多数情况下需要调用方提供 CA 数据库)。
cert_file、cert = 文件名
握手时使用的证书文件(服务器模式下通常为对等方要求,客户端证书仅在特定配置中需要)。
key_file、key = 文件名
证书对应的私钥文件。
listen=1|0
启用时,在指定端口监听连接,握手时作为服务器角色(默认作为客户端)。
http_proxy
用于隧道传输的 HTTP 代理,示例:http://example.com:1234,代理需支持 CONNECT 方法。
示例:
- 创建 TLS/SSL 服务器并推送输入流:
ffmpeg -i input -f format tls://hostname:port?listen&cert=server.crt&key=server.key - 使用
ffplay从 TLS/SSL 服务器播放流:ffplay tls://hostname:port
3.43 DTLS(数据报传输层安全)
数据报传输层安全协议(DTLS)
DTLS 统一资源定位符(URL)的标准语法格式为:dtls://hostname:port[?options]
其中options为一组由&分隔的key=val格式参数项。可使用标准百分号编码(空格用加号替代)对参数的键名与值进行转义处理。
同时,相关参数也可通过命令行选项(或代码中的AVOptions)进行配置。
DTLS 与 TLS 协议的大部分参数通用,二者核心区别在于 DTLS 基于 UDP 协议传输,而非 TCP 协议。
以下为其支持的参数列表:
- ca_file、cafile=filename指定包含可信任的证书颁发机构(CA)根证书的文件路径。若所链接的 TLS 类库内置了默认根证书,则无需手动指定该文件即可完成证书验证;但部分类库或运行环境无内置默认根证书,此时必须配置此参数。证书文件需为 OpenSSL PEM 格式。
- tls_verify、verify=1|0启用后将对通信对等端进行证书验证。需注意,在使用 OpenSSL 类库时,该功能仅校验对等端证书是否由 CA 证书库中的根证书签发,不验证证书与目标连接主机名的匹配性。由于多数场景下需要调用方自行提供 CA 证书库,因此该功能默认处于禁用状态。
- cert_file、cert=filename指定在与对等端握手阶段使用的本地证书文件。(作为服务端以监听模式运行时,对等端通常会要求服务端提供此证书;而客户端证书仅在特定业务场景下为必填项)
- key_file、key=filename指定证书对应的私钥文件路径。
- cert_pem=string直接传入证书的 PEM 格式字符串内容。
- key_pem=string直接传入私钥的 PEM 格式字符串内容。
- listen=1|0启用后将在指定端口监听连接请求,并在握手阶段以服务端角色完成协议协商,而非默认的客户端角色。
- mtu=size设置 DTLS 数据包的最大传输单元(MTU)。
- use_srtp=1|0启用
use_srtpDTLS 扩展功能。该功能常用于 WebRTC 应用,可通过 DTLS 握手流程协商生成 SRTP 加密密钥,默认处于禁用状态。 - external_sock=1|0启用后将使用外部已有的套接字,而非新建套接字。此参数仅在通过 API 调用代码时生效,若在命令行中启用会直接导致程序运行失败,默认处于禁用状态。
命令行示例
- 搭建 DTLS 服务端
ffmpeg -listen 1 -i dtls://hostname:port output - 搭建 DTLS 客户端并向服务端发送数据
ffmpeg -i input -f format dtls://hostname:port
3.44 UDP(用户数据报协议)
用户数据报协议(UDP)
UDP 统一资源定位符(URL)的标准语法格式为:udp://hostname:port[?options]
其中options为一组由&分隔的key=val格式参数项。可使用标准百分号编码(空格用加号替代)对参数的键名与值进行转义处理。
相关参数也可通过命令行选项(或代码中的AVOptions)进行配置。
当系统启用线程功能时,程序会通过循环缓冲区存储接收的 UDP 数据,以此降低因 UDP 套接字缓冲区溢出导致的数据丢失风险,fifo_size与overrun_nonfatal参数均与此缓冲区相关。
以下为其支持的参数列表:
- buffer_size=size设置 UDP 套接字的最大缓冲区大小(单位:字节)。根据套接字的用途(接收或发送),该参数分别对应设置接收缓冲区或发送缓冲区的大小。默认配置为:输出场景下缓冲区大小 32KB,输入场景下缓冲区大小 384KB。相关配置可参考
fifo_size参数。 - bitrate=bitrate若设置为非零值,当输入数据量足以支撑时,输出数据将保持该参数指定的恒定比特率。
- burst_bits=bits当启用
bitrate参数时,该参数用于指定数据包突发传输的最大比特数。 - localport=port手动指定本地 UDP 绑定端口,覆盖默认端口配置。
- localaddr=addr指定用于发送数据包或加入多播组的本地网络接口 IP 地址。
- pkt_size=size设置 UDP 数据包的固定大小(单位:字节)。
- reuse=1|0显式允许或禁止复用 UDP 套接字。
- ttl=ttl设置数据包的生存时间(仅适用于多播场景)。
- dscp=dscp为发送的数据包设置 6 位的差分服务代码点(DSCP)字段值。
- connect=1|0通过
connect()函数初始化 UDP 套接字。启用后,无法通过ff_udp_set_remote_url接口修改目标地址;若初始化阶段未知目标地址,也可在调用ff_udp_set_remote_url时指定此参数。该功能支持通过getsockname获取数据包源地址,且当收到 “目标不可达” 响应时,写入操作会返回AVERROR(ECONNREFUSED)错误;在接收场景下,仅会接收来自指定对等端地址 / 端口的数据包。 - sources=address[,address]仅接收来自指定地址的数据包。在多播场景中,将仅订阅来自这些地址的多播流量。
- block=address[,address]忽略来自指定地址的数据包。在多播场景中,会在多播订阅中排除这些源地址。
- fifo_size=units设置 UDP 接收循环缓冲区的大小,单位为 “188 字节的数据包个数”。未手动指定时,默认大小为 7×4096。
- overrun_nonfatal=1|0启用后,当 UDP 接收循环缓冲区溢出时,程序可继续运行而不终止。默认值为 0(即缓冲区溢出会导致程序异常)。
- timeout=microseconds设置错误触发超时时间(单位:微秒)。该参数仅在读取模式下生效:若超过设定时间仍未接收到数据,则触发超时错误。
- broadcast=1|0显式允许或禁止 UDP 广播功能。需注意,在启用广播风暴防护的网络环境中,UDP 广播功能可能无法正常工作。
3.44.1 示例
- 通过 UDP 向远程端点推送流媒体
ffmpeg -i input -f format udp://hostname:port - 以 188 字节 UDP 包大小传输 MPEG-TS 格式流,并配置大尺寸输入缓冲区
ffmpeg -i input -f mpegts udp://hostname:port?pkt_size=188&buffer_size=65535 - 通过 UDP 接收远程端点的流媒体
ffmpeg -i udp://[multicast-address]:port ...
3.45 unix(Unix 本地套接字)
Unix 本地套接字
Unix 套接字统一资源定位符(URL)的标准语法格式为:unix://filepath
可通过命令行选项(或代码中的AVOptions)配置以下参数:
- timeout:超时时间(单位:毫秒)。
- listen:将 Unix 套接字设置为监听模式。
3.46 zmq(ZeroMQ 异步消息传输)
基于 libzmq 类库实现的 ZeroMQ 异步消息传输功能。
该类库支持无需依赖外部服务端的单播流媒体多客户端分发能力。
流媒体推送或连接的统一资源定位符(URL)标准语法格式为:zmq:tcp://ip-address:port
示例
- 在本地 5555 端口搭建流媒体服务
ffmpeg -re -i input -f mpegts zmq:tcp://127.0.0.1:5555 - 多客户端连接该流媒体服务
ffplay zmq:tcp://127.0.0.1:5555
多客户端流媒体分发基于 ZeroMQ 的发布 - 订阅(Pub-Sub)模式实现:服务端绑定指定端口并发布流媒体数据,客户端通过 IP 地址与端口连接服务端并订阅流数据。服务端与客户端的启动顺序通常不影响服务正常运行。
注意:ffmpeg 需在编译时开启–enable-libzmq选项,方可支持该传输协议。
可在 ffmpeg/ffplay 命令行中配置以下参数:
- pkt_size:强制指定发送 / 接收数据的最大数据包大小,默认值为 131,072 字节。服务端侧该参数控制 ZeroMQ 发送数据包的最大尺寸;客户端侧该参数设置内部接收缓冲区大小。需注意,客户端的
pkt_size值应大于或等于服务端的配置值,否则接收的消息可能被截断,进而引发解码错误。
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)