FFmpeg 协议文档

目录

1 说明

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

2 协议选项

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

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

支持的选项列表如下:

protocol_whitelist list (input)

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

3 协议

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

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

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

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

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

rw_timeout

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

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

3.1 amqp

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

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

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

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

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

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

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

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

支持以下选项:

exchange

设置在经纪商上使用的交易所。RabbitMQ有几个预定义的交换器:“amq.direct”是默认的交换器,其中发布者和订阅者必须有匹配的routing_key;“amq.fanout”与广播操作相同(即数据被转发到独立于routing_key的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 mode

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

persistent

交付模式设置为“持久”(2)。这是默认值。消息可能会写入代理的磁盘,具体取决于其设置。

non-persistent

交付模式设置为“非持久”(1)。除非代理面临内存压力,否则消息将保留在代理的内存中。

3.2 async

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

在后台线程中填充数据,以将 I/O 操作与解复用线程分离。

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

3.3 bluray

阅读蓝光播放列表。

接受的选项是:

angle

蓝光角度

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。

网址语法是

cache:URL

3.5 concat

物理级联协议。

按顺序阅读和查找许多资源,就好像它们是独特的资源一样。

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

concat:URL1|URL2|...|URLN

其中URL1URL2、 ...、URLN是要连接的资源的 url,每个 URL 可能指定一个不同的协议。

例如读取一系列文件split1.mpeg, split2.mpeg,split3.mpeg使用ffplay命令:

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

请注意,您可能需要转义字符“|” 这对于许多 shell 来说都是特殊的。

3.6 concatf

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

按顺序阅读和查找许多资源,就好像它们是独特的资源一样。

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

concatf:URL

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

例如读取一系列文件split1.mpeg, split2.mpeg,split3.mpeg在文件中以单独的行列出分割.txt使用ffplay命令:

ffplay concatf:split.txt

在哪里分割.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

例如,要转换内联给定的 GIF 文件ffmpeg

ffmpeg -i "data:image/gif;base64,R0lGODdhCAAIAMIEAAAAAAAA//8AAP//AP///////////////ywAAAAACAAIAAADF0gEDLojDgdGiJdJqUX02iB4E8Q9jUMkADs=" smiley.png

3.9 fd

文件描述符访问协议。

可接受的语法是:

fd: -fd file_descriptor

如果FD未指定时,默认使用 stdout 文件描述符进行写入,使用 stdin 进行读取。与管道协议不同,fd 协议如果对应的是常规文件,则支持 Seek。为了安全起见,fd 协议不支持通过 URL 传递文件描述符。

该协议接受以下选项:

blocksize

设置 I/O 操作最大块大小(以字节为单位)。默认值为 INT_MAX,这将导致不限制请求的块大小。将此值设置得相当低可以缩短用户终止请求的反应时间,如果数据传输速度较慢,则这一点很有价值。

fd

设置文件描述符。

3.10 file

文件访问协议。

读取或写入文件。

文件 URL 可以采用以下形式:

file:filename

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

没有协议前缀的 URL 将被假定为文件 URL。根据构建的不同,看起来像 Windows 路径(开头带有驱动器盘符)的 URL 也将被假定为文件 URL(在类 UNIX 系统的构建中通常不是这种情况)。

例如从文件中读取输入.mpeg使用ffmpeg 命令:

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 匿名密码如果没有设置用户。

ftp-anonymous-password

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

ftp-write-seekable

控制编码期间连接的可查找性。如果设置为 1,则资源应该是可查找的,如果设置为 0,则假定资源不可查找。默认值为 0。

注意:协议可以用作输出,但建议不要这样做,除非特别小心(测试、定制服务器配置等)。不同的 FTP 服务器在查找操作期间的行为方式不同。由于服务器限制,ff* 工具可能会生成不完整的内容。

3.12 gopher

地鼠协议。

3.13 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,则对帖子使用分块传输编码,默认值为 1。

content_type

为 POST 消息或侦听模式设置特定的内容类型。

http_proxy

设置 HTTP 代理通过隧道,例如 http://example.com:1234

headers

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

multiple_requests

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

post_data

设置自定义 HTTP 发布数据。

referer

设置 Referer 标头。在 HTTP 请求中包含“Referer: URL”标头。

user_agent

覆盖 User-Agent 标头。如果未指定,协议将使用描述 libavformat 构建的字符串。(“Lavf/<版本>”)

reconnect_at_eof

如果设置,则 eof 被视为错误并导致重新连接,这对于实时/无限流很有用。

reconnect_streamed

如果设置,则即使是流式传输/不可查找的流也将在出现错误时重新连接。

reconnect_on_network_error

如果连接期间出现 TCP/TLS 错误,则会自动重新连接。

reconnect_on_http_error

要重新连接的 HTTP 状态代码的逗号分隔列表。该列表可以包括特定的状态代码(例如“503”)或字符串“4xx”/“5xx”。

reconnect_delay_max

设置放弃重新连接的最大延迟(以秒为单位)

mime_type

导出 MIME 类型。

http_version

导出 HTTP 响应版本号。通常为“1.0”或“1.1”。

icy

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

icy_metadata_headers

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

icy_metadata_packet

如果服务器支持 ICY 元数据,并且冰冷的设置为 1,这包含服务器发送的最后一个非空元数据包。对中流元数据更新感兴趣的应用程序应该定期对其进行轮询。

cookies

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

offset

设置初始字节偏移量。

end_offset

尝试将请求限制为此偏移量之前的字节。

method

当用作客户端选项时,它设置请求的 HTTP 方法。

当用作服务器选项时,它设置客户端期望的 HTTP 方法。如果预期的 HTTP 方法与接收到的 HTTP 方法不匹配,客户端将收到错误请求响应。取消设置后,暂时不会检查 HTTP 方法。将来这将被自动检测所取代。

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
send_expect_100

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

auth_type

设置HTTP认证类型。没有 Digest 选项,因为此方法需要首先从服务器获取随机数参数,并且不能像 Basic 那样立即使用。

none

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

basic

选择 HTTP 基本身份验证。

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

3.15.1 HTTP Cookie

除非随请求传入 cookie 值,否则某些 HTTP 请求将被拒绝。这饼干选项允许指定这些 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/<version>”形式的字符串。

password

设置 Icecast 安装点密码。

content_type

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

legacy_icecast

这可以支持 Icecast 版本 < 2.4.0,该版本不支持 HTTP PUT 方法,但支持 SOURCE 方法。

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(Microsoft 媒体服务器)协议。

3.19 mmsh

基于 HTTP 的 MMS(Microsoft 媒体服务器)协议。

所需的语法是:

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 表示stdin,1 表示stdout,2 表示stderr)。如果未指定number ,则默认情况下将使用 stdout 文件描述符进行写入,使用 stdin 进行读取。

例如,使用以下命令从标准输入读取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 实践守则 #3 第 2 版 FEC 协议。

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

rtp_mpegts该协议必须与复用器和协议一起使用rtp

所需的语法是:

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

目标 UDP 端口用于port + 2列 FEC 流和port + 4行 FEC 流。

该协议接受以下选项:

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.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服务器上应用程序安装的路径(例如/一经请求/,/快闪/直播/, ETC。)。您也可以通过该选项覆盖从 URI 解析的值rtmp_app

playpath

它是参考app中指定的应用程序播放的资源的路径或名称,可以以“mp4:”为前缀。您也可以通过该选项覆盖从 URI 解析的值rtmp_playpath

listen

充当服务器,侦听传入连接。

timeout

等待传入连接的最长时间。表示听。

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

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 流中通告支持的编解码器列表。此选项应设置为以逗号分隔的 fourcc 值列表,例如hvc1,av01,vp09对于多个编解码器或hvc1仅对于一个编解码器。指定的列表将显示在连接命令消息的“fourCcLive”属性中。

rtmp_flashver

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

rtmp_flush_interval

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

rtmp_live

指定媒体是直播流。无法在直播流中进行恢复或搜索。默认值为any,表示订阅者首先尝试播放播放路径中指定的直播流。如果未找到该名称的直播流,则会播放录制的流。其他可能的值是liverecorded

rtmp_pageurl

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

rtmp_playpath

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

rtmp_subscribe

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

rtmp_swfhash

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

rtmp_swfsize

SWFVerification 所需的解压缩 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

要发布到受密码保护的服务器,请分别传递播放路径和应用程序名称:

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。

workgroup

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

欲了解更多信息,请参阅: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、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)。

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

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

要播放相同的流,请使用ffplay

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

3.33 rtp

实时传输协议。

RTP URL 所需的语法为:rtp://主机名[:端口][? 选项=...]

port指定要使用的 RTP 端口。

支持以下 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

connect()在 UDP 套接字上 执行 a (如果设置为 1)或不执行(如果设置为 0)。

sources=ip[,ip]

列出允许的源 IP 地址。

block=ip[,ip]

列出不允许(阻止)的源 IP 地址。

write_to_source=0|1

将数据包发送到最新收到的数据包的源地址(如果设置为 1)或默认远程地址(如果设置为 0)。

localport=n

将本地 RTP 端口设置为n

localaddr=addr

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

timeout=n

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

这是一个已弃用的选项。反而,本地rtp端口应该使用。

重要笔记:

  1. 如果rtcp端口未设置 RTCP 端口将设置为 RTP 端口值加 1。
  2. 如果本地rtp端口(本地 RTP 端口)未设置任何可用端口将用于本地 RTP 和 RTCP 端口。
  3. 如果本地rtcp端口(本地 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选项可以在/命令行上设置,也可以通过s 或 in ffplay在代码中设置。 AVOptionavformat_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 保持不变。

默认值为 '没有任何'。

allowed_media_types

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

接受以下标志:

video
audio
data
subtitle

默认情况下它接受所有媒体类型。

min_port

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

max_port

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

listen_timeout

设置建立初始连接的最大超时(以秒为单位)。环境 监听超时> 0 套rtsp_flags到 ''。默认值为 -1,这意味着当 '' 模式已设置。

reorder_queue_size

设置要缓冲的数据包数量,以处理重新排序的数据包。

timeout

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

user_agent

覆盖用户代理标头。如果未指定,则默认为 libavformat 标识符字符串。

buffer_size

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

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

当使用 观看多比特率 Real-RTSP 流时,可以使用nnffplay分别选择视频和音频要显示的流,并且可以通过按和即时切换。 -vst -ast 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

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

3.35.1 复用器

提供给 muxer 的 SAP URL 的语法是:

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

RTP 数据包将发送到端口port上的目标,如果未指定端口,则发送到端口 5004。 options是一个- 分隔的列表。支持以下选项: &

announce_addr=address

指定用于发送公告的目标 IP 地址。如果省略,则公告将发送到常用的 SAP 公告多播地址 224.2.127.254 (sap.mcast.net),如果目标是 IPv6 地址,则发送到 ff0e::2:7ffe。

announce_port=port

指定发送公告的端口,如果未指定,则默认为 9875。

ttl=ttl

指定公告和 RTP 数据包的生存时间值,默认为 255。

same_port=0|1

如果设置为 1,则在同一端口对上发送所有 RTP 流。如果为零(默认值),则所有流都在唯一端口上发送,每个流上的端口号比前一个大 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

Haivision 通过 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实际上是一个内部参数,您应该将其设置为不小于 接收缓冲区大小MSS。默认值比较大,因此除非您设置了非常大的接收缓冲区,否则不需要更改此选项。默认值为 25600。

inputbw=bytes/seconds

发送方标称输入速率,以字节/秒为单位。与一起使用 奥海德, 什么时候最大体重设置为relative(0),计算恢复包随主媒体流发送时的最大发送速率: 输入体重*(100+奥海德) / 100 如果输入体重未设置时最大体重设置为相对 (0),实际输入速率在库内评估。默认值为 0。

iptos=tos

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

ipttl=ttl

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

latency=microseconds

基于时间戳的数据包传送延迟。用于吸收丢失数据包重传的突发。该标志同时设置重复潜伏期同等潜伏期 为相同的值。请注意,在版本 1.3.0 之前,这是设置延迟的唯一标志,但这实际上等同于设置同等潜伏期,当一方是发送方并且重复潜伏期 当 side 为接收方时,不支持双向流发送。

listen_timeout=microseconds

设置套接字监听超时。

maxbw=bytes/seconds

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

mode=caller|listener|rendezvous

连接方式。 呼叫者打开客户端连接。 听众启动服务器来侦听传入的连接。 会合使用 Rendez-Vous 连接模式。默认值为调用者。

mss=bytes

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

nakreport=1|0

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

oheadbw=percents

高于输入速率的恢复带宽开销(以百分比为单位)。看输入体重。默认值为 25%。

passphrase=string

HaiCrypt 加密/解密密码字符串,长度从 10 到 79 个字符。密码是发送者和接收者之间共享的秘密。它用于使用 PBKDF2(基于密码的密钥派生函数)生成密钥加密密钥。仅当以下情况时才使用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

设置在实时模式下单次调用发送函数期间传输的数据包的最大声明大小。如果不使用此值(文件模式下的默认值),则使用 0。默认值为-1(自动),通常表示 MPEG-TS;如果您要使用 SRT 发送任何不同类型的有效负载,例如将实时流包装在非常小的帧中,那么您可以使用更大的最大帧大小,但不能大于 1456 字节。

pkt_size=bytes

别名为 '有效负载大小'。

peerlatency=microseconds

延迟值(如中所述重复潜伏期)由发送方设置为接收方的最小值。

pbkeylen=bytes

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

rcvlatency=microseconds

从发送数据包的那一刻到将其传递到接收函数中的接收方应用程序的那一刻起应该经过的时间。这个时间应该是一个足够大的缓冲时间,足以覆盖发送所花费的时间、意外延长的RTT时间以及重传丢失的UDP数据包所需的时间。有效延迟值将是该选项值和以下值中的最大值同等潜伏期 由对端设置。在版本 1.3.0 之前,此选项仅可用潜伏

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 时,数据包丢失报告将延迟,直到收到该数量的数据包为止。每次“迟来的”数据包到来时,重排序容差都会增加,但这并不是由于重传(即,当 UDP 数据包倾向于乱序),最新序列与该数据包序列之间的差异,并且不超过该选项的值。默认情况下它是0,这意味着该机制被关闭,并且丢失报告总是在序列中遇到“间隙”时立即发送。

minversion

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

十六进制版本格式为 0xXXYYZZ,表示人类可读形式的 xyz。

streamid=string

限制为 512 个字符的字符串,可以在连接之前在套接字上设置。侦听器端将能够从 srt_accept 返回的套接字检索此流 ID,并通过具有该设置流 ID 的套接字连接。SRT 不强制对此字符串的内容进行任何特殊解释。此选项在 Rendezvous 连接中没有意义;结果可能只是一侧会覆盖另一侧的值,而哪一方获胜就看运气了

srt_streamid=string

别名为 '流ID' 以避免与 ffmpeg 命令行选项发生冲突。

smoother=live|file

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

messageapi=1|0

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

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

消息API。在这种模式下,您的单个发送指令恰好传递一个有边界的数据(一条消息)。与 Live 模式相反,该消息可能跨越多个 UDP 数据包,唯一的大小限制是它应作为一个整体放入发送缓冲区中。接收方应使用尽可能大的缓冲区来接收消息,否则消息将不会被放弃。当消息不完整时(未收到所有数据包或存在数据包丢失),它不会被放弃。

transtype=live|file

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

live:设置与实时传输相同的选项。在这种模式下,您应该通过一个发送指令仅发送适合一个 UDP 数据包的数据,并且限制为第一个定义的值有效负载大小(此模式下默认为 1316)。此模式下没有速度控制,只有带宽控制(如果配置),以便不超过开销传输(重传和控制数据包)的带宽。

文件:设置非实时传输的选项。看消息API 进一步解释

linger=seconds

套接字关闭时等待未发送数据的秒数。默认值为-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=milliseconds

设置监听超时,以毫秒为单位。

recv_buffer_size=bytes

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

send_buffer_size=bytes

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

tcp_nodelay=1|0

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

备注:目前尚未对写入套接字进行优化,以最大限度地减少系统调用并降低 TCP_NODELAY 的效率/效果。

tcp_mss=bytes

设置传出 TCP 数据包的最大分段大小(以字节为单位)。

以下示例显示如何使用 建立侦听 TCP 连接ffmpeg,然后使用 访问该连接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可以通过命令行选项(或通过s 在代码中) 设置以下参数:

ca_file, cafile=filename

包含被视为可信的证书颁发机构 (CA) 根证书的文件。如果链接的 TLS 库包含默认值,则可能不需要指定该默认值即可进行验证,但并非所有库和设置都内置默认值。该文件必须采用 OpenSSL PEM 格式。

tls_verify=1|0

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

默认情况下禁用此功能,因为在许多情况下它需要调用者提供 CA 数据库。

cert_file, cert=filename

包含在与对等方握手时使用的证书的文件。(当作为服务器在侦听模式下运行时,对等方通常需要这样做,而仅在某些设置中强制要求客户端证书。)

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

要使用以下命令播放来自 TLS/SSL 服务器的流ffplay

ffplay tls://hostname:port

3.43 udp

用户数据报协议。

UDP URL 所需的语法是:

udp://hostname:port[?options]

options包含以 & 分隔的选项列表,其形式为key = val

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

支持的选项列表如下。

buffer_size=size

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

bitrate=bitrate

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

burst_bits=bits

当使用比特率时,它指定数据包突发中的最大位数。

localport=port

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

localaddr=addr

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

pkt_size=size

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

reuse=1|0

明确允许或禁止重用 UDP 套接字。

ttl=ttl

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

connect=1|0

使用 初始化 UDP 套接字connect()。在这种情况下,稍后无法使用 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 广播。

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

3.43.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.44 unix

Unix 本地套接字

Unix 套接字 URL 所需的语法是:

unix://filepath

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

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 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 log有关作者身份的详细信息,请参阅项目的 Git 历史记录 (https://git.ffmpeg.org/ffmpeg),例如通过在 FFmpeg 源目录中键入命令 ,或浏览https://git 的在线存储库。 ffmpeg.org/ffmpeg

文件中列出了特定组件的维护者 维护者在源代码树中。

本文档于2023 年 11 月 17 日使用makeinfo 生成。

由telepoint.bg提供的托管