⚠️ 这是一个非官方翻译网站,与 FFmpeg 项目无关。准确信息请参阅原文(https://ffmpeg.org/ffmpeg-protocols.html)

FFmpeg 协议文档

1 描述

本文档介绍 libavformat 库提供的输入和输出协议。

2 协议选项

libavformat 库提供了一些可在所有协议上设置的通用全局选项。此外,每个协议还可能支持所谓的私有选项,这些选项是该组件特有的。

可以通过在 FFmpeg 工具中指定 -option value 来设置选项,也可以在 AVFormatContext 选项中显式设置值,或者在程序中使用 libavutil/opt.h API 设置。

支持的选项列表如下:

protocol_whitelist list (input)

设置一个以 "," 分隔的允许协议列表。"ALL" 匹配所有协议。以 "-" 为前缀的协议将被禁用。默认情况下允许所有协议,但被另一个协议使用的协议(嵌套协议)会被限制为按协议区分的子集。

3 协议

协议是 FFmpeg 中已配置的元素,用于启用对需要特定协议的资源的访问。

配置 FFmpeg 构建时,所有受支持的协议默认都是启用的。你可以使用 configure 选项 "–list-protocols" 列出所有可用的协议。

你可以使用 configure 选项 "–disable-protocols" 禁用所有协议,并使用选项 "–enable-protocol=PROTOCOL" 选择性地启用某个协议,或者使用选项 "–disable-protocol=PROTOCOL" 禁用某个特定协议。

ff* 工具的 "-protocols" 选项会显示受支持的协议列表。

所有协议都接受以下选项:

rw_timeout

等待(网络)读写操作完成的最长时间,单位为微秒。

以下是当前可用协议的说明。

3.1 amqp

高级消息队列协议(AMQP)0-9-1 版本是一种基于代理(broker)的发布-订阅通信协议。

FFmpeg 必须以 –enable-librabbitmq 编译才能支持 AMQP。此外还必须单独运行一个 AMQP 代理。RabbitMQ 就是一个开源 AMQP 代理的例子。

启动代理后,FFmpeg 客户端可以使用以下命令将数据流式传输到代理:

ffmpeg -re -i input -f mpegts amqp://[[user]:[password]@]hostname[:port][/vhost]

其中 hostname 和 port(默认是 5672)是代理的地址。客户端也可以设置用于身份验证的 user/password。这两个字段的默认值都是 "guest"。代理上的虚拟主机名可以通过 vhost 设置,默认值为 "/"。

多个订阅者可以使用以下命令从代理拉取流:

ffplay amqp://[[user]:[password]@]hostname[:port][/vhost]

在 RabbitMQ 中,所有发布到代理的数据都会流经一个特定的 exchange,每个订阅的客户端都会分配到一个队列/缓冲区。当数据包到达 exchange 时,会根据 exchange 和 routing_key 字段的设置,决定是否将其复制到某个客户端的队列。

支持以下选项:

exchange

设置要在代理上使用的 exchange。RabbitMQ 预定义了几种 exchange:"amq.direct" 是默认的 exchange,发布者和订阅者的 routing_key 必须匹配;"amq.fanout" 相当于广播操作(即数据会转发到 fanout exchange 上的所有队列,与 routing_key 无关);"amq.topic" 与 "amq.direct" 类似,但支持更复杂的模式匹配(详见 RabbitMQ 文档)。

routing_key

设置路由键。默认值为 "amqp"。路由键用于 "amq.direct" 和 "amq.topic" exchange,以决定数据包是否写入某个订阅者的队列。

pkt_size

发送/接收到代理的每个数据包的最大大小。默认值为 131072,最小值为 4096,最大值可以是 int 能表示的任意大值。接收数据包时,该值会设置 FFmpeg 内部的缓冲区大小,应设置为大于或等于发布到代理的数据包大小。否则接收到的消息可能会被截断,从而导致解码错误。

connection_timeout

首次连接代理时的超时时间(秒)。默认值为 rw_timeout,若未设置 rw_timeout,则为 5 秒。

delivery_mode mode

设置发送到代理的每条消息的投递模式。可接受以下值:

‘persistent’

投递模式设置为 "persistent" (2)。这是默认值。根据代理的设置,消息可能会被写入代理的磁盘。

‘non-persistent’

投递模式设置为 "non-persistent" (1)。只要代理没有承受内存压力,消息就会一直保留在代理的内存中。

3.2 async

用于输入流的异步数据填充包装器。

在后台线程中填充数据,以便将 I/O 操作与解封装线程解耦。

async:URL
async:http://host/resource
async:cache:http://host/resource

3.3 bluray

读取 BluRay 播放列表。

接受的选项如下:

angle

BluRay 视角

chapter

起始章节 (1...N)

playlist

要读取的播放列表 (BDMV/PLAYLIST/?????.mpls)

示例:

从挂载于 /mnt/bluray 的 BluRay 中读取最长的播放列表:

bluray:/mnt/bluray

从挂载于 /mnt/bluray 的 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,每一个都可以指定不同的协议。

例如,要用 ffplay 读取 split1.mpeg、split2.mpeg、split3.mpeg 这一系列文件,可使用以下命令:

ffplay concat:split1.mpeg\|split2.mpeg\|split3.mpeg

注意,你可能需要转义字符 "|",因为它在许多 shell 中是特殊字符。

3.6 concatf

使用以换行符分隔的资源列表的物理拼接协议。

依次读取并定位多个资源,如同它们是单一资源一样。

该协议接受的 URL 具有以下语法:

concatf:URL

其中 URL 是包含以换行符分隔的待拼接资源列表的 url,每一个都可以指定不同的协议。特殊字符必须用反斜杠或单引号转义。参见 ffmpeg-utils(1) 手册中的 "Quoting and escaping" 一节

例如,要用 ffplay 读取文件 split.txt 中分行列出的 split1.mpeg、split2.mpeg、split3.mpeg 这一系列文件,可使用以下命令:

ffplay concatf:split.txt

其中 split.txt 包含以下行:

split1.mpeg
split2.mpeg
split3.mpeg

3.7 crypto

AES 加密流读取协议。

接受的选项如下:

key

以十六进制表示形式设置 AES 解密密钥的二进制块。

iv

以十六进制表示形式设置 AES 解密初始化向量的二进制块。

接受的 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

如果未指定 fd,写入时默认使用 stdout 文件描述符,读取时默认使用 stdin。与 pipe 协议不同,fd 协议在对应常规文件时支持定位(seek)。出于安全考虑,fd 协议不支持通过 URL 传递文件描述符。

该协议接受以下选项:

blocksize

设置 I/O 操作的最大块大小,单位为字节。默认值为 INT_MAX,即不限制所请求的块大小。将该值设置为合理的较小值可以改善用户终止请求的响应时间,这在数据传输较慢时很有价值。

fd

设置文件描述符。

3.10 file

文件访问协议。

从文件读取或写入文件。

file URL 可以采用以下形式:

file:filename

其中 filename 是待读取文件的路径。

不带协议前缀的 URL 会被视为 file URL。根据构建方式的不同,开头带有驱动器盘符、形似 Windows 路径的 URL 也会被视为 file URL(在类 Unix 系统的构建中通常不是这样)。

例如,要用 ffmpeg 读取文件 input.mpeg,可使用以下命令:

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 表示自动(普通文件可定位,命名管道不可定位)。

许多 demuxer 对可定位和不可定位的资源处理方式不同,覆盖该设置可能会加快某些文件的打开速度,但代价是失去部分特性(例如精确定位)。

pkt_size

设置文件 I/O 使用的最大数据包大小。较小的值可以减少内存占用。较大的值可以提高吞吐量,尤其是在使用网络文件系统时。

对于读取,如果显式设置了该值,会覆盖默认的内部缓冲区大小(32 KB),并限制每次操作读取的最大数据量。

对于写入,该值设置每次写入操作的大小。常规文件的默认值为 256 KB,其他情况为 32 KB。

3.11 ftp

FTP(文件传输协议)。

使用 FTP 协议从远程资源读取或写入远程资源。

需要遵循以下语法。

ftp://[user[:password]@]server[:port]/path/to/remote/resource.mpeg

该协议接受以下选项。

timeout

设置底层低级操作所用套接字 I/O 操作的超时时间,单位为微秒。默认设置为 -1,表示未指定超时时间。

ftp-user

设置用于向 FTP 服务器验证身份的用户名。会被 FTP URL 中的用户名覆盖。

ftp-password

设置用于向 FTP 服务器验证身份的密码。会被 FTP URL 中的密码覆盖;若未设置用户名,则会被 ftp-anonymous-password 覆盖。

ftp-anonymous-password

以匿名用户身份登录时使用的密码。通常应使用一个电子邮件地址。

ftp-write-seekable

控制编码期间连接的可定位性。若设置为 1,则假定资源可定位;若设置为 0,则假定不可定位。默认值为 0。

注意:该协议可以用作输出,但除非采取了特别的措施(测试、定制的服务器配置等),否则不建议这样做。不同的 FTP 服务器在定位操作期间的行为各不相同。ff* 工具可能会因服务器的限制而产生不完整的内容。

3.12 gopher

Gopher 协议。

3.13 gophers

Gophers 协议。

带 TLS 封装的 Gopher 协议。

3.14 http

HTTP(超文本传输协议)。

该协议接受以下选项:

seekable

控制连接的可定位性。若设置为 1,则假定资源可定位;若设置为 0,则假定不可定位;若设置为 -1,则会尝试自动检测是否可定位。默认值为 -1。

chunked_post

若设置为 1,POST 请求使用分块传输编码(chunked Transfer-Encoding),默认值为 1。

http_proxy

设置要隧道穿越的 HTTP 代理,例如 http://example.com:1234

headers

设置自定义 HTTP 头,可以覆盖内置的默认头。该值必须是一个编码了这些头的字符串。

content_type

为 POST 消息或监听模式设置特定的 content type。

user_agent

覆盖 User-Agent 头。若未指定,该协议会使用一个描述 libavformat 构建信息的字符串。("Lavf/")

referer

设置 Referer 头。在 HTTP 请求中包含 ’Referer: URL’ 头。

multiple_requests

若设置为 1 则使用持久连接,默认值为 0。

request_size

限制发出请求的大小。这对某些会对无限制范围请求限流的问题服务器很有用,在预计会频繁定位(seek)时也是如此。默认禁用(设置为 0)。

注意,若启用该选项,强烈建议同时启用 multiple_requests 选项,并将 short_seek_size 设置为相同或更高的值。这样做可以让 FFmpeg 尽可能复用单个 HTTP 连接。

initial_request_size

限制初始请求的大小。与 request_size 类似,但仅在初次格式解析期间使用。对于 MXF 或 MOV 等在头部解析期间需要频繁定位的格式很有用。该设置一直有效,直到 demuxer 发出一个大于该大小的读取请求(且期间没有定位)为止,此后实现会照常继续使用常规请求。默认禁用(设置为 0)。

注意,若启用该选项,强烈建议同时启用 multiple_requests 选项,并将 short_seek_size 设置为相同或更高的值。

post_data

设置自定义 HTTP POST 数据。

mime_type

导出 MIME 类型。

http_version

导出 HTTP 响应的版本号。通常为 "1.0" 或 "1.1"。

cookies

设置在后续请求中要发送的 cookie。每个 cookie 的格式与 Set-Cookie HTTP 响应字段的值相同。多个 cookie 可以用换行符分隔。

icy

若设置为 1,则向服务器请求 ICY (SHOUTcast) 元数据。若服务器支持此功能,应用程序须通过读取 icy_metadata_headers 和 icy_metadata_packet 选项来获取该元数据。默认值为 1。

icy_metadata_headers

若服务器支持 ICY 元数据,该项包含 ICY 特有的 HTTP 回复头,以换行符分隔。

icy_metadata_packet

若服务器支持 ICY 元数据且 icy 设置为 1,该项包含服务器发送的最后一个非空元数据包。对流内元数据更新感兴趣的应用程序应定期轮询该项。

metadata

设置一个导出的字典,包含来自 bitstream 的 Icecast 元数据(如果存在)。仅在使用 C API 时有用。

auth_type

设置 HTTP 身份验证类型。没有针对 Digest 的选项,因为该方式要求先从服务器获取 nonce 参数,无法像 Basic 那样直接使用。

none

自动选择 HTTP 身份验证类型。这是默认值。

basic

选择 HTTP 基本身份验证。

基本身份验证会发送一个包含客户端用户名和密码的 Base64 编码字符串。Base64 不是一种加密形式,应视同以明文形式发送用户名和密码(Base64 是可逆编码)。如果需要保护某项资源,强烈建议使用基本身份验证以外的其他身份验证方案。应将 HTTPS/TLS 与基本身份验证配合使用。若没有这些额外的安全增强手段,基本身份验证不应用于保护敏感或有价值的信息。

send_expect_100

为 POST 发送 Expect: 100-continue 头。若设置为 1,则发送;若设置为 0,则不发送;若设置为 -1,则会在适用的情况下尝试发送。默认值为 -1。

location

一个导出的字典,包含内容所在位置(content location)。仅在使用 C API 时有用。

offset

设置初始字节偏移量。

end_offset

尝试将请求限制在该偏移量之前的字节范围内。

method

作为客户端选项使用时,用于设置该请求的 HTTP 方法。

作为服务器选项使用时,用于设置期望从客户端收到的 HTTP 方法。若期望的 HTTP 方法与实际收到的不一致,服务器会向客户端返回 Bad Request 响应。未设置时,目前不会检查 HTTP 方法。未来会以自动检测的方式取代这一行为。

reconnect

在断开连接后、到达 EOF 之前,自动重新连接。

reconnect_at_eof

若设置该项,遇到 EOF 会被当作错误处理并触发重连,这对直播/无限时长的流很有用。

reconnect_on_network_error

在连接过程中发生 TCP/TLS 错误时自动重连。

reconnect_on_http_error

一个以逗号分隔的 HTTP 状态码列表,遇到其中的状态码时会重连。该列表可以包含具体的状态码(例如 ’503’),也可以是 ’4xx’ / ’5xx’ 这样的字符串。

reconnect_streamed

若设置该项,即便是流式/不可定位的流,出错时也会重新连接。

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 尚未实现该功能,因此不得用作命令行选项。

# 服务器端(发送):
ffmpeg -i somefile.ogg -c copy -listen 1 -f ogg http://server:port

# 客户端(接收):
ffmpeg -i http://server:port -c copy somefile.ogg

# 客户端也可以用 wget 实现:
wget http://server:port -O somefile.ogg

# 服务器端(接收):
ffmpeg -listen 1 -i http://server:port -c copy somefile.ogg

# 客户端(发送):
ffmpeg -i somefile.ogg -chunked_post 0 -c copy -f ogg http://server:port

# 客户端也可以用 wget 实现:
wget --post-file=somefile.ogg http://server:port

resource

使用实验性 HTTP 服务器时客户端请求的资源。

reply_code

使用实验性 HTTP 服务器时返回给客户端的 HTTP 状态码。

short_seek_size

设置阈值(单位为字节),用于判断何时应优先选择预读而不是发起定位和新的 HTTP 请求。这很有用,例如可以确保在读取带有少量音频数据包穿插其间的大型视频数据包时使用同一个连接。

3.14.1 HTTP Cookies

除非在请求中传入 cookie 值,否则某些 HTTP 请求会被拒绝。cookies 选项允许指定这些 cookie。每个 cookie 至少必须指定一个值,以及对应的 path 和 domain。域名和路径都匹配的 HTTP 请求,会自动在 HTTP Cookie 头字段中包含该 cookie 值。多个 cookie 可以用换行符分隔。

要播放指定了 cookie 的流,所需的语法是:

ffplay -cookies "nlqptid=nltid=tsn; path=/; domain=somedomain.com;" http://somedomain.com/somestream.m3u8

3.15 Icecast

Icecast 协议(向 Icecast 服务器推流)

该协议接受以下选项:

ice_genre

设置流的风格(genre)。

ice_name

设置流的名称。

ice_description

设置流的描述。

ice_url

设置流所属网站的 URL。

ice_public

设置该流是否应为公开。默认值为 0(不公开)。

user_agent

覆盖 User-Agent 头。若未指定,将使用形如 "Lavf/" 的字符串。

password

设置 Icecast 挂载点(mountpoint)密码。

content_type

设置流的 content type。如果与 audio/mpeg 不同,则必须设置该项。

legacy_icecast

为 Icecast 2.4.0 之前的版本提供支持,这些版本不支持 HTTP PUT 方法,而是使用 SOURCE 方法。

tls

与 Icecast 建立 TLS (HTTPS) 连接。

icecast://[username[:password]@]server:port/mountpoint

3.16 ipfs

星际文件系统(InterPlanetary File System, IPFS)协议支持。用户可以通过所谓的网关(gateway)访问存储在 IPFS 网络上的文件,网关是 http(s) 端点。该协议会将 IPFS 原生协议(ipfs:// 和 ipns://)封装后发送给这样的网关。用户可以(也应该)自行托管节点,这样该协议就会使用本地网关来访问 IPFS 网络上的文件。

该协议接受以下选项:

gateway

定义要使用的网关。若未设置,该协议会依次尝试通过查找 $IPFS_GATEWAY$IPFS_PATH$HOME/.ipfs/ 来定位本地网关。

该协议可以通过 2 种方式使用。使用 IPFS:

ffplay ipfs://<hash>

或使用 IPNS 协议(IPNS 是可变的 IPFS):

ffplay ipns://<hash>

3.17 mmst

基于 TCP 的 MMS (Microsoft Media Server) 协议。

3.18 mmsh

基于 HTTP 的 MMS (Microsoft Media Server) 协议。

要求使用以下语法:

mmsh://server[:port][/app][/playpath]

3.19 md5

MD5 输出协议。

计算待写入数据的 MD5 哈希值,并在关闭时将其写入指定的输出或(未指定时)写入 stdout。可用于在不写入实际文件的情况下测试 muxer。

以下是一些示例。

# 将编码后的 AVI 文件的 MD5 哈希值写入文件 output.avi.md5。
ffmpeg -i input.flv -f avi -y md5:output.avi.md5

# 将编码后的 AVI 文件的 MD5 哈希值写入 stdout。
ffmpeg -i input.flv -f avi -y md5:

注意,某些格式(通常是 MOV)要求输出协议可定位(seek),因此这些格式在使用 MD5 输出协议时会失败。

3.20 pipe

UNIX 管道访问协议。

从 UNIX 管道读取数据并写入 UNIX 管道。

接受的语法为:

pipe:[number]

若未指定 fd,number 即为该管道文件描述符对应的数字(例如 0 表示 stdin、1 表示 stdout、2 表示 stderr)。若未指定 number,写入时默认使用 stdout 文件描述符,读取时默认使用 stdin。

例如,要用 ffmpeg 从 stdin 读取:

cat test.wav | ffmpeg -i pipe:0
# ...等价于...
cat test.wav | ffmpeg -i pipe:

要用 ffmpeg 写入 stdout:

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),因此这些格式在使用 pipe 输出协议时会失败。

3.21 prompeg

Pro-MPEG 实施规范(Code of Practice) #3 第 2 版 FEC 协议。

Pro-MPEG CoP#3 FEC 是一种针对通过 RTP 发送的 MPEG-2 传输流的二维奇偶校验前向纠错(FEC)机制。

该协议必须与 rtp_mpegts muxer 和 rtp 协议配合使用。

要求使用以下语法:

-f rtp_mpegts -fec prompeg=option=val... rtp://hostname:port

目标 UDP 端口为列(column)FEC 流使用 port + 2,行(row)FEC 流使用 port + 4

该协议接受以下选项:

l=n

列数 (4-20,LxD <= 100)

d=n

行数 (4-20,LxD <= 100)

用法示例:

-f rtp_mpegts -fec prompeg=l=8:d=4 rtp://hostname:port

3.22 rist

可靠互联网流传输协议(Reliable Internet Streaming Transport protocol)

接受的选项如下:

rist_profile

支持的值有:

‘simple’ ‘main’

这是默认值。

‘advanced’ buffer_size

设置用于数据重传的内部 RIST 缓冲区大小,单位为毫秒。默认值为 0,表示使用 librist 的默认值(1 秒)。最大值为 30 秒。

fifo_size

librist 接收方输出 fifo 的大小,以数据包数量计。该值必须是 2 的幂。默认值为 8192(而 librist 的默认值为 1024)。

overrun_nonfatal=1|0

在 librist fifo 缓冲区溢出的情况下继续运行而不中止。默认值为 0。

pkt_size

设置发送数据的最大数据包大小。默认值为 1316。

log_level

设置 RIST 日志消息的 loglevel。只有在明确想要启用调试级别消息或丢包模拟时才需要设置该项,否则会遵循常规的 loglevel。

secret

设置加密密钥(secret)的覆盖值,默认未设置。

encryption

设置加密类型,默认禁用。可接受的值为 128 和 256。

3.23 rtmp

实时消息传输协议(Real-Time Messaging Protocol)。

实时消息传输协议(RTMP)用于在 TCP/IP 网络上传输多媒体内容流。

要求使用以下语法:

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 表示 null,后跟一个冒号。对于布尔值,数据必须是 0 或 1,分别表示 FALSE 或 TRUE。同样,对于对象,数据必须是 0 或 1,分别表示结束或开始一个对象。子对象中的数据项可以带名称,方式是在类型前加上 ’N’ 前缀,并在值之前指定名称(即 NB:myFlag:1)。该选项可以多次使用,以构造任意的 AMF 序列。

rtmp_enhanced_codecs

指定客户端在增强型 RTMP 流中宣称支持的 codec 列表。该选项应设置为一个以逗号分隔的 fourcc 值列表,例如多个 codec 用 hvc1,av01,vp09,单个 codec 用 hvc1。指定的列表会出现在 Connect Command Message 的 "fourCcLive" 属性中。

rtmp_flashver

用于运行 SWF 播放器的 Flash 插件版本。默认值为 LNX 9,0,124,2。(推流时,默认值为 FMLE/3.0 (compatible; )。)

rtmp_flush_interval

同一请求中刷新的数据包数量(仅限 RTMPT)。默认值为 10。

rtmp_live

指定媒体为直播流。直播流不支持续播或定位(seek)。默认值为 any,即订阅者首先尝试播放 playpath 中指定的直播流;若未找到该名称的直播流,则播放录制的流。其他可选值为 liverecorded

rtmp_pageurl

嵌入该媒体的网页的 URL。默认不发送任何值。

rtmp_playpath

要播放或发布的流标识符。该选项会覆盖 URI 中指定的参数。

rtmp_subscribe

要订阅的直播流名称。默认不发送任何值。仅当指定了该选项,或 rtmp_live 设置为 live 时才会发送。

rtmp_swfhash

解压缩后的 SWF 文件的 SHA256 哈希值(32 字节)。

rtmp_swfsize

解压缩后的 SWF 文件大小,SWF 校验(SWFVerification)时需要。

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 的效率/效果。

tcp_keepalive=1|0

启用 TCP keepalive 机制以检测失效的对端,并帮助维持长期存活的空闲连接。默认值为 0。

只能启用或禁用基本的 keepalive 选项(SO_KEEPALIVE)。特定于平台的调优参数,如 TCP_KEEPIDLE、TCP_KEEPINTVL 或 TCP_KEEPCNT,不可配置,将使用操作系统的默认值。

例如,要用 ffplay 从名为 "myserver" 的 RTMP 服务器读取应用程序 "vod" 下名为 "sample" 的多媒体资源:

ffplay rtmp://myserver/vod/sample

要发布到有密码保护的服务器,并分别传入 playpath 和 app 名称:

ffmpeg -re -i <input> -f flv -rtmp_playpath some/long/path -rtmp_app long/app/name rtmp://username:password@myserver/

3.24 rtmpe

Encrypted Real-Time Messaging Protocol。

Encrypted Real-Time Messaging Protocol (RTMPE) 用于在标准加密原语的范围内流式传输多媒体内容,它由 Diffie-Hellman 密钥交换和 HMACSHA256 组成,生成一对 RC4 密钥。

3.25 rtmps

通过安全 SSL 连接传输的 Real-Time Messaging Protocol。

Real-Time Messaging Protocol (RTMPS) 用于通过加密连接流式传输多媒体内容。

3.26 rtmpt

通过 HTTP 隧道传输的 Real-Time Messaging Protocol。

通过 HTTP 隧道传输的 Real-Time Messaging Protocol (RTMPT) 用于在 HTTP 请求内流式传输多媒体内容,以穿越防火墙。

3.27 rtmpte

通过 HTTP 隧道传输的 Encrypted Real-Time Messaging Protocol。

通过 HTTP 隧道传输的 Encrypted Real-Time Messaging Protocol (RTMPTE) 用于在 HTTP 请求内流式传输多媒体内容,以穿越防火墙。

3.28 rtmpts

通过 HTTPS 隧道传输的 Real-Time Messaging Protocol。

通过 HTTPS 隧道传输的 Real-Time Messaging Protocol (RTMPTS) 用于在 HTTPS 请求内流式传输多媒体内容,以穿越防火墙。

3.29 libsmbclient

libsmbclient 允许操作 CIFS/SMB 网络资源。

需要遵循以下语法。

smb://[[domain:]user[:password@]]server[/share[/path[/file]]]

该协议接受以下选项。

timeout

设置底层低级操作所用套接字 I/O 操作的超时时间(毫秒)。默认设置为 -1,表示不指定超时。

truncate

若设置为 1,则在写入时截断已有文件;设置为 0 则不截断。默认值为 1。

workgroup

设置建立连接时使用的工作组。默认不指定工作组。

更多信息请参阅:http://www.samba.org/

3.30 libssh

通过 libssh 实现的 Secure File Transfer Protocol

使用 SFTP 协议从远程资源读取,或向远程资源写入。

需要遵循以下语法。

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.31 librtmp rtmp, rtmpe, rtmps, rtmpt, rtmpte

通过 librtmp 支持的 Real-Time Messaging Protocol 及其变体。

需要在配置时存在 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 变体的字符串 "rtmp"、"rtmpt"、"rtmpe"、"rtmps"、"rtmpte"、"rtmpts" 之一,server、port、app 和 playpath 的含义与 RTMP 原生协议中指定的相同。options 包含一个以空格分隔的 key=val 形式选项列表。

更多信息请参阅 librtmp 的手册页(man 3 librtmp)。

例如,要使用 ffmpeg 将文件实时流式传输到 RTMP 服务器:

ffmpeg -re -i myfile -f flv rtmp://myserver/live/mystream

要使用 ffplay 播放同一流:

ffplay "rtmp://myserver/live/mystream live=1"

3.32 rtp

Real-time Transport Protocol。

RTP URL 所需的语法为:

rtp://hostname[:port][?options]

port 指定要使用的 RTP 端口。

options 包含一个以 & 分隔的 key=val 形式选项列表。可以使用标准的百分号编码(并用加号表示空格)来转义键和值。

选项也可以通过命令行选项(或在代码中通过 AVOption)指定。

支持的选项列表如下。

ttl=n

设置 TTL(Time-To-Live)值(仅用于组播)。

rtcpport=n

将远程 RTCP 端口设置为 n。

localport, local_rtpport, localrtpport=n

将本地 RTP 端口设置为 n。

使用 localport 这个选项名已被弃用,不应再使用。

local_rtcpport, 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)。

localaddr=addr

用于发送数据包或加入组播组的网络接口的本地 IP 地址。

timeout=n

将套接字 I/O 操作的超时时间(微秒)设置为 n。

重要说明:

  1. 如果未设置 rtcpport,则 RTCP 端口将被设置为 RTP 端口值加 1。
  2. 如果未设置 localrtpport(本地 RTP 端口),本地 RTP 端口和 RTCP 端口将使用任意可用端口。
  3. 如果未设置 localrtcpport(本地 RTCP 端口),它将被设置为本地 RTP 端口值加 1。

3.33 rtsp

Real-Time Streaming Protocol。

RTSP 从技术上讲并非 libavformat 中的协议处理程序,而是一个 demuxer 和 muxer。该 demuxer 同时支持普通 RTSP(数据通过 RTP 传输,例如 Apple 和 Microsoft 使用的方式)和 Real-RTSP(数据通过 RDT 传输)。

该 muxer 可用于通过 RTSP ANNOUNCE 向支持它的服务器发送流(目前为 Darwin Streaming Server 和 Mischa Spiegelmock 的 RTSP server)。

RTSP url 所需的语法为:

rtsp://hostname[:port]/path

选项可以在 ffmpeg/ffplay 命令行中设置,也可以在代码中通过 AVOptionavformat_open_input 设置。

3.33.1 Muxer

支持以下选项。

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 sender report。

‘h264_mode0’

对 RTP 中的 H.264 使用模式 0。

‘send_bye’

结束时发送 RTCP BYE 数据包。

默认值为 ‘0’。

min_port

设置本地 UDP 端口的最小值。默认值为 5000。

max_port

设置本地 UDP 端口的最大值。默认值为 65000。

buffer_size

设置套接字的最大缓冲区大小(字节)。

pkt_size

设置最大发送数据包大小(字节)。默认值为 1472。

3.33.2 Demuxer

支持以下选项。

initial_pause

若设置为 1,则不会立即开始播放流。默认值为 0。

rtsp_transport

设置 RTSP 传输协议。

可接受的值有:

‘udp’

使用 UDP 作为底层传输协议。

‘tcp’

使用 TCP(在 RTSP 控制通道内交织)作为底层传输协议。

‘udp_multicast’

使用 UDP 组播作为底层传输协议。

‘http’

使用 HTTP 隧道作为底层传输协议,这对穿越代理很有用。

‘https’

使用 HTTPs 隧道作为底层传输协议,这对穿越代理很有用,也因安全考虑而被广泛使用。

可以指定多个底层传输协议,此时会逐一尝试(若一个设置失败,则尝试下一个)。对于 muxer,仅支持 ‘tcp’ 和 ‘udp’ 选项。

rtsp_flags

设置 RTSP 标志。

接受以下值:

‘filter_src’

仅接受来自协商对端地址和端口的数据包。

‘listen’

作为服务器运行,监听传入连接。

‘prefer_tcp’

如果 TCP 可作为 RTSP 的 RTP 传输方式使用,则优先尝试 TCP 作为 RTP 传输方式。

‘satip_raw’

导出原始 MPEG-TS 流而不进行解封装。该标志只会照原样写出原始流,其原有的 PAT/PMT/PIDs 保持不变。

默认值为 ‘none’。

allowed_media_types

设置接受来自服务器的媒体类型。

接受以下标志:

‘video’ ‘audio’ ‘data’ ‘subtitle’

默认接受所有媒体类型。

min_port

设置本地 UDP 端口的最小值。默认值为 5000。

max_port

设置本地 UDP 端口的最大值。默认值为 65000。

listen_timeout

设置建立初始连接的最大超时时间(秒)。将 listen_timeout 设置为大于 0 会使 rtsp_flags 变为 ‘listen’。默认值为 -1,在设置 ‘listen’ 模式时表示无限超时。

reorder_queue_size

设置用于处理乱序数据包而缓冲的数据包数量。

timeout

以微秒为单位设置套接字 TCP I/O 超时。

user_agent

覆盖 User-Agent 头。如果未指定,则默认使用 libavformat 的标识符字符串。

buffer_size

设置套接字的最大缓冲区大小(字节)。

通过 UDP 接收数据时,demuxer 会尝试对收到的数据包重新排序(因为它们可能乱序到达,或数据包可能完全丢失)。可以通过将最大解封装延迟设置为零(通过 AVFormatContext 的 max_delay 字段)来禁用此行为。

使用 ffplay 观看多比特率 Real-RTSP 流时,可以分别用 -vst n 和 -ast n 选择要显示的视频流和音频流,并可通过按 va 键动态切换。

3.33.3 示例

以下示例均使用 ffplayffmpeg 工具。

  • 以最大 0.5 秒的重新排序延迟观看 UDP 上的流:

    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.34 sap

Session Announcement Protocol (RFC 2974)。这从技术上讲并非 libavformat 中的协议处理程序,而是一个 muxer 和 demuxer。它用于 RTP 流的信令,方式是在单独的端口上定期公告这些流的 SDP。

3.34.1 Muxer

提供给 muxer 的 SAP url 语法为:

sap://destination[:port][?options]

RTP 数据包会被发送到 destination 的 port 端口;若未指定端口,则发送到 5004 端口。options 是一个以 & 分隔的列表。支持以下选项:

announce_addr=address

指定发送公告的目标 IP 地址。若省略,公告会被发送到常用的 SAP 公告组播地址 224.2.127.254(sap.mcast.net);若 destination 为 IPv6 地址,则发送到 ff0e::2:7ffe。

announce_port=port

指定发送公告所用的端口,若未指定则默认为 9875。

ttl=ttl

指定公告和 RTP 数据包的存活时间(time to live)值,默认为 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.34.2 Demuxer

提供给 demuxer 的 SAP url 语法为:

sap://[address][:port]

address 是用于监听公告的组播地址,若省略则使用默认值 224.2.127.254(sap.mcast.net)。port 是监听所用的端口,省略时为 9875。

demuxer 会在给定的地址和端口上监听公告。一旦收到公告,就会尝试接收该特定的流。

以下是命令行示例。

回放在常规 SAP 组播地址上公告的第一个流:

ffplay sap://

回放在默认 IPv6 SAP 组播地址之一上公告的第一个流:

ffplay sap://[ff0e::2:7ffe]

3.35 sctp

Stream Control Transmission Protocol。

接受的 URL 语法为:

sctp://host:port[?options]

options 包含一个以 & 分隔的 key=val 形式选项列表。可以使用标准的百分号编码(并用加号表示空格)来转义键和值。

选项也可以通过命令行选项(或在代码中通过 AVOption)指定。

支持的选项列表如下。

listen

若设置为任意值,则监听传入连接。默认执行传出连接。

max_streams

设置流的最大数量。默认不设置上限。

3.36 shared

面向输入流的线程安全、持久化跨进程缓存包装器。它会将输入流缓存到指定目录中的一个文件。这类似于 cache,但拥有磁盘上的持久化缓存,可以在多个进程或 demuxer 之间共享,甚至可以并发共享。

缓存的文件名是通过对输入 URL 做哈希得到的,因此如果同一个 URL 被用于不同的内容(例如因使用额外的 POST 数据来选择流 ID 所致),就存在一定的冲突风险。为避免这种情况,请确保该协议仅用于能唯一标识内容的 URL;否则可能会得到多个来源混杂的乱码数据。

接受的选项如下:

cache_dir

存储缓存文件的目录路径。该选项为必填项。

block_shift

内部读写所用块大小的移位系数(log2)。默认值为 15,即 32KB 大小的块。若该值与创建现有缓存文件时指定的值不一致,则会改用之前指定的值。

read_only

若为 true,则使用共享缓存进行读取,但不会向其中写入任何新块。默认值为 false。请注意,即使启用该选项,若缓存文件尚不存在,仍会被初始化。

cache_verify

若为 true,则会将从缓存中读取的数据与底层输入流进行比对校验,并报告任何不一致之处。请注意,这会使缓存层实际上失去作用。这纯粹是一个调试用选项。

cache_timeout

若设置为非零值,则指定在另一个进程当前正尝试获取并缓存同一块数据时,等待数据可用的最长时间(微秒)。若该超时已过,则会认为另一个进程在此期间可能已卡住或已终止。

若设置为零,则不进行任何等待,所有进程会立即各自竞相尝试获取相同的缺失块。默认值为 10000(即 10 ms)。

retry_errors

若为 true(默认值),则会忽略底层输入流中的瞬时读取错误并重试。若为 false,则之前读取失败的任何块都会被视为永久不可访问。

URL 语法为

shared:URL

3.37 srt

通过 libsrt 实现的 Haivision Secure Reliable Transport Protocol。

SRT URL 支持的语法为:

srt://hostname:port[?options]

options 包含一个以 & 分隔的 key=val 形式选项列表。可以使用标准的百分号编码(并用加号表示空格)来转义键和值。

选项也可以通过命令行选项(或在代码中通过 AVOption)指定。

支持的选项列表如下。

connect_timeout=milliseconds

连接超时;在默认连接超时 3 秒的情况下,若 RTT 超过 1500 毫秒(2 次握手交换),SRT 将无法连接。该选项适用于 caller 和 rendezvous 连接模式。连接超时时间为 rendezvous 模式所设置值的 10 倍(这可以作为旧版本中此连接问题的一种变通方法)。

ffs=bytes

Flight Flag Size(窗口大小),单位为字节。FFS 实际上是一个内部参数,应将其设置为不小于 recv_buffer_size 和 mss 的值。默认值相对较大,因此除非设置了非常大的接收缓冲区,否则无需更改此选项。默认值为 25600。

inputbw=bytes/seconds

发送端的标称输入速率,单位为每秒字节数。当 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=microseconds

基于时间戳的数据包传送延迟。用于吸收丢失数据包重传所造成的突发延迟。该标志会将 rcvlatency 和 peerlatency 同时设置为相同的值。请注意,在 1.3.0 版本之前,这是设置延迟的唯一标志,但这实际上等价于:在发送端设置 peerlatency,在接收端设置 rcvlatency,且不支持双向流发送。

listen_timeout=microseconds

设置套接字的 listen 超时时间。

maxbw=bytes/seconds

最大发送带宽,单位为每秒字节数。-1 表示无限(CSRTCC 限制为 30mbps),0 表示相对于输入速率(参见 inputbw),大于 0 表示绝对限制值。默认值为 0(相对值)。

mode=caller|listener|rendezvous

连接模式。caller 打开客户端连接。listener 启动服务器以监听传入连接。rendezvous 使用 Rendez-Vous 连接模式。默认值为 caller。

mss=bytes

Maximum Segment Size,单位为字节。用于缓冲区分配,以及在假定数据包已被填满的前提下利用数据包计数器进行速率计算。会使用对端之间较小的 MSS 值。在整个互联网中,该值默认是 1500。这是 UDP 数据包的最大尺寸,除非拥有一些特殊的专用网络设置,否则只能调小。默认值为 1500。

nakreport=1|0

若设置为 1,接收端会定期发送 'UMSG_LOSSREPORT' 消息,直到丢失的数据包被重传或被有意丢弃为止。默认值为 1。

oheadbw=percents

超出输入速率的恢复带宽开销,以百分比表示。参见 inputbw。默认值为 25%。

passphrase=string

HaiCrypt 加密/解密密码短语字符串,长度为 10 到 79 个字符。该密码短语是发送端和接收端之间的共享密钥。它用于通过 PBKDF2(基于密码的密钥派生函数)生成 Key Encrypting Key。仅当 pbkeylen 非零时才会使用。在接收端,仅当收到的数据已加密时才会使用它。所设置的密码短语无法恢复(只写)。

enforced_encryption=1|0

若为 true,则连接双方必须设置相同的密码(包括为空,即不加密的情况)。若密码不匹配,或只有一方未加密,则连接会被拒绝。默认值为 true。

kmrefreshrate=packets

在传输多少个数据包后将加密密钥切换为新密钥。默认值为 -1。-1 表示自动(在 srt 库中为 0x1000000)。该选项的取值范围是 0 到 INT_MAX 之间的整数。

kmpreannounce=packets

从发送新加密密钥到发生切换之间的间隔。该值同样适用于切换发生后到旧加密密钥被废止之间的后续间隔。默认值为 -1。-1 表示自动(在 srt 库中为 0x1000)。该选项的取值范围是 0 到 INT_MAX 之间的整数。

snddropdelay=microseconds

发送端在丢弃数据包之前的额外延迟。该延迟会被加到默认的丢弃延迟时间间隔值上。

特殊值 -1:发送端完全不丢弃数据包。

payload_size=bytes

设置在 Live 模式下单次调用发送函数期间所传输数据包的最大声明大小。若不使用该值(file 模式下的默认设置),则使用 0。默认值为 -1(自动),通常意味着 MPEG-TS;若打算使用 SRT 发送其他类型的负载,例如将直播流封装成非常小的帧,则可以使用更大的最大帧大小,但不得超过 1456 字节。

pkt_size=bytes

‘payload_size’ 的别名。

peerlatency=microseconds

由发送端为接收端设置的最小延迟值(如 rcvlatency 中所述)。

pbkeylen=bytes

发送端加密密钥长度,单位为字节。只能设置为 0、16、24 或 32。若不为 0,则启用发送端加密。在接收端不需要设置(设为 0),密钥大小会在 HaiCrypt 握手中从发送端获取。默认值为 0。

rcvlatency=microseconds

从数据包发送的时刻到其在接收函数中被交付给接收端应用程序的时刻之间应经过的时间。该时间应是一个足够大的缓冲时间,以覆盖发送所耗费的时间、意外延长的 RTT 时间,以及重传丢失 UDP 数据包所需的时间。实际生效的延迟值将是该选项的值与对端所设置的 peerlatency 值两者中的较大值。在 1.3.0 版本之前,该选项仅以 latency 的形式提供。

recv_buffer_size=bytes

设置 UDP 接收缓冲区大小,以字节表示。

send_buffer_size=bytes

设置 UDP 发送缓冲区大小,以字节表示。

timeout=microseconds

设置读、写和连接操作触发错误的超时时间。请注意,SRT 库拥有可单独控制的内部超时,此处设置的值仅是对这些超时的一个上限。

tlpktdrop=1|0

Too-late Packet Drop(延迟丢包)。在接收端启用时,它会跳过未能及时送达的缺失数据包,并在后续数据包的播放时间到达时将其交付给应用程序。它还会向发送端发送一个伪造的 ACK。若在发送端启用,且接收对端也已启用,则发送端会丢弃那些已没有机会及时送达的旧数据包。若接收端支持该功能,发送端会自动启用它。

sndbuf=bytes

设置发送缓冲区大小,以字节表示。

rcvbuf=bytes

设置接收缓冲区大小,以字节表示。

接收缓冲区不得大于 ffs。

lossmaxttl=packets

Reorder Tolerance 可以增长到的上限值。当 Reorder Tolerance > 0 时,会将丢包报告延迟到收到相应数量的数据包为止。每当收到一个非因重传而“迟到”的数据包时(也就是说,当 UDP 数据包往往乱序到达时),Reorder Tolerance 就会按最新序列号与该数据包序列号之间的差值增长,但不会超过该选项设置的值。默认值为 0,表示该机制被关闭,此时只要序列号出现“间隙”,就会立即发送丢包报告。

minversion

要求对端具备的最低 SRT 版本。若对端不满足该最低版本要求,则与其建立的连接会被拒绝。

对于人类可读形式的 x.y.z,其十六进制版本格式为 0xXXYYZZ。

streamid=string

一个最长 512 个字符的字符串,可以在连接之前设置到套接字上。listener 端可以从 srt_accept 返回的、由设置了该流 ID 的套接字所建立连接的套接字中获取该流 ID。SRT 不对该字符串的内容做任何特殊解释。该选项在 Rendezvous 连接中没有意义;其结果可能只是一方覆盖另一方的值,具体哪一方胜出全凭运气。

srt_streamid=string

‘streamid’ 的别名,用于避免与 ffmpeg 命令行选项冲突。

smoother=live|file

该套接字传输所使用的 Smoother 类型,负责传输和拥塞控制。连接双方的 Smoother 类型必须完全一致,否则连接会被拒绝。

messageapi=1|0

设置后,该套接字使用 Message API,否则使用 Buffer API。请注意,在 live 模式(参见 transtype)下只能使用 message API。在 File 模式下,可以选择使用以下两种模式之一:

Stream API(该选项为 false 时的默认值)。在此模式下,一次发送指令即可发送任意数量的数据,甚至可以使用直接从文件读取的专用函数。内部机制会负责处理速度和拥塞控制。接收时同样可以接收任意数量的数据,未被取出的数据将等待下一次调用。Stream 模式下各数据部分之间没有边界。

Message API。在此模式下,一次发送指令只传递恰好一个具有边界的数据片段(一条消息)。与 Live 模式不同,该消息可以跨越多个 UDP 数据包,唯一的大小限制是它必须能整体放入发送缓冲区。接收端应使用足够大的缓冲区来接收该消息,否则消息不会被交出。当消息不完整时(并非所有数据包都已收到,或发生了丢包),该消息也不会被交出。

transtype=live|file

设置该套接字的传输类型;具体而言,设置此选项会将其他多个参数设置为特定传输类型所需的默认值。

live:按照实时传输来设置选项。在此模式下,一次发送指令应仅发送能容纳于一个 UDP 数据包中的数据量,并受限于 payload_size 中首先定义的值(此模式下默认为 1316)。此模式下没有速度控制,只有在配置时才会有带宽控制,以避免开销传输(重传数据包和控制数据包)超出带宽。

file:按照非实时传输来设置选项。更多说明请参见 messageapi。

linger=seconds

关闭套接字时等待未发送数据的秒数。默认值为 -1。-1 表示自动(live 模式下为关闭且为 0 秒,file 模式下为开启且为 180 秒)。该选项的取值范围是 0 到 INT_MAX 之间的整数。

tsbpd=1|0

为 true 时,使用基于时间戳的数据包传送(Timestamp-based Packet Delivery)模式。默认行为取决于传输类型:live 模式下启用,file 模式下禁用。

ipv6only=1|0

在使用 IPv6 通配地址时是否接受 IPv4。在 IPv6 通配地址上监听时应设置此项。

更多信息请参阅:https://github.com/Haivision/srt

3.38 srtp

Secure Real-time Transport Protocol。

接受的选项如下:

srtp_in_suite srtp_out_suite

选择输入和输出的编码套件。

支持的值有:

‘AES_CM_128_HMAC_SHA1_80’ ‘SRTP_AES128_CM_HMAC_SHA1_80’ ‘AES_CM_128_HMAC_SHA1_32’ ‘SRTP_AES128_CM_HMAC_SHA1_32’ srtp_in_params srtp_out_params

设置输入和输出编码参数,以二进制块的 base64 编码表示。该二进制块的前 16 字节用作 master key,随后 14 字节用作 master salt。

3.39 subfile

虚拟提取文件或另一个流的一段内容。底层的流必须是可定位(seekable)的。

接受的选项:

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。

TCP url 所需的语法为:

tcp://hostname:port[?options]

options 包含一个以 & 分隔的 key=val 形式选项列表。可以使用标准的百分号编码(并用加号表示空格)来转义键和值。

选项也可以通过命令行选项(或在代码中通过 AVOption)指定。

支持的选项列表如下。

listen=2|1|0

监听传入连接。0 禁用 listen,1 以单客户端模式启用 listen,2 以多客户端模式启用 listen。默认值为 0。

local_addr=addr

用于 tcp 套接字连接的网络接口的本地 IP 地址。

local_port=port

用于 tcp 套接字连接的本地端口。

timeout=microseconds

以微秒为单位设置触发错误的超时时间。

该选项仅在读取模式下有意义:若超过此时间间隔仍未收到数据,则触发错误。

listen_timeout=milliseconds

以毫秒为单位设置 listen 超时时间。

recv_buffer_size=bytes

以字节为单位设置接收缓冲区大小。

send_buffer_size=bytes

以字节为单位设置发送缓冲区大小。

tcp_nodelay=1|0

设置 TCP_NODELAY 以禁用 Nagle 算法。默认值为 0。

备注:目前对套接字的写入并未针对最小化系统调用进行优化,这会降低 TCP_NODELAY 的效率/效果。

tcp_mss=bytes

以字节为单位设置发出的 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)

TLS/SSL URL 所需的语法如下:

tls://hostname:port[?options]

options 包含以 & 分隔的 key=val 形式选项列表。可以使用标准的百分号编码(并用加号表示空格)来转义键和值。

选项也可以通过命令行选项(或在代码中通过 AVOption)指定。

支持的选项列表如下。

ca_file, cafile=filename

包含要视为可信的证书颁发机构(CA)根证书的文件。如果链接的 TLS 库内置了默认值,验证可能无需指定此项即可工作,但并非所有库和配置都内置了默认值。文件必须为 OpenSSL PEM 格式。

tls_verify, verify=1|0

如果启用,则尝试验证正在通信的对端。注意,如果使用 OpenSSL,目前这仅确保对端证书是由 CA 数据库中的某个根证书签名的,但并不验证该证书是否确实与要连接的主机名匹配(其他后端也会验证主机名)。

此项默认已启用。验证对端需要 CA 数据库,某些情况下必须由调用方提供。

cert_file, cert=filename

包含用于与对端进行握手的证书的文件。(以服务器身份在 listen 模式下运行时,对端通常更常要求提供此项,而客户端证书仅在特定配置中才是必需的。)

key_file, key=filename

包含证书私钥的文件。

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

Datagram Transport Layer Security (DTLS)

DTLS URL 所需的语法如下:

dtls://hostname:port[?options]

options 包含以 & 分隔的 key=val 形式选项列表。可以使用标准的百分号编码(并用加号表示空格)来转义键和值。

选项也可以通过命令行选项(或在代码中通过 AVOption)指定。

DTLS 与 TLS 共享大部分选项,但运行于 UDP 而非 TCP 之上。

支持的选项列表如下。

ca_file, cafile=filename

包含要视为可信的证书颁发机构(CA)根证书的文件。如果链接的 TLS 库内置了默认值,验证可能无需指定此项即可工作,但并非所有库和配置都内置了默认值。文件必须为 OpenSSL PEM 格式。

tls_verify, verify=1|0

如果启用,则尝试验证正在通信的对端。注意,如果使用 OpenSSL,目前这仅确保对端证书是由 CA 数据库中的某个根证书签名的,但并不验证该证书是否确实与要连接的主机名匹配。

此项默认已启用。验证对端需要 CA 数据库,某些情况下必须由调用方提供。

cert_file, cert=filename

包含用于与对端进行握手的证书的文件。(以服务器身份在 listen 模式下运行时,对端通常更常要求提供此项,而客户端证书仅在特定配置中才是必需的。)

key_file, key=filename

包含证书私钥的文件。

cert_pem=string

证书的 PEM 字符串。

key_pem=string

私钥的 PEM 字符串。

listen=1|0

如果启用,则在指定的端口上监听连接,并在握手中承担服务器角色而非客户端角色。

mtu=size

设置 DTLS 数据包的最大传输单元(MTU)。

use_srtp=1|0

启用 use_srtp DTLS 扩展。这用于 WebRTC 应用程序中,通过 DTLS 握手建立 SRTP 加密密钥。默认为禁用。

external_sock=1|0

使用外部套接字而不是新建一个。此选项仅在通过 API 与代码交互时才有意义,从 CLI 启用会导致立即失败。默认为禁用。

命令行示例:

创建一个 DTLS 服务器:

ffmpeg -listen 1 -i dtls://hostname:port output

创建一个 DTLS 客户端并向服务器发送数据:

ffmpeg -i input -f format dtls://hostname:port

3.44 udp

User Datagram Protocol.

UDP URL 所需的语法如下:

udp://hostname:port[?options]

options 包含以 & 分隔的 key=val 形式选项列表。可以使用标准的百分号编码(并用加号表示空格)来转义键和值。

选项也可以通过命令行选项(或在代码中通过 AVOption)指定。

如果系统上启用了线程,则会使用环形缓冲区来存储传入的数据,这样可以减少因 UDP 套接字缓冲区溢出而导致的数据丢失。fifo_size 和 overrun_nonfatal 选项与此缓冲区有关。

支持的选项列表如下。

buffer_size=size

设置 UDP 最大套接字缓冲区大小(以字节为单位)。这用于设置接收或发送缓冲区大小,具体取决于该套接字的用途。默认值为输出 32 KB、输入 384 KB。另请参见 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 找出数据包的源地址,并使写入操作在收到 "destination unreachable" 时以 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 广播。

注意,在具有广播风暴防护的网络上,广播可能无法正常工作。

3.44.1 示例

  • 使用 ffmpeg 通过 UDP 向远程端点流式传输:

    ffmpeg -i input -f format udp://hostname:port
    
  • 使用 ffmpeg,以 188 大小的 UDP 数据包并使用较大的输入缓冲区,通过 UDP 以 mpegts 格式进行流式传输:

    ffmpeg -i input -f mpegts udp://hostname:port?pkt_size=188&buffer_size=65535
    
  • 使用 ffmpeg 通过 UDP 从远程端点接收:

    ffmpeg -i udp://[multicast-address]:port ...
    

3.45 unix

Unix 本地套接字

Unix 套接字 URL 所需的语法如下:

unix://filepath

以下参数可以通过命令行选项(或在代码中通过 AVOption)设置:

timeout

超时时间,以毫秒为单位。

listen

以 listen 模式创建 Unix 套接字。

type

选择套接字类型。

‘stream 对应 SOCK_STREAM(可靠、面向流)’ ‘datagram 对应 SOCK_DGRAM(不可靠、面向数据包)’ ‘seqpacket 对应 SOCK_SEQPACKET(可靠、面向数据包)’ pkt_size

面向数据包的套接字(SOCK_DGRAM 和 SOCK_SEQPACKET)的最大数据包大小。如果大于零,则该值将用作 max_packet_size。对 SOCK_STREAM 无效。默认值为 0

3.46 zmq

使用 libzmq 库的 ZeroMQ 异步消息传递。

该库支持在不依赖外部服务器的情况下向多个客户端进行单播流式传输。

流式传输或连接到流所需的语法如下:

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 应大于或等于服务器的 pkt_size,否则接收到的消息可能被截断,从而导致解码错误。

4 参见

ffmpeg, ffplay, ffprobe, libavformat

5 作者

FFmpeg 的开发者们。

关于作者身份的详细信息,请参见项目的 Git 历史(https://git.ffmpeg.org/ffmpeg),例如在 FFmpeg 源代码目录中输入 git log 命令,或浏览在线仓库 https://git.ffmpeg.org/ffmpeg

各组件的维护者列在源代码树中的 MAINTAINERS 文件里。

主机托管由 telepoint.bg 提供