FFmpeg 协议文档

目录

1 描述

本文档描述了 libavformat 库提供的输入和输出协议。

2 协议选项

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

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

支持的选项列表如下

protocol_whitelist 列表 (输入)

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

3 协议

协议是 FFmpeg 中的配置元素,它允许访问需要特定协议的资源。

当您配置 FFmpeg 构建时,默认情况下会启用所有支持的协议。您可以使用配置选项“–list-protocols”列出所有可用的协议。

您可以使用配置选项“–disable-protocols”禁用所有协议,并使用选项“–enable-protocol=协议”选择性地启用一个协议,或者使用选项“–disable-protocol=协议”禁用特定协议。

ff* 工具的“-protocols”选项将显示支持的协议列表。

所有协议都接受以下选项

rw_timeout

等待(网络)读取/写入操作完成的最大时间,以微秒为单位。

以下是当前可用协议的描述。

3.1 amqp

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

FFmpeg 必须使用 –enable-librabbitmq 编译才能支持 AMQP。还必须运行单独的 AMQP 代理。一个示例开源 AMQP 代理是 RabbitMQ。

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

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

其中 hostname 和 port(默认为 5672)是代理的地址。客户端还可以设置用于身份验证的用户/密码。这两个字段的默认值均为“guest”。可以使用 vhost 设置代理上的虚拟主机名称。默认值为“/”。

多个订阅者可以使用以下命令从代理流式传输数据:

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

在 RabbitMQ 中,发布到代理的所有数据都流经特定的交换机,并且每个订阅客户端都有一个分配的队列/缓冲区。当数据包到达交换机时,它可能会根据交换机和 routing_key 字段复制到客户端的队列中。

支持以下选项

exchange

设置要在代理上使用的交换机。RabbitMQ 有几个预定义的交换机:“amq.direct”是默认的交换机,其中发布者和订阅者必须具有匹配的 routing_key;“amq.fanout”与广播操作相同(即,数据被转发到扇出交换机上的所有队列,与 routing_key 无关);“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 模式

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

持久

传递模式设置为“持久”(2)。这是默认值。消息可能会根据其设置写入代理的磁盘。

非持久

传递模式设置为“非持久”(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

输入流的缓存包装器。

将输入流缓存到临时文件。它为实时流带来了寻址能力。

接受的选项是

read_ahead_limit

当不支持寻址时,允许提前读取的字节数。范围为 -1 到 INT_MAX。-1 表示无限制。默认值为 65536。

URL 语法为

cache:URL

3.5 concat

物理连接协议。

从多个资源按顺序读取和寻址,就像它们是一个唯一的资源一样。

此协议接受的 URL 语法为

concat:URL1|URL2|...|URLN

其中 URL1, URL2, ..., URLN 是要连接的资源的 URL,每个 URL 可以指定不同的协议。

例如,要使用 ffplay 读取文件序列 split1.mpegsplit2.mpegsplit3.mpeg,请使用以下命令

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

请注意,您可能需要转义字符 "|",因为它是许多 shell 的特殊字符。

3.6 concatf

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

从多个资源按顺序读取和寻址,就像它们是一个唯一的资源一样。

此协议接受的 URL 语法为

concatf:URL

其中 URL 是包含要连接的换行符分隔的资源列表的 URL,每个资源可能指定不同的协议。特殊字符必须使用反斜杠或单引号进行转义。请参阅 (ffmpeg-utils)ffmpeg-utils(1) 手册中的“引号和转义”部分

例如,要使用 ffplay 读取在文件 split.txt 中以单独行方式列出的文件序列 split1.mpegsplit2.mpegsplit3.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 将用于读取。与管道协议不同,如果 fd 协议对应于常规文件,则它支持寻址。fd 协议不支持通过 URL 传递文件描述符,以确保安全性。

此协议接受以下选项

blocksize

设置 I/O 操作的最大块大小,以字节为单位。默认值为 INT_MAX,这导致不限制请求的块大小。将此值设置得足够低可以提高用户终止请求的反应时间,如果数据传输速度慢,这一点非常重要。

fd

设置文件描述符。

3.10 file

文件访问协议。

从文件读取或写入文件。

文件 URL 的形式为

file:filename

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

没有协议前缀的 URL 将被假定为文件 URL。根据构建的不同,看起来像以驱动器号开头的 Windows 路径的 URL 也将被假定为文件 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

控制是否在文件上公布寻址能力。0 表示不可寻址,-1 表示自动(对于普通文件可寻址,对于命名管道不可寻址)。

许多解复用器以不同的方式处理可寻址和不可寻址的资源,覆盖此设置可能会加快某些文件的打开速度,但代价是丢失一些功能(例如,准确寻址)。

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 hls

将符合 Apple HTTP Live Streaming 的分段流读取为统一的流。描述分段的 M3U8 播放列表可以是远程 HTTP 资源或本地文件,可以使用标准的文件协议访问。通过在 hls URI 方案名称后指定“+proto”来声明嵌套协议,其中 proto 为“file”或“http”。

hls+http://host/path/to/remote/resource.m3u8
hls+file://path/to/local/resource.m3u8

不建议使用此协议 - hls 解复用器应该也能正常工作(如果不能,请报告问题)并且更完整。要改用 hls 解复用器,只需使用指向 m3u8 文件的直接 URL 即可。

3.15 http

HTTP(超文本传输协议)。

此协议接受以下选项

seekable

控制连接的寻址能力。如果设置为 1,则假定资源可寻址,如果设置为 0,则假定资源不可寻址,如果设置为 -1,则将尝试自动检测是否可寻址。默认值为 -1。

chunked_post

如果设置为 1,则为 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

如果设置为 1,则从服务器请求 ICY (SHOUTcast) 元数据。如果服务器支持此功能,则应用程序必须通过读取 icy_metadata_headersicy_metadata_packet 选项来检索元数据。默认值为 1。

icy_metadata_headers

如果服务器支持 ICY 元数据,则此项包含 ICY 特定的 HTTP 回复头,以换行符分隔。

icy_metadata_packet

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

metadata

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

auth_type

设置 HTTP 身份验证类型。没有摘要式身份验证的选项,因为此方法需要先从服务器获取 nonce 参数,并且不能像基本式身份验证那样直接使用。

none

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

basic

选择 HTTP 基本身份验证。

基本身份验证发送一个 Base64 编码的字符串,其中包含客户端的用户名和密码。Base64 不是一种加密形式,应被视为与以明文形式发送用户名和密码相同(Base64 是一种可逆编码)。如果资源需要保护,请强烈考虑使用基本身份验证以外的身份验证方案。HTTPS/TLS 应与基本身份验证一起使用。如果没有这些额外的安全增强措施,则不应使用基本身份验证来保护敏感或有价值的信息。

send_expect_100

为 POST 发送 Expect: 100-continue 标头。如果设置为 1,它将发送;如果设置为 0,则不发送;如果设置为 -1,则会在适用时尝试发送。默认值为 -1。

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 中实现,因此不得用作命令行选项。

# 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

设置阈值(以字节为单位),用于决定何时应优先使用预读而不是搜索和新的 HTTP 请求。例如,这对于确保使用相同的连接读取大的视频包和中间的小音频包很有用。

3.15.1 HTTP Cookie

某些 HTTP 请求将被拒绝,除非在请求中传递 cookie 值。cookies 选项允许指定这些 cookie。至少,每个 cookie 必须指定一个值以及路径和域。与域和路径都匹配的 HTTP 请求将自动在 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

设置流派。

ice_name

设置流名称。

ice_description

设置流描述。

ice_url

设置流网站 URL。

ice_public

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

user_agent

覆盖 User-Agent 标头。如果未指定,则将使用“Lavf/<版本号>”形式的字符串。

password

设置 Icecast 挂载点密码。

content_type

设置流内容类型。如果与 audio/mpeg 不同,则必须设置此项。

legacy_icecast

这将启用对不支持 HTTP PUT 方法但支持 SOURCE 方法的 Icecast 版本 < 2.4.0 的支持。

tls

建立与 Icecast 的 TLS (HTTPS) 连接。

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

3.17 ipfs

星际文件系统 (IPFS) 协议支持。可以通过所谓的网关访问存储在 IPFS 网络上的文件。这些是 http(s) 端点。此协议包装 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(微软媒体服务器)协议。

所需的语法是

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

3.20 md5

MD5 输出协议。

计算要写入的数据的 MD5 哈希值,并在关闭时将其写入指定的输出或标准输出(如果未指定)。它可用于测试混流器,而无需写入实际文件。

下面是一些示例。

# Write the MD5 hash of the encoded AVI file to the file output.avi.md5.
ffmpeg -i input.flv -f avi -y md5:output.avi.md5

# Write the MD5 hash of the encoded AVI file to stdout.
ffmpeg -i input.flv -f avi -y md5:

请注意,某些格式(通常为 MOV)需要输出协议是可搜索的,因此它们将无法与 MD5 输出协议一起使用。

3.21 pipe

UNIX 管道访问协议。

从 UNIX 管道读取和写入。

接受的语法为

pipe:[number]

如果未指定 fd,则 number 是与管道的文件描述符对应的数字(例如,0 表示标准输入,1 表示标准输出,2 表示标准错误)。如果未指定 number,则默认情况下将使用标准输出文件描述符进行写入,标准输入进行读取。

例如,使用 ffmpeg 从标准输入读取

cat test.wav | ffmpeg -i pipe:0
# ...this is the same as...
cat test.wav | ffmpeg -i pipe:

例如,使用 ffmpeg 写入标准输出

ffmpeg -i test.wav -f avi pipe:1 | cat > test.avi
# ...this is the same as...
ffmpeg -i test.wav -f avi pipe: | cat > test.avi

此协议接受以下选项

blocksize

设置 I/O 操作的最大块大小,以字节为单位。默认值为 INT_MAX,这导致不限制请求的块大小。将此值设置得足够低可以提高用户终止请求的反应时间,如果数据传输速度慢,这一点非常重要。

fd

设置文件描述符。

请注意,某些格式(通常为 MOV)需要输出协议是可搜索的,因此它们将无法与管道输出协议一起使用。

3.22 prompeg

Pro-MPEG Code of Practice #3 Release 2 FEC 协议。

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

此协议必须与 rtp_mpegts 混流器和 rtp 协议一起使用。

所需的语法是

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

目标 UDP 端口分别为列 FEC 流的 port + 2 和行 FEC 流的 port + 4

此协议接受以下选项

l=n

列数 (4-20,L x D <= 100)

d=n

行数 (4-20,L x D <= 100)

使用示例

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

3.23 rist

可靠的互联网流传输协议

接受的选项是

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 日志消息的日志级别。只有在您明确想要启用调试级别消息或数据包丢失模拟时才需要设置此项,否则将遵守常规日志级别。

secret

设置加密密钥的覆盖,默认情况下未设置。

encryption

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

3.24 rtmp

实时消息协议。

实时消息协议 (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

等待传入连接的最大时间。暗示监听。

此外,可以通过命令行选项(或在代码中通过 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 流中声明支持的编解码器列表。此选项应设置为以逗号分隔的四字符代码值列表,例如 hvc1,av01,vp09 表示多个编解码器,或 hvc1 表示仅一个编解码器。指定的列表将显示在 Connect Command Message 的 "fourCcLive" 属性中。

rtmp_flashver

用于运行 SWF 播放器的 Flash 插件的版本。默认为 LNX 9,0,124,2。(发布时,默认为 FMLE/3.0 (兼容;<libavformat 版本>)。)

rtmp_flush_interval

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

rtmp_live

指定媒体是直播流。直播流中无法恢复或搜索。默认值为 any,这意味着订阅者首先尝试播放 playpath 中指定的直播流。如果找不到该名称的直播流,则播放录制的流。其他可能的值为 liverecorded

rtmp_pageurl

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

rtmp_playpath

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

rtmp_subscribe

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

rtmp_swfhash

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

rtmp_swfsize

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

例如,要使用 ffplay 从 RTMP 服务器 "myserver" 上的应用程序 "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.25 rtmpe

加密的实时消息协议。

加密的实时消息协议 (RTMPE) 用于在标准加密原语中流式传输多媒体内容,包括 Diffie-Hellman 密钥交换和 HMACSHA256,生成一对 RC4 密钥。

3.26 rtmps

通过安全 SSL 连接的实时消息协议。

实时消息协议 (RTMPS) 用于通过加密连接流式传输多媒体内容。

3.27 rtmpt

通过 HTTP 隧道传输的实时消息协议。

通过 HTTP 隧道传输的实时消息协议 (RTMPT) 用于在 HTTP 请求中流式传输多媒体内容以穿越防火墙。

3.28 rtmpte

通过 HTTP 隧道传输的加密实时消息协议。

通过 HTTP 隧道传输的加密实时消息协议 (RTMPTE) 用于在 HTTP 请求中流式传输多媒体内容以穿越防火墙。

3.29 rtmpts

通过 HTTPS 隧道传输的实时消息协议。

通过 HTTPS 隧道传输的实时消息协议 (RTMPTS) 用于在 HTTPS 请求中流式传输多媒体内容以穿越防火墙。

3.30 libsmbclient

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

需要以下语法。

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

此协议接受以下选项。

timeout

设置底层低级别操作使用的套接字 I/O 操作的超时时间(以毫秒为单位)。 默认值为 -1,表示未指定超时。

truncate

如果设置为 1,则在写入时截断现有文件。值为 0 则阻止截断。默认值为 1。

工作组

设置用于建立连接的工作组。默认情况下,未指定工作组。

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

3.31 libssh

通过 libssh 的安全文件传输协议

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

通过 librtmp 支持的实时消息协议及其变体。

需要在配置期间存在 librtmp 头文件和库。您需要使用“–enable-librtmp”显式配置构建。如果启用,这将替换本机 RTMP 协议。

此协议提供了支持 RTMP、HTTP 隧道中的 RTMP (RTMPT)、加密 RTMP (RTMPE)、SSL/TLS 上的 RTMP (RTMPS) 以及这些加密类型的隧道变体 (RTMPTE, RTMPS) 所需的大多数客户端功能和一些服务器功能。

所需的语法是

rtmp_proto://server[:port][/app][/playpath] options

其中 rtmp_proto 是字符串 "rtmp"、"rtmpt"、"rtmpe"、"rtmps"、"rtmpte"、"rtmpts" 之一,分别对应于每个 RTMP 变体,serverportappplaypath 的含义与为 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.33 rtp

实时传输协议。

RTP URL 的必需语法为

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

重要提示

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

3.34 rtsp

实时流协议。

RTSP 在 libavformat 中技术上不是协议处理程序,它是一个解复用器和复用器。解复用器同时支持正常的 RTSP(数据通过 RTP 传输;例如,Apple 和 Microsoft 使用此协议)和 Real-RTSP(数据通过 RDT 传输)。

复用器可用于使用 RTSP ANNOUNCE 将流发送到支持它的服务器(目前是 Darwin Streaming Server 和 Mischa Spiegelmock 的 RTSP 服务器)。

RTSP URL 的必需语法为

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

在 RTP 中对 H.264 使用模式 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 可用作 RTSP RTP 传输,则首先尝试 TCP 进行 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_timeout > 0 会将 rtsp_flags 设置为 ‘listen’。默认值为 -1,表示当设置 ‘listen’ 模式时,超时时间无限。

reorder_queue_size

设置用于处理重新排序的数据包的缓冲数据包数。

timeout

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

user_agent

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

buffer_size

设置最大套接字缓冲区大小(以字节为单位)。

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

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

3.34.3 示例

以下示例均使用 ffplayffmpeg 工具。

  • 通过 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

会话宣告协议 (SAP) (RFC 2974)。从技术上讲,这并非 libavformat 中的协议处理程序,而是一个复用器和解复用器。它用于 RTP 流的信令,通过在单独的端口上定期宣告流的 SDP。

3.35.1 封装器

提供给复用器的 SAP URL 的语法是

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

RTP 数据包被发送到 destinationport 端口,如果没有指定端口,则发送到端口 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 数据包的生存时间值,默认为 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

以及在 ffplay 中通过 IPv6 观看

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

流控制传输协议。

接受的 URL 语法是

sctp://host:port[?options]

该协议接受以下选项

listen

如果设置为任何值,则监听传入的连接。默认情况下完成传出连接。

max_streams

设置最大流数。默认情况下不设置限制。

3.37 srt

通过 libsrt 的海维森安全可靠传输协议。

SRT URL 的支持语法是

srt://hostname:port[?options]

options 包含一个 & 分隔的 key=val 形式的选项列表。

options srt://hostname:port

options 包含一个 ’-key val’ 选项列表。

此协议接受以下选项。

connect_timeout=milliseconds

连接超时;SRT 在 RTT > 1500 毫秒(2 次握手交换)且默认连接超时为 3 秒的情况下无法连接。此选项适用于调用方和会合连接模式。会合模式的连接超时设置为 10 倍值(可以作为早期版本此连接问题的解决方法)。

ffs=bytes

飞行标志大小(窗口大小),以字节为单位。FFS 实际上是一个内部参数,您应将其设置为不小于 recv_buffer_sizemss。默认值相对较大,因此除非您设置非常大的接收器缓冲区,否则无需更改此选项。默认值为 25600。

inputbw=bytes/seconds

发送方标称输入速率,以字节/秒为单位。与 oheadbw 一起使用,当 maxbw 设置为相对值 (0) 时,计算当恢复数据包与主媒体流一起发送时的最大发送速率:inputbw * (100 + oheadbw) / 100 如果 inputbw 未设置而 maxbw 设置为相对值 (0),则在库内部评估实际输入速率。默认值为 0。

iptos=tos

IP 服务类型。仅适用于发送方。默认值为 0xB8。

ipttl=ttl

IP 生存时间。仅适用于发送方。默认值为 64。

latency=microseconds

基于时间戳的数据包传递延迟。用于吸收丢失数据包重传的突发。此标志将 rcvlatencypeerlatency 都设置为相同的值。请注意,在 1.3.0 版本之前,这是设置延迟的唯一标志,但这实际上等效于在发送方侧设置 peerlatency,在接收方侧设置 rcvlatency,并且不支持双向流发送。

listen_timeout=microseconds

设置套接字监听超时。

maxbw=bytes/seconds

最大发送带宽,以字节/秒为单位。-1 无限(CSRTCC 限制为 30mbps)0 相对于输入速率(请参阅 inputbw)>0 绝对限制值 默认值为 0(相对)。

mode=caller|listener|rendezvous

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

mss=bytes

最大段大小,以字节为单位。用于缓冲区分配和使用数据包计数器假设完全填充的数据包进行速率计算。使用对等体之间最小的 MSS。这在整个互联网中默认为 1500。这是 UDP 数据包的最大大小,只能减小,除非您有一些不寻常的专用网络设置。默认值为 1500。

nakreport=1|0

如果设置为 1,则接收器将定期发送 ‘UMSG_LOSSREPORT‘ 消息,直到重新传输或有意丢弃丢失的数据包。默认值为 1。

oheadbw=percents

高于输入速率的恢复带宽开销,以百分比表示。请参阅 inputbw。默认值为 25%。

passphrase=string

HaiCrypt 加密/解密密码短语字符串,长度为 10 到 79 个字符。密码短语是发送方和接收方之间的共享密钥。它用于使用 PBKDF2(基于密码的密钥派生函数)生成密钥加密密钥。仅当 pbkeylen 为非零值时才使用。仅当接收到的数据被加密时,才在接收器上使用。无法恢复配置的密码短语(只写)。

enforced_encryption=1|0

如果为真,则连接双方必须设置相同的密码(包括空密码,即不加密)。如果密码不匹配或只有一方未加密,则连接将被拒绝。默认为真。

kmrefreshrate=packets

加密密钥切换为新密钥之前要传输的数据包数量。默认为 -1。-1 表示自动(在 srt 库中为 0x1000000)。此选项的范围是 0 到 INT_MAX 之间的整数。

kmpreannounce=packets

发送新加密密钥与发生切换之间的时间间隔。此值也适用于发生切换后到旧加密密钥停用之间的时间间隔。默认为 -1。-1 表示自动(在 srt 库中为 0x1000)。此选项的范围是 0 到 INT_MAX 之间的整数。

snddropdelay=microseconds

发送方在丢弃数据包之前的额外延迟。此延迟将添加到默认的丢弃延迟时间间隔值中。

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

payload_size=bytes

设置在实时模式下,单次调用发送函数时传输的数据包的最大声明大小。如果未使用此值,则使用 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

太晚的数据包丢弃。在接收方启用时,它会跳过未及时交付的丢失数据包,并在它们的播放时间到来时将后续数据包交付给应用程序。它还会向发送方发送伪 ACK。在发送方启用且在接收对等方启用时,发送方会丢弃没有机会及时交付的旧数据包。如果接收方支持,则在发送方会自动启用此选项。

sndbuf=bytes

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

rcvbuf=bytes

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

接收缓冲区不得大于 ffs

lossmaxttl=packets

重排序容差可能增长到的值。当重排序容差 > 0 时,数据包丢失报告将延迟到该数量的数据包到达。每次有“迟到”的数据包到达时(而不是由于重传),重排序容差都会增加,增加的幅度是最新序列与此数据包序列之间的差异,但不得超过此选项的值。默认情况下为 0,这意味着此机制已关闭,并且在序列中出现“间隙”时,始终会立即发送丢失报告。

minversion

对等方所需的最低 SRT 版本。与不满足最低版本要求的对等方的连接将被拒绝。

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

streamid=string

一个限制为 512 个字符的字符串,可以在连接之前在套接字上设置。监听方可以从 srt_accept 返回的套接字中检索此流 ID,该套接字由设置了该流 ID 的套接字连接。SRT 不会对该字符串的内容强制执行任何特殊的解释。此选项在 Rendezvous 连接中没有意义;结果可能是一方会简单地覆盖另一方的值,而哪一方获胜取决于运气。

srt_streamid=string

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

smoother=live|file

用于该套接字传输的 Smoother 类型,它负责传输和拥塞控制。连接双方的 Smoother 类型必须完全相同,否则连接将被拒绝。

messageapi=1|0

设置后,此套接字使用消息 API,否则使用缓冲区 API。请注意,在实时模式下(请参阅 transtype),只有消息 API 可用。在文件模式下,您可以选择使用两种模式之一。

流 API(默认,当此选项为 false 时)。在此模式下,您可以使用一个发送指令发送任意数量的数据,甚至可以使用直接从文件读取的专用函数。内部机制将处理任何速度和拥塞控制。接收时,您也可以接收任意数量的数据,未提取的数据将等待下次调用。在流模式下,数据部分之间没有边界。

消息 API。在此模式下,您的单个发送指令传递正好一个具有边界的数据块(消息)。与实时模式相反,此消息可以跨越多个 UDP 数据包,唯一的尺寸限制是它应作为一个整体适合发送缓冲区。接收方应使用尽可能大的缓冲区来接收消息,否则该消息将不会被释放。当消息不完整时(未收到所有数据包或有数据包丢失),它将不会被释放。

transtype=live|file

设置套接字的传输类型,特别是,设置此选项会将多个其他参数设置为特定传输类型所需的默认值。

live: 设置为实时传输的选项。在此模式下,您应该仅通过一个发送指令发送适合一个 UDP 数据包的数据量,并限制为首先在 payload_size 中定义的值(在此模式下默认为 1316)。此模式下没有速度控制,只有带宽控制(如果配置了),以避免超出具有开销传输(重传和控制数据包)的带宽。

file: 设置为非实时传输的选项。有关更多解释,请参阅 messageapi

linger=秒数

套接字在关闭时等待未发送数据的秒数。默认为 -1。-1 表示自动(在实时模式下关闭,为 0 秒;在文件模式下打开,为 180 秒)。此选项的范围是 0 到 INT_MAX 之间的整数。

tsbpd=1|0

为 true 时,使用基于时间戳的数据包传递模式。默认行为取决于传输类型:在实时模式下启用,在文件模式下禁用。

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

3.38 srtp

安全实时传输协议。

接受的选项是

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 个字节用作主密钥,接下来的 14 个字节用作主盐。

3.39 subfile

虚拟提取文件或另一个流的片段。底层流必须是可查找的。

接受的选项

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

传输控制协议。

TCP URL 的必需语法是

tcp://hostname:port[?options]

options 包含一个 & 分隔的 key=val 形式的选项列表。

以下是支持的选项列表。

listen=2|1|0

侦听传入的连接。0 禁用侦听,1 在单客户端模式下启用侦听,2 在多客户端模式下启用侦听。默认值为 0。

local_addr=addr

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

local_port=port

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

timeout=microseconds

设置引发错误超时,以微秒表示。

此选项仅在读取模式下相关:如果在此时间间隔内没有数据到达,则引发错误。

listen_timeout=毫秒

设置侦听超时,以毫秒表示。

recv_buffer_size=bytes

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

send_buffer_size=bytes

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

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

传输层安全性 (TLS) / 安全套接字层 (SSL)

TLS/SSL URL 的必需语法是

tls://hostname:port[?options]

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

ca_file, cafile=文件名

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

tls_verify=1|0

如果启用,请尝试验证我们正在与之通信的对等方。请注意,如果使用 OpenSSL,则当前仅确保对等证书由 CA 数据库中的根证书之一签名,但它不验证证书是否实际上与我们尝试连接的主机名匹配。(对于其他后端,也会验证主机名。)

默认情况下禁用此项,因为它在许多情况下需要调用方提供 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 udp

用户数据报协议。

UDP URL 的必需语法是

udp://hostname:port[?options]

options 包含一个 & 分隔的 key=val 形式的选项列表。

如果系统上启用了线程,则使用循环缓冲区来存储传入的数据,这允许减少由于 UDP 套接字缓冲区溢出而导致的数据丢失。fifo_sizeoverrun_nonfatal 选项与此缓冲区相关。

以下是支持的选项列表。

buffer_size=size

设置 UDP 最大套接字缓冲区大小(以字节为单位)。这用于设置接收或发送缓冲区大小,具体取决于套接字的用途。输出默认为 32 KB,输入默认为 384 KB。另请参阅 fifo_size

bitrate=比特率

如果设置为非零,则如果输入有足够的包来维持它,则输出将具有指定的恒定比特率。

burst_bits=比特

当使用 bitrate 时,此项指定数据包突发的最大比特数。

localport=端口

覆盖要绑定的本地 UDP 端口。

localaddr=addr

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

pkt_size=大小

设置 UDP 数据包的大小(以字节为单位)。

reuse=1|0

显式允许或禁止重用 UDP 套接字。

ttl=ttl

设置生存时间值(仅用于多播)。

connect=1|0

使用 connect() 初始化 UDP 套接字。在这种情况下,以后无法使用 ff_udp_set_remote_url 更改目标地址。如果一开始不知道目标地址,也可以在 ff_udp_set_remote_url 中指定此选项。这允许使用 getsockname 找出数据包的源地址,并且如果收到“目标不可达”消息,则使写入返回 AVERROR(ECONNREFUSED)。对于接收,这具有仅接收来自指定对等地址/端口的数据包的好处。

sources=地址[,地址]

仅接收从指定地址发送的数据包。在多播的情况下,也仅订阅来自这些地址的多播流量。

block=地址[,地址]

忽略来自指定地址的数据包。对于组播,还会排除组播订阅中的源地址。

fifo_size=单位

设置 UDP 接收循环缓冲区大小,以 188 字节大小的数据包数量表示。如果未指定,则默认为 7*4096。

overrun_nonfatal=1|0

在 UDP 接收循环缓冲区溢出的情况下继续运行。默认值为 0。

timeout=microseconds

设置引发错误超时,以微秒表示。

此选项仅在读取模式下相关:如果在此时间间隔内没有数据到达,则引发错误。

broadcast=1|0

显式允许或禁止 UDP 广播。

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

3.43.1 示例

  • 使用 ffmpeg 通过 UDP 流式传输到远程端点
    ffmpeg -i input -f format udp://hostname:port
    
  • 使用 ffmpeg 以 mpegts 格式通过 UDP 流式传输,使用 188 大小的 UDP 数据包,并使用大型输入缓冲区
    ffmpeg -i input -f mpegts udp://hostname:port?pkt_size=188&buffer_size=65535
    
  • 使用 ffmpeg 通过 UDP 从远程端点接收
    ffmpeg -i udp://[multicast-address]:port ...
    

3.44 unix

Unix 本地套接字

Unix 套接字 URL 的必需语法为

unix://filepath

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

timeout

超时时间,单位为毫秒。

listen

在监听模式下创建 Unix 套接字。

3.45 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 发布-订阅模式实现向多个客户端的流式传输。服务器端绑定到端口并发布数据。客户端连接到服务器(通过 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 中列出。

本文档于 2025 年 1 月 21 日 使用 makeinfo 生成。

telepoint.bg 提供托管