目录

1. 描述

2. 协议选项

protocol_whitelist(输入)

3. 协议

rw_timeout

3.1 amqp

exchange

routing_key

pkt_size

connection_timeout

delivery_mode(模式)

3.2 async

3.3 bluray

angle

chapter

playlist

3.4 cache

read_ahead_limit

3.5 concat

3.6 concatf

3.7 crypto

key

iv

3.8 data

3.9 fd

blocksize

fd

3.10 file

truncate

blocksize

follow

seekable

3.11 ftp

timeout

ftp-user

ftp-password

ftp-anonymous-password

ftp-write-seekable

3.12 gopher

3.13 gophers

3.14 hls

3.15 http

seekable

chunked_post

http_proxy

headers

content_type

user_agent

referer

multiple_requests

post_data

mime_type

http_version

cookies

icy

icy_metadata_headers

icy_metadata_packet

metadata

auth_type

send_expect_100

location

offset

end_offset

method

reconnect

reconnect_at_eof

reconnect_on_network_error

reconnect_on_http_error

reconnect_streamed

reconnect_delay_max

reconnect_max_retries

reconnect_delay_total_max

respect_retry_after

listen

resource

reply_code

short_seek_size

3.15.1 HTTP Cookie

3.16 Icecast

ice_genre

ice_name

ice_description

ice_url

ice_public

user_agent

password

content_type

legacy_icecast

tls

3.17 ipfs

gateway

3.18 mmst

3.19 mmsh

3.20 md5

3.21 pipe

blocksize

fd

3.22 prompeg

l=n

d=n

3.23 rist

rist_profile

buffer_size

fifo_size

overrun_nonfatal=1|0

pkt_size

log_level

secret

encryption

3.24 rtmp

用户名(username)

密码(password)

服务器(server)

端口(port)

应用(app)

播放路径(playpath)

listen

timeout

rtmp_app

rtmp_buffer

rtmp_conn

rtmp_enhanced_codecs

rtmp_flashver

rtmp_flush_interval

rtmp_live

rtmp_pageurl

rtmp_playpath

rtmp_subscribe

rtmp_swfhash

rtmp_swfsize

rtmp_swfurl

rtmp_swfverify

rtmp_tcurl

tcp_nodelay=1|0

3.25 rtmpe

3.26 rtmps

3.27 rtmpt

3.28 rtmpte

3.29 rtmpts

3.30 libsmbclient

timeout

truncate

workgroup

3.31 libssh

timeout

truncate

private_key

3.32 librtmp(rtmp、rtmpe、rtmps、rtmpt、rtmpte)

3.33 rtp

ttl=n

rtcpport=n

localrtpport=n

localrtcpport=n

pkt_size=n

buffer_size=size

connect=0|1

sources=ip[,ip]

block=ip[,ip]

write_to_source=0|1

localport=n

localaddr=addr

timeout=n

3.34 rtsp

3.34.1 复用器

rtsp_transport

rtsp_flags

min_port

max_port

buffer_size

pkt_size

3.34.2 解复用器

initial_pause

rtsp_transport

rtsp_flags

allowed_media_types

min_port

max_port

listen_timeout

reorder_queue_size

timeout

user_agent

buffer_size

3.34.3 示例

3.35 sap

3.35.1 复用器

announce_addr = 地址

announce_port = 端口

ttl=ttl

same_port=0|1

3.35.2 解复用器

3.36 sctp

listen

max_streams

3.37 srt

connect_timeout = 毫秒

ffs = 字节

inputbw = 字节 / 秒

iptos=tos

ipttl=ttl

latency = 微秒

listen_timeout = 微秒

maxbw = 字节 / 秒

mode=caller|listener|rendezvous

mss = 字节

nakreport=1|0

oheadbw = 百分比

passphrase = 字符串

enforced_encryption=1|0

kmrefreshrate = 数据包数

kmpreannounce = 数据包数

snddropdelay = 微秒

payload_size = 字节

pkt_size = 字节

peerlatency = 微秒

pbkeylen = 字节

rcvlatency = 微秒

recv_buffer_size = 字节

send_buffer_size = 字节

timeout = 微秒

tlpktdrop=1|0

sndbuf = 字节

rcvbuf = 字节

lossmaxttl = 数据包数

minversion

streamid = 字符串

srt_streamid = 字符串

smoother=live|file

messageapi=1|0

transtype=live|file

linger = 秒

tsbpd=1|0

3.38 srtp

srtp_in_suite

srtp_out_suite

srtp_in_params

srtp_out_params

3.39 subfile

start

end

3.40 tee

3.41 tcp

listen=2|1|0

local_addr = 地址

local_port = 端口

timeout = 微秒

listen_timeout = 毫秒

recv_buffer_size = 字节

send_buffer_size = 字节

tcp_nodelay=1|0

tcp_mss = 字节

3.42 tls

ca_file、cafile = 文件名

tls_verify=1|0

cert_file、cert = 文件名

key_file、key = 文件名

listen=1|0

http_proxy

3.43 udp

buffer_size = 大小

bitrate = 比特率

burst_bits = 比特数

localport = 端口

localaddr = 地址

pkt_size = 大小

reuse=1|0

ttl=ttl

connect=1|0

sources = 地址 [, 地址]

block = 地址 [, 地址]

fifo_size = 单位

overrun_nonfatal=1|0

timeout = 微秒

broadcast=1|0

3.43.1 示例

3.44 unix

timeout

listen

3.45 zmq

pkt_size


1. 描述

本文档详细说明 libavformat 库提供的输入和输出协议。

2. 协议选项

libavformat 库提供部分通用全局选项,可应用于所有协议。此外,每个协议还支持特定于该组件的 “私有选项”。

可通过以下方式设置选项:

  • 在 FFmpeg 工具中指定 -option value
  • 在 AVFormatContext 选项中显式设置值;
  • 编程使用时,通过 libavutil/opt.h API 进行设置。

支持的选项如下:

protocol_whitelist(输入)

设置以英文逗号分隔的允许使用的协议列表。"ALL" 表示匹配所有协议,前缀为 "-" 的协议表示禁用。默认情况下允许所有协议,但嵌套协议(被其他协议调用的协议)会受限于对应协议的子集。

3. 协议

协议是 FFmpeg 中经过配置的组件,用于访问需要特定协议的资源。

配置 FFmpeg 编译环境时,所有受支持的协议默认均已启用。可通过配置选项 --list-protocols 列出所有可用协议。

  • 可使用配置选项 --disable-protocols 禁用所有协议;
  • 可通过 --enable-protocol=PROTOCOL 选择性启用特定协议;
  • 可通过 --disable-protocol=PROTOCOL 禁用特定协议。

ff* 工具的 -protocols 选项会显示所有受支持的协议。

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

rw_timeout

网络读写操作的最大等待时间,单位为微秒。

以下是当前可用协议的详细说明:

3.1 amqp

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

FFmpeg 必须通过 --enable-librabbitmq 编译选项才能支持 AMQP,且需单独运行 AMQP 代理(开源示例为 RabbitMQ)。

启动代理后,FFmpeg 客户端可通过以下命令向代理推送流数据:

plaintext

ffmpeg -re -i input -f mpegts amqp://[[用户名]:[密码]@]主机名[:端口][/虚拟主机]
  • 主机名和端口(默认 5672)为代理服务器地址;
  • 可指定用户名 / 密码进行身份验证,默认均为 "guest";
  • 虚拟主机名称可通过 vhost 指定,默认值为 "/"。

多个订阅者可通过以下命令从代理拉取流数据:

ffplay amqp://[[用户名]:[密码]@]主机名[:端口][/虚拟主机]

在 RabbitMQ 中,所有推送到代理的数据都会通过特定交换机流转,每个订阅客户端会分配对应的队列 / 缓冲区。数据包到达交换机后,会根据交换机类型和路由键(routing_key)字段决定是否复制到客户端队列。

支持的选项:

exchange

设置代理使用的交换机。RabbitMQ 包含多个预定义交换机:

  • "amq.direct"(默认):发布者和订阅者必须使用匹配的路由键;
  • "amq.fanout":等同于广播操作,数据会转发到该交换机下的所有队列,与路由键无关;
  • "amq.topic":类似 "amq.direct",但支持更复杂的模式匹配(详见 RabbitMQ 文档)。
routing_key

设置路由键,默认值为 "amqp"。在 "amq.direct" 和 "amq.topic" 交换机中,路由键用于决定是否将数据包写入订阅者队列。

pkt_size

发送 / 接收至代理的每个数据包的最大大小,默认值为 131072 字节,最小值为 4096 字节,最大值为任意大整数(int 类型可表示范围)。接收数据包时,该选项用于设置 FFmpeg 内部缓冲区大小,需大于或等于推送到代理的数据包大小,否则接收的消息可能被截断,导致解码错误。

connection_timeout

与代理建立初始连接的超时时间(单位:秒),默认值为 rw_timeout,若未设置 rw_timeout 则默认 5 秒。

delivery_mode(模式)

设置发送至代理的每条消息的投递模式,支持以下值:

  • persistent:投递模式设为 “持久化”(值为 2),默认值。消息可能会根据代理配置写入磁盘;
  • non-persistent:投递模式设为 “非持久化”(值为 1)。消息仅存于代理内存,除非代理面临内存压力。

3.2 async

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

在后台线程中填充数据,实现 I/O 操作与解复用线程解耦。

URL 格式:

async:URL
async:http://主机/资源
async:cache:http://主机/资源

3.3 bluray

读取蓝光光盘(BluRay)播放列表。

支持的选项:

angle

蓝光光盘角度

chapter

起始章节(1...N)

playlist

要读取的播放列表(路径格式:BDMV/PLAYLIST/?????.mpls)

示例:

  • 读取挂载到 /mnt/bluray 的蓝光光盘中最长的播放列表:
    bluray:/mnt/bluray
    
  • 读取挂载到 /mnt/bluray 的蓝光光盘中播放列表 4 的角度 2,从第 2 章节开始:
    -playlist 4 -angle 2 -chapter 2 bluray:/mnt/bluray
    

3.4 cache

输入流的缓存包装器。

将输入流缓存到临时文件,为直播流提供 seek(定位)能力。

支持的选项:

read_ahead_limit

当不支持 seek 时的预读字节数,范围为 -1 到 INT_MAX。-1 表示无限制,默认值为 65536 字节。

URL 格式:

cache:URL

3.5 concat

物理拼接协议。

按顺序读取和定位多个资源,如同操作单个资源。

该协议支持的 URL 格式:

concat:URL1|URL2|...|URLN

其中 URL1、URL2、...、URLN 为待拼接资源的 URL,每个 URL 可指定不同协议。

示例:使用 ffplay 读取 split1.mpeg、split2.mpeg、split3.mpeg 三个文件的拼接流:

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

注意:由于 "|" 字符在多数 Shell 中具有特殊含义,可能需要进行转义。

3.6 concatf

基于换行符分隔的资源列表的物理拼接协议。

按顺序读取和定位多个资源,如同操作单个资源。

该协议支持的 URL 格式:

concatf:URL

其中 URL 指向一个文件,该文件包含以换行符分隔的待拼接资源列表,每个资源可指定不同协议。特殊字符需使用反斜杠或单引号转义(详见 ffmpeg-utils (1) 手册中的 “引用与转义” 章节)。

示例:split.txt 文件中按行列出 split1.mpeg、split2.mpeg、split3.mpeg,使用 ffplay 读取拼接流:

ffplay concatf:split.txt

split.txt 内容:

split1.mpeg
split2.mpeg
split3.mpeg

3.7 crypto

AES 加密流读取协议。

支持的选项:

key

通过十六进制字符串设置 AES 解密密钥二进制块。

iv

通过十六进制字符串设置 AES 解密初始化向量(IV)二进制块。

支持的 URL 格式:

crypto:URL
crypto+URL

3.8 data

URI 内嵌数据协议(详见 http://en.wikipedia.org/wiki/Data_URI_scheme)。

示例:使用 ffmpeg 转换内嵌的 GIF 文件:

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

3.9 fd

文件描述符访问协议。

支持的语法:

fd: -fd file_descriptor

若未指定文件描述符,默认情况下:写入操作使用标准输出(stdout)文件描述符,读取操作使用标准输入(stdin)文件描述符。与管道(pipe)协议不同,若文件描述符对应常规文件,fd 协议支持 seek 操作。为安全起见,fd 协议不支持通过 URL 传递文件描述符。

支持的选项:

blocksize

设置 I/O 操作的最大块大小(单位:字节),默认值为 INT_MAX(不限制请求的块大小)。将该值设置为合理的较小值可提升用户终止请求的响应速度,适用于数据传输较慢的场景。

fd

设置文件描述符。

3.10 file

文件访问协议。

用于读取或写入本地文件。

文件 URL 格式:

plaintext

file:filename

未指定协议前缀的 URL 会被视为文件 URL。根据编译环境,类似 Windows 路径(以盘符开头)的 URL 也可能被视为文件 URL(类 Unix 系统编译版本通常不支持此规则)。

示例:使用 ffmpeg 读取 input.mpeg 文件:

plaintext

ffmpeg -i file:input.mpeg output.mpeg

支持的选项:

truncate

写入时是否截断已有文件,1 表示截断,0 表示不截断,默认值为 1。

blocksize

设置 I/O 操作的最大块大小(单位:字节),默认值为 INT_MAX(不限制请求的块大小)。将该值设置为合理的较小值可提升用户终止请求的响应速度,适用于慢速存储介质上的文件。

follow

若设置为 1,协议会在文件末尾重试读取操作,支持读取正在被写入的文件。需通过 rw_timeout 选项或中断回调(API 用户)设置终止条件。

seekable

控制是否声明文件支持 seek 操作:0 表示不支持,-1 表示自动判断(常规文件支持,命名管道不支持)。许多解复用器对支持和不支持 seek 的资源处理方式不同,修改此选项可能加快部分文件的打开速度,但可能会丢失精确 seek 等功能。

3.11 ftp

文件传输协议(FTP),用于读取或写入远程资源。

URL 语法:

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

支持的选项:

timeout

设置底层套接字 I/O 操作的超时时间(单位:微秒),默认值为 -1(不指定超时时间)。

ftp-user

设置 FTP 服务器认证用户名,会被 URL 中的用户名覆盖。

ftp-password

设置 FTP 服务器认证密码,会被 URL 中的密码或 ftp-anonymous-password(未指定用户名时)覆盖。

ftp-anonymous-password

匿名登录时使用的密码,通常应填写电子邮件地址。

ftp-write-seekable

编码期间控制连接的 seek 能力:1 表示资源支持 seek,0 表示不支持,默认值为 0。

注意:该协议可作为输出协议使用,但不建议这么做,除非经过充分测试或自定义服务器配置。不同 FTP 服务器对 seek 操作的处理方式不同,ff* 工具可能因服务器限制生成不完整内容。

3.12 gopher

Gopher 协议。

3.13 gophers

基于 TLS 封装的 Gopher 协议。

3.14 hls

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

URL 示例:

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

不建议使用该协议:hls 解复用器功能更完整(若使用中遇到问题,请反馈)。如需使用 hls 解复用器,直接使用 M3U8 文件的 URL 即可。

3.15 http

超文本传输协议(HTTP)。

支持的选项:

seekable

控制连接的 seek 能力:1 表示支持,0 表示不支持,-1 表示自动检测,默认值为 -1。

chunked_post

是否使用分块传输编码(chunked Transfer-Encoding)进行 POST 请求,默认值为 1。

http_proxy

设置用于隧道传输的 HTTP 代理,示例:http://example.com:1234

headers

设置自定义 HTTP 头,可覆盖内置默认头。值为编码后的头信息字符串。

content_type

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

user_agent

覆盖 User-Agent 头,未指定时使用 libavformat 编译信息字符串(格式:"Lavf/<版本号>")。

referer

设置 Referer 头,在 HTTP 请求中包含 "Referer: URL" 头信息。

multiple_requests

是否使用持久连接,1 表示使用,默认值为 0。

post_data

设置自定义 HTTP POST 数据。

mime_type

导出 MIME 类型。

http_version

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

cookies

设置后续请求中发送的 Cookie,每个 Cookie 格式与 Set-Cookie HTTP 响应字段值一致,多个 Cookie 以换行符分隔。

icy

是否向服务器请求 ICY(SHOUTcast)元数据,默认值为 1。若服务器支持,应用需通过读取 icy_metadata_headers 和 icy_metadata_packet 选项获取元数据。

icy_metadata_headers

若服务器支持 ICY 元数据,该选项包含 ICY 特定的 HTTP 响应头,以换行符分隔。

icy_metadata_packet

若服务器支持 ICY 元数据且 icy 设为 1,该选项包含服务器发送的最后一个非空元数据数据包。关注流中元数据更新的应用需定期轮询该选项。

metadata

设置导出字典,包含码流中的 Icecast 元数据(若存在),仅适用于 C API。

auth_type

设置 HTTP 认证类型(不支持 Digest 认证,因该方式需先从服务器获取 nonce 参数,无法直接使用):

  • none:自动选择认证类型,默认值;
  • basic:使用 HTTP 基本认证。

注意:基本认证会发送包含用户名和密码的 Base64 编码字符串,Base64 并非加密方式,等同于明文传输。若资源需要保护,强烈建议使用其他认证方案,并结合 HTTPS/TLS。未采取额外安全措施时,不应使用基本认证保护敏感或重要信息。

send_expect_100

是否为 POST 请求发送 Expect: 100-continue 头:1 表示发送,0 表示不发送,-1 表示按需发送,默认值为 -1。

location

导出包含内容位置的字典,仅适用于 C API。

offset

设置初始字节偏移量。

end_offset

限制请求数据的字节偏移量上限(仅请求该偏移量之前的数据)。

method
  • 作为客户端选项时:设置 HTTP 请求方法;
  • 作为服务器选项时:设置期望客户端使用的 HTTP 方法。若客户端请求方法不匹配,返回 400 Bad Request 响应。未设置时暂不校验,未来将替换为自动检测。
reconnect

断开连接(未到达 EOF)时自动重连。

reconnect_at_eof

若设置为 1,将 EOF 视为错误并触发重连,适用于直播 / 无限流。

reconnect_on_network_error

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

reconnect_on_http_error

以逗号分隔的 HTTP 状态码列表,遇到列表中的状态码时触发重连,支持具体状态码(如 '503')或状态码段(如 '4xx'/'5xx')。

reconnect_streamed

若设置为 1,即使是流式 / 不支持 seek 的流,发生错误时也会重连。

reconnect_delay_max

设置重连的最大延迟时间(单位:秒),超过后停止重连。

reconnect_max_retries

设置最大重连次数,默认未设置。

reconnect_delay_total_max

设置重连的总最大延迟时间(单位:秒),超过后停止重连。

respect_retry_after

若启用,遇到 Retry-After 头时,将按照头中指定的延迟时间重连,而非使用指数退避策略,适用于 429 和 503 错误,默认启用。

listen
  • 设置为 1:启用实验性 HTTP 服务器,作为输出选项时可发送数据,作为输入选项时可通过 HTTP POST 接收客户端数据;
  • 设置为 2:启用实验性多客户端 HTTP 服务器(暂未在 ffmpeg.c 中实现,不可作为命令行选项使用)。
# Server side (sending):
ffmpeg -i somefile.ogg -c copy -listen 1 -f ogg http://server:port

# Client side (receiving):
ffmpeg -i http://server:port -c copy somefile.ogg

# Client can also be done with wget:
wget http://server:port -O somefile.ogg

# Server side (receiving):
ffmpeg -listen 1 -i http://server:port -c copy somefile.ogg

# Client side (sending):
ffmpeg -i somefile.ogg -chunked_post 0 -c copy -f ogg http://server:port

# Client can also be done with wget:
wget --post-file=somefile.ogg http://server:port
resource

启用实验性 HTTP 服务器时,客户端请求的资源路径。

reply_code

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

short_seek_size

设置阈值(单位:字节),当 seek 操作的字节数小于该阈值时,优先使用预读而非重新发起 HTTP 请求。例如,确保大视频数据包之间的小音频数据包使用同一连接读取。

3.15.1 HTTP Cookie

部分 HTTP 请求需要携带 Cookie 才能正常访问,cookies 选项可用于指定这些 Cookie。每个 Cookie 至少需包含值、路径(path)和域名(domain)。匹配该域名和路径的 HTTP 请求会自动在 Cookie 头中包含对应的 Cookie 值,多个 Cookie 以换行符分隔。

指定 Cookie 播放流的示例:

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

3.16 Icecast

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

支持的选项:

ice_genre

设置流的类型(genre)。

ice_name

设置流的名称。

ice_description

设置流的描述信息。

ice_url

设置流的网站 URL。

ice_public

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

user_agent

覆盖 User-Agent 头,未指定时使用格式为 "Lavf/<版本号>" 的字符串。

password

设置 Icecast 挂载点密码。

content_type

设置流的内容类型,若与 audio/mpeg 不同则必须指定。

legacy_icecast

启用对 Icecast 2.4.0 以下版本的支持(这些版本不支持 HTTP PUT 方法,仅支持 SOURCE 方法)。

tls

通过 TLS(HTTPS)连接 Icecast 服务器。

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

3.17 ipfs

星际文件系统(IPFS)协议支持。可通过所谓的 “网关”(HTTP/HTTPS 端点)访问 IPFS 网络上存储的文件。该协议对 IPFS 原生协议(ipfs:// 和 ipns://)进行封装,使其可通过网关访问。用户可(且建议)部署本地节点,通过本地网关访问 IPFS 网络文件。

支持的选项:

gateway

指定使用的网关。未设置时,协议会按以下顺序查找本地网关:$IPFS_GATEWAY 环境变量、$IPFS_PATH 环境变量、$HOME/.ipfs/ 目录。

使用方式:

  1. 通过 IPFS 协议:
ffplay ipfs://<hash>
  1. 通过 IPNS 协议(IPNS 为可变 IPFS):
ffplay ipns://<hash>

3.18 mmst

基于 TCP 的微软媒体服务器(MMS)协议。

3.19 mmsh

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

URL 语法:

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

3.20 md5

MD5 输出协议。

计算待写入数据的 MD5 哈希值,关闭时将哈希值写入指定输出目标(未指定时输出到标准输出)。可用于测试复用器,无需写入实际文件。

示例:

  • 将编码后的 AVI 文件的 MD5 哈希值写入 output.avi.md5:
    ffmpeg -i input.flv -f avi -y md5:output.avi.md5
    
  • 将编码后的 AVI 文件的 MD5 哈希值输出到标准输出:
    ffmpeg -i input.flv -f avi -y md5:
    

注意:部分格式(通常为 MOV)要求输出协议支持 seek,因此无法与 MD5 输出协议配合使用。

3.21 pipe

UNIX 管道访问协议。

用于读取或写入 UNIX 管道。

支持的语法:

pipe:[number]

若未指定编号,默认情况下:写入操作使用标准输出(stdout,编号 1),读取操作使用标准输入(stdin,编号 0)。编号对应管道的文件描述符。

示例:

  • 使用 ffmpeg 从标准输入读取数据:

    plaintext

    cat test.wav | ffmpeg -i pipe:0
    # 等同于:
    cat test.wav | ffmpeg -i pipe:
    
  • 使用 ffmpeg 向标准输出写入数据:

    plaintext

    ffmpeg -i test.wav -f avi pipe:1 | cat > test.avi
    # 等同于:
    ffmpeg -i test.wav -f avi pipe: | cat > test.avi
    

支持的选项:

blocksize

设置 I/O 操作的最大块大小(单位:字节),默认值为 INT_MAX(不限制请求的块大小)。将该值设置为合理的较小值可提升用户终止请求的响应速度,适用于数据传输较慢的场景。

fd

设置文件描述符。

注意:部分格式(通常为 MOV)要求输出协议支持 seek,因此无法与管道输出协议配合使用。

3.22 prompeg

Pro-MPEG 实践规范 #3 版本 2 前向纠错(FEC)协议。

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

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

URL 语法:

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

目标 UDP 端口规则:

  • 列 FEC 流:端口 + 2
  • 行 FEC 流:端口 + 4

支持的选项:

l=n

列数(4-20,且 L×D ≤ 100)

d=n

行数(4-20,且 L×D ≤ 100)

使用示例:

plaintext

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

3.23 rist

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

支持的选项:

rist_profile

支持的值:

  • simple:简单模式;
  • main:主模式(默认);
  • advanced:高级模式。
buffer_size

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

fifo_size

设置 librist 接收端输出队列的数据包数量,必须为 2 的幂,默认值为 8192(librist 默认值为 1024)。

overrun_nonfatal=1|0

是否在 librist 队列缓冲区溢出时继续运行,默认值为 0。

pkt_size

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

log_level

设置 RIST 日志消息的日志级别,仅在需要启用调试级消息或数据包丢失模拟时设置,否则使用常规日志级别。

secret

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

encryption

设置加密类型,默认禁用,支持值为 128 和 256。

3.24 rtmp

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

用于通过 TCP/IP 网络流式传输多媒体内容。

URL 语法:

plaintext

rtmp://[username:password@]server[:port][/app][/instance][/playpath]

支持的参数:

用户名(username)

可选,主要用于发布流。

密码(password)

可选,主要用于发布流。

服务器(server)

RTMP 服务器地址。

端口(port)

TCP 端口号,默认 1935。

应用(app)

要访问的应用名称,通常对应 RTMP 服务器上的应用安装路径(如 /ondemand/、/flash/live/ 等),也可通过 rtmp_app 选项覆盖 URI 中解析的值。

播放路径(playpath)

相对于 app 中指定应用的资源路径或名称,可前缀 "mp4:",也可通过 rtmp_playpath 选项覆盖 URI 中解析的值。

listen

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

timeout

等待传入连接的最大时间(单位:秒),启用后自动开启 listen 模式。

额外可通过命令行选项(或代码中通过 AVOption)设置的参数:

rtmp_app

设置连接 RTMP 服务器时使用的应用名称,覆盖 URI 中指定的参数。

rtmp_buffer

设置客户端缓冲区时间(单位:毫秒),默认值为 3000。

rtmp_conn

额外的任意 AMF 连接参数,通过字符串解析,示例:B:1 S:authMe O:1 NN:code:1.23 NS:flag:ok O:0。每个值前缀为单个字符表示类型:B(布尔值)、N(数字)、S(字符串)、O(对象)、Z(空值),后跟冒号。布尔值必须为 0(FALSE)或 1(TRUE);对象需用 0(结束)或 1(开始)标识;子对象中的数据项可命名(前缀加 'N',格式:NB:myFlag:1)。该选项可多次使用以构建任意 AMF 序列。

rtmp_enhanced_codecs

指定客户端在增强型 RTMP 流中声明支持的编解码器列表,值为逗号分隔的 FourCC 码,示例:hvc1,av01,vp09(多个编解码器)或 hvc1(单个编解码器)。指定的列表会在 Connect 命令消息的 "fourCcLive" 属性中传递。

rtmp_flashver

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

rtmp_flush_interval

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

rtmp_live

指定媒体为直播流(直播流不支持续播或 seek),默认值为 any(订阅者先尝试播放 playpath 指定的直播流,未找到则播放录制流),其他支持值:live(仅直播流)、recorded(仅录制流)。

rtmp_pageurl

媒体嵌入的网页 URL,默认不发送。

rtmp_playpath

设置要播放或发布的流标识符,覆盖 URI 中指定的参数。

rtmp_subscribe

设置要订阅的直播流名称,默认不发送,仅在指定该选项或 rtmp_live 设为 live 时发送。

rtmp_swfhash

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

rtmp_swfsize

解压缩后 SWF 文件的大小(用于 SWF 验证)。

rtmp_swfurl

媒体对应的 SWF 播放器 URL,默认不发送。

rtmp_swfverify

播放器 SWF 文件的 URL,自动计算哈希值和大小。

rtmp_tcurl

目标流的 URL,默认值为 proto://host [:port]/app。

tcp_nodelay=1|0

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

注意:当前套接字写入未优化以减少系统调用,可能降低 TCP_NODELAY 的效率。

示例:

  • 使用 ffplay 从 RTMP 服务器 myserver 的应用 vod 中读取名为 sample 的多媒体资源:
    ffplay rtmp://myserver/vod/sample
    
  • 向受密码保护的服务器发布流,单独指定 playpath 和 app 名称:
    ffmpeg -re -i <输入> -f flv -rtmp_playpath some/long/path -rtmp_app long/app/name rtmp://用户名:密码@myserver/
    

3.25 rtmpe

加密实时消息协议(Encrypted Real-Time Messaging Protocol)。

基于标准加密原语(Diffie-Hellman 密钥交换和 HMACSHA256),生成一对 RC4 密钥,用于流式传输多媒体内容。

3.26 rtmps

基于安全 SSL 连接的实时消息协议(Real-Time Messaging Protocol over SSL)。

通过加密连接流式传输多媒体内容。

3.27 rtmpt

通过 HTTP 隧道传输的实时消息协议(Real-Time Messaging Protocol tunneled through HTTP)。

将多媒体内容封装在 HTTP 请求中传输,以穿透防火墙。

3.28 rtmpte

通过 HTTP 隧道传输的加密实时消息协议(Encrypted Real-Time Messaging Protocol tunneled through HTTP)。

将加密的多媒体内容封装在 HTTP 请求中传输,以穿透防火墙。

3.29 rtmpts

通过 HTTPS 隧道传输的实时消息协议(Real-Time Messaging Protocol tunneled through HTTPS)。

将多媒体内容封装在 HTTPS 请求中传输,以穿透防火墙。

3.30 libsmbclient

通过 libsmbclient 操作 CIFS/SMB 网络资源。

URL 语法:

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

支持的选项:

timeout

设置底层套接字 I/O 操作的超时时间(单位:毫秒),默认值为 -1(不指定超时时间)。

truncate

写入时是否截断已有文件,1 表示截断,0 表示不截断,默认值为 1。

workgroup

设置连接使用的工作组,默认未指定。

3.31 libssh

通过 libssh 实现的安全文件传输协议(SFTP)。

用于读取或写入远程资源。

URL 语法:

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

支持的选项:

timeout

设置底层套接字 I/O 操作的超时时间,默认值为 -1(不指定超时时间)。

truncate

写入时是否截断已有文件,1 表示截断,0 表示不截断,默认值为 1。

private_key

指定身份验证时使用的私钥文件路径,默认 libssh 会在~/.ssh/ 目录中搜索密钥。

示例:播放远程服务器上的文件:

ffplay sftp://user:password@server_address:22/home/user/resource.mpeg

3.32 librtmp(rtmp、rtmpe、rtmps、rtmpt、rtmpte)

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

编译配置时需确保存在 librtmp 头文件和库,需显式通过 --enable-librtmp 配置编译,启用后将替代原生 RTMP 协议。

该协议提供大多数客户端功能和部分服务器功能,支持 RTMP、HTTP 隧道传输的 RTMP(RTMPT)、加密 RTMP(RTMPE)、SSL/TLS 上的 RTMP(RTMPS)以及这些加密类型的隧道变体(RTMPTE、RTMPTS)。

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

其中:

  • rtmp_proto 为协议变体字符串,可选值:"rtmp"、"rtmpt"、"rtmpe"、"rtmps"、"rtmpte"、"rtmpts";
  • 服务器(server)、端口(port)、应用(app)、播放路径(playpath)含义与原生 RTMP 协议一致;
  • 选项(options)为空格分隔的键值对(格式:key=val)。

更多信息详见 librtmp 手册(man 3 librtmp)。

示例:

  • 使用 ffmpeg 向 RTMP 服务器实时推送文件:

    plaintext

    ffmpeg -re -i myfile -f flv rtmp://myserver/live/mystream
    
  • 使用 ffplay 播放上述流:

    plaintext

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

3.33 rtp

实时传输协议(Real-time Transport Protocol)。

rtp://hostname[:port][?options]
  • 端口(port):指定 RTP 端口;
  • 选项(options):& 分隔的键值对(格式:key=val)。

支持的 URL 选项:

ttl=n

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

rtcpport=n

设置远程 RTCP 端口为 n。

localrtpport=n

设置本地 RTP 端口为 n。

localrtcpport=n

设置本地 RTCP 端口为 n。

pkt_size=n

设置最大数据包大小(单位:字节)为 n。

buffer_size=size

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

connect=0|1

是否对 UDP 套接字执行 connect() 操作(1 表示执行,0 表示不执行)。

sources=ip[,ip]

允许的源 IP 地址列表。

block=ip[,ip]

禁止(阻塞)的源 IP 地址列表。

write_to_source=0|1

发送数据包的目标地址:1 表示发送至最近接收数据包的源地址,0 表示发送至默认远程地址。

localport=n

设置本地 RTP 端口为 n(已废弃,建议使用 localrtpport)。

localaddr=addr

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

timeout=n

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

重要说明:

  • 若未设置 rtcpport,RTCP 端口默认为 RTP 端口 + 1;
  • 若未设置 localrtpport(本地 RTP 端口),将使用任意可用端口作为本地 RTP 和 RTCP 端口;
  • 若未设置 localrtcpport(本地 RTCP 端口),默认为本地 RTP 端口 + 1。

3.34 rtsp

实时流传输协议(Real-Time Streaming Protocol)。

RTSP 在 libavformat 中并非严格意义上的协议处理器,而是复用器和解复用器:

  • 解复用器支持标准 RTSP(数据通过 RTP 传输,如 Apple、Microsoft 使用)和 Real-RTSP(数据通过 RDT 传输);
  • 复用器可通过 RTSP ANNOUNCE 命令向支持的服务器(目前支持 Darwin Streaming Server 和 Mischa Spiegelmock 的 RTSP 服务器)推送流。
rtsp://hostname[:port]/path

选项可通过 ffmpeg/ffplay 命令行设置,或在代码中通过 AVOption 或 avformat_open_input 设置。

3.34.1 复用器

支持的选项:

rtsp_transport

设置 RTSP 传输协议,支持值:

  • udp:使用 UDP 作为底层传输协议;
  • tcp:使用 TCP(RTSP 控制通道内交织传输)作为底层传输协议;默认值为 0
rtsp_flags

设置 RTSP 标志,支持值:

  • latm:AAC 采用 MP4A-LATM 打包方式,而非 MPEG4-GENERIC;
  • rfc2190:H.263 采用 RFC 2190 打包方式,而非 RFC 4629;
  • skip_rtcp:不发送 RTCP 发送方报告;
  • h264_mode0:H.264 在 RTP 中使用模式 0;
  • send_bye:结束时发送 RTCP BYE 数据包;默认值为 0
min_port

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

max_port

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

buffer_size

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

pkt_size

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

3.34.2 解复用器

支持的选项:

initial_pause

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

rtsp_transport

设置 RTSP 传输协议,支持值:

  • udp:使用 UDP 作为底层传输协议;
  • tcp:使用 TCP(RTSP 控制通道内交织传输)作为底层传输协议;
  • udp_multicast:使用 UDP 多播作为底层传输协议;
  • http:使用 HTTP 隧道传输(适用于穿透代理);
  • https:使用 HTTPS 隧道传输(适用于穿透代理,且安全性更高)。

可指定多个底层传输协议,按顺序尝试(若某一协议设置失败,自动尝试下一个)。复用器仅支持 tcp 和 udp 选项。

rtsp_flags

设置 RTSP 标志,支持值:

  • filter_src:仅接收来自协商的对等方地址和端口的数据包;
  • listen:作为服务器运行,监听传入连接;
  • prefer_tcp:优先尝试使用 TCP 进行 RTP 传输(若 TCP 作为 RTSP RTP 传输可用);
  • satip_raw:导出原始 MPEG-TS 流,不进行解复用(保留原始 PAT/PMT/PID);默认值为 none
allowed_media_types

设置从服务器接收的媒体类型,支持标志:video(视频)、audio(音频)、data(数据)、subtitle(字幕),默认接收所有媒体类型。

min_port

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

max_port

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

listen_timeout

设置建立初始连接的最大超时时间(单位:秒),设置后自动开启 listen 模式,默认值为 -1(listen 模式下无限超时)。

reorder_queue_size

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

timeout

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

user_agent

覆盖 User-Agent 头,未指定时使用 libavformat 标识字符串。

buffer_size

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

通过 UDP 接收数据时,解复用器会尝试对接收的数据包重新排序(因数据包可能乱序到达或丢失),可通过将 AVFormatContext 的 max_delay 字段设为 0 禁用该功能。

使用 ffplay 观看多码率 Real-RTSP 流时,可通过 -vst n(视频)和 -ast n(音频)选择要播放的流,并可通过按 v 和 a 键实时切换。

3.34.3 示例

以下示例均使用 ffplay 和 ffmpeg 工具:

  • 通过 UDP 观看流,最大重排序延迟为 0.5 秒:
    ffplay -max_delay 500000 -rtsp_transport udp rtsp://server/video.mp4
  • 通过 HTTP 隧道观看流:
    ffplay -rtsp_transport http rtsp://server/video.mp4
    
  • 向 RTSP 服务器实时推送流(供他人观看):
    ffmpeg -re -i input -f rtsp -muxdelay 0.1 rtsp://server/live.sdp
    
  • 实时接收流:
    ffmpeg -rtsp_flags listen -i rtsp://ownaddress/live.sdp output
    

3.35 sap

会话通知协议(Session Announcement Protocol,RFC 2974)。

在 libavformat 中并非严格意义上的协议处理器,而是复用器和解复用器,用于 RTP 流的信令传输,通过在独立端口定期广播流的 SDP 信息实现。

3.35.1  Muxer

复用器支持的 SAP URL 语法:

sap://destination[:port][?options]
  • RTP 数据包发送至目标地址的指定端口,未指定端口时默认 5004;
  • 选项(options)为 & 分隔的键值对。

支持的选项:

announce_addr = 地址

指定发送通知的目标 IP 地址,未指定时:

  • IPv4 地址默认发送至 SAP 通知多播地址 224.2.127.254(sap.mcast.net);
  • IPv6 地址默认发送至 ff0e::2:7ffe。
announce_port = 端口

指定发送通知的端口,默认值为 9875。

ttl=ttl

设置通知和 RTP 数据包的 TTL 值,默认值为 255。

same_port=0|1
  • 1:所有 RTP 流使用同一端口对;
  • 0(默认):所有流使用唯一端口,每个流的端口比前一个大 2。

注意:VLC/Live555 要求设置为 1 才能接收流;libavformat 的 RTP 接收栈要求所有流使用唯一端口。

示例:

  • 向本地子网广播流(供 VLC 观看):
    ffmpeg -re -i input -f sap sap://224.0.0.255?same_port=1
    
  • 向本地子网广播流(供 ffplay 观看):
    ffmpeg -re -i input -f sap sap://224.0.0.255
    
  • 通过 IPv6 向本地子网广播流(供 ffplay 观看):
    ffmpeg -re -i input -f sap sap://[ff0e::1:2:3:4]
    
3.35.2 解复用器

解复用器支持的 SAP URL 语法:

sap://[address][:port]
  • 地址(address):监听通知的多播地址,未指定时默认 224.2.127.254(sap.mcast.net);
  • 端口(port):监听端口,未指定时默认 9875。

解复用器在指定地址和端口监听通知,收到通知后尝试接收对应的流。

示例:

  • 播放默认 SAP 多播地址上的第一个通知流:
    ffplay sap://
    
  • 播放默认 IPv6 SAP 多播地址上的第一个通知流:
    ffplay sap://[ff0e::2:7ffe]
    

3.36 sctp

流控制传输协议(Stream Control Transmission Protocol)。

sctp://host:port[?options]

支持的选项:

listen

若设置为任意值,监听传入连接(默认行为为发起出站连接)。

max_streams

设置最大流数量,默认无限制。

3.37 srt

通过 libsrt 实现的 Haivision 安全可靠传输协议(Secure Reliable Transport)。

支持的 URL 语法:

srt://hostname:port[?options]

(选项为 & 分隔的键值对,格式:key=val)或

选项 srt://主机名:端口

(选项为 "-key val" 格式的键值对)

支持的选项:

connect_timeout = 毫秒

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

ffs = 字节

飞行标志大小(窗口大小),单位为字节。FFS 为内部参数,需不小于 recv_buffer_size 和 mss,默认值较大,除非设置了非常大的接收缓冲区,否则无需修改,默认值为 25600。

inputbw = 字节 / 秒

发送方标称输入速率,单位为字节 / 秒。当 maxbw 设置为相对值(0)时,与 oheadbw 配合计算最大发送速率(含恢复数据包):inputbw * (100 + oheadbw) / 100。若 maxbw 设为 0 但未设置 inputbw,库内部会评估实际输入速率,默认值为 0。

iptos=tos

IP 服务类型(Type of Service),仅适用于发送方,默认值为 0xB8。

ipttl=ttl

IP 生存时间(Time To Live),仅适用于发送方,默认值为 64。

latency = 微秒

基于时间戳的数据包传输延迟,用于吸收数据包重传丢失的突发情况。该标志同时将 rcvlatency 和 peerlatency 设置为相同值。注意:1.3.0 版本前仅支持该标志设置延迟,发送方侧等效于设置 peerlatency,接收方侧等效于设置 rcvlatency,且不支持双向流发送。

listen_timeout = 微秒

设置套接字监听超时时间。

maxbw = 字节 / 秒

最大发送带宽,单位为字节 / 秒:

  • -1:无限(CSRTCC 限制为 30 Mbps);
  • 0:相对于输入速率(见 inputbw);
  • 0:绝对限制值;默认值为 0(相对值)。

mode=caller|listener|rendezvous

连接模式:

  • caller:发起客户端连接(默认);
  • listener:启动服务器监听传入连接;
  • rendezvous:使用会合连接模式。
mss = 字节

最大分段大小(Maximum Segment Size),单位为字节,用于缓冲区分配和基于数据包计数器的速率计算(假设数据包满负载)。使用对等方之间的最小 MSS,互联网环境下默认值为 1500,仅可减小(除非有特殊专用网络配置)。

nakreport=1|0

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

oheadbw = 百分比

恢复带宽相对于输入速率的开销百分比(见 inputbw),默认值为 25%。

passphrase = 字符串

HaiCrypt 加密 / 解密密码字符串,长度为 10-79 字符。密码是发送方和接收方的共享密钥,用于通过 PBKDF2(基于密码的密钥派生函数)生成密钥加密密钥(Key Encrypting Key),仅在 pbkeylen 非零时使用。接收方仅在收到加密数据时使用,配置的密码无法恢复(仅写)。

enforced_encryption=1|0

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

kmrefreshrate = 数据包数

切换到新加密密钥前传输的数据包数量,默认值为 -1(自动,libsrt 中为 0x1000000),取值范围为 0 - INT_MAX

kmpreannounce = 数据包数

新加密密钥发送与切换之间的间隔,该值同样适用于切换与旧密钥停用之间的间隔,默认值为 -1(自动,libsrt 中为 0x1000),取值范围为 0 - INT_MAX

snddropdelay = 微秒

发送方丢弃数据包前的额外延迟(添加到默认丢弃延迟时间),特殊值 -1 表示发送方不丢弃任何数据包。

payload_size = 字节

设置实时模式下单次发送函数调用传输的数据包最大声明大小,文件模式下默认不使用(设为 0),默认值为 -1(自动,通常为 MPEG-TS)。若使用 SRT 发送其他类型的负载(如小帧封装的直播流),可设置更大的最大帧大小(不超过 1456 字节)。

pkt_size = 字节

payload_size 的别名。

peerlatency = 微秒

发送方设置的接收方最小延迟值(见 rcvlatency)。

pbkeylen = 字节

发送方加密密钥长度,仅支持 0、16、24、32,非零时启用发送方加密。接收方无需设置(设为 0),密钥大小通过 HaiCrypt 握手从发送方获取,默认值为 0。

rcvlatency = 微秒

数据包从发送到交付给接收方应用的时间,需足够大以覆盖发送时间、意外延长的 RTT 时间和 UDP 数据包重传时间。实际延迟值为该选项值与对等方设置的 peerlatency 值中的较大者。1.3.0 版本前该选项仅可通过 latency 设置。

recv_buffer_size = 字节

设置 UDP 接收缓冲区大小(单位:字节)。

send_buffer_size = 字节

设置 UDP 发送缓冲区大小(单位:字节)。

timeout = 微秒

设置读取、写入和连接操作的错误超时时间。注意:SRT 库有独立的内部超时控制,该值仅作为上限。

tlpktdrop=1|0

迟到数据包丢弃(Too-late Packet Drop):

  • 接收方启用时:跳过未及时交付的丢失数据包,在后续数据包到达播放时间时交付给应用,并向发送方发送伪 ACK;
  • 发送方启用且接收方支持时:发送方丢弃无法及时交付的旧数据包(默认在接收方支持时自动启用)。
sndbuf = 字节

设置发送缓冲区大小(单位:字节)。

rcvbuf = 字节

设置接收缓冲区大小(单位:字节),接收缓冲区不得大于 ffs。

lossmaxttl = 数据包数

重排序容限(Reorder Tolerance)的最大增长值。重排序容限 > 0 时,数据包丢失报告会延迟到接收该数量的数据包后。当收到 “延迟” 数据包(非重传导致,即 UDP 数据包乱序)时,重排序容限会按最新序列号与该数据包序列号的差值增长,但不超过该选项值。默认值为 0(禁用该机制,丢失报告在检测到序列号间隙时立即发送)。

minversion

要求对等方的最小 SRT 版本,不满足时拒绝连接。版本格式:十六进制 0xXXYYZZ 对应人类可读格式 x.y.z。

streamid = 字符串

连接前设置的套接字流 ID,长度限制为 512 字符,监听方可通过 srt_accept 返回的套接字获取。SRT 不对该字符串内容进行特殊解析,会合连接模式下无意义(可能一方覆盖另一方的值)。

srt_streamid = 字符串

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

smoother=live|file

套接字传输使用的平滑器(Smoother)类型,负责传输和拥塞控制。连接双方的平滑器类型必须完全一致,否则拒绝连接。

messageapi=1|0

是否使用消息 API(Message API),否则使用缓冲区 API(Buffer API):

  • 实时模式(见 transtype)仅支持消息 API;
  • 文件模式可选择:
    • 流 API(默认,messageapi=0):单次发送可传输任意大小数据,支持直接从文件读取,内部处理速度和拥塞控制,接收时可按需读取,数据无边界;
    • 消息 API(messageapi=1):单次发送传递一个带边界的数据包,可跨多个 UDP 数据包,大小限制为发送缓冲区,接收方需使用足够大的缓冲区,否则无法接收完整消息(数据包丢失时也无法接收)。
transtype=live|file

设置套接字传输类型,会自动将多个其他参数设为对应类型的默认值:

  • live(实时):单次发送仅传输一个 UDP 数据包大小的数据,限制为 payload_size(默认 1316),无速度控制,仅带宽控制(若配置);
  • file(文件):非实时传输,详见 messageapi。
linger = 秒

关闭时等待未发送数据的时间,默认值为 -1(自动:实时模式下禁用,0 秒;文件模式下启用,180 秒),取值范围为 0 - INT_MAX

tsbpd=1|0

是否启用基于时间戳的数据包交付模式(Timestamp-based Packet Delivery),默认行为取决于传输类型:实时模式启用,文件模式禁用。

3.38 srtp

安全实时传输协议(Secure Real-time Transport Protocol)。

支持的选项:

srtp_in_suite
srtp_out_suite

选择输入和输出编码套件,支持值:

  • AES_CM_128_HMAC_SHA1_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

虚拟提取文件或其他流的片段,底层流必须支持 seek。

支持的选项:

start

提取片段的起始偏移量(单位:字节)。

end

提取片段的结束偏移量(单位:字节),设为 0 时提取至文件末尾。

示例:

  • 从 DVD VOB 文件中提取章节(起始和结束扇区需外部获取并乘以 2048):
    subfile,,start,153391104,end,268142592,,:/media/dvd/VIDEO_TS/VTS_08_1.VOB
    
  • 直接从 TAR 归档文件中播放 AVI 文件:
    subfile,,start,183241728,end,366490624,,:archive.tar
    
  • 从起始偏移量播放 MPEG-TS 文件至末尾:
    subfile,,start,32815239,end,0,,:video.ts
    

3.40 tee

将输出写入多个协议,各输出之间用 | 分隔。

tee:file://path/to/local/this.avi|file://path/to/local/that.avi

3.41 tcp

传输控制协议(Transmission Control Protocol)。

URL 语法:

tcp://hostname:port[?options]

选项(options)为 & 分隔的键值对(格式:key=val)。

支持的选项:

listen=2|1|0

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

local_addr = 地址

TCP 套接字连接使用的网络接口本地 IP 地址。

local_port = 端口

TCP 套接字连接使用的本地端口。

timeout = 微秒

设置错误超时时间(单位:微秒),仅适用于读取模式:超过该时间无数据到达则触发错误。

listen_timeout = 毫秒

设置监听超时时间(单位:毫秒)。

recv_buffer_size = 字节

设置接收缓冲区大小(单位:字节)。

send_buffer_size = 字节

设置发送缓冲区大小(单位:字节)。

tcp_nodelay=1|0

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

注意:当前套接字写入未优化以减少系统调用,可能降低 TCP_NODELAY 的效率。

tcp_mss = 字节

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

示例:使用 ffmpeg 建立监听 TCP 连接,通过 ffplay 访问:

ffmpeg -i input -f format tcp://hostname:port?listen
ffplay tcp://hostname:port

3.42 tls

传输层安全(Transport Layer Security,TLS)/ 安全套接层(Secure Sockets Layer,SSL)。

URL 语法:

tls://hostname:port[?options]

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

ca_file、cafile = 文件名

包含受信任的证书颁发机构(CA)根证书的文件,若链接的 TLS 库包含默认根证书,则无需指定即可完成验证(但并非所有库和配置都内置默认根证书)。文件需为 OpenSSL PEM 格式。

tls_verify=1|0

是否验证通信对等方:

  • 启用时,验证对等方证书是否由 CA 数据库中的根证书签名(OpenSSL 暂不验证证书与主机名匹配,其他后端会验证);
  • 默认禁用(多数情况下需要调用方提供 CA 数据库)。
cert_file、cert = 文件名

握手时使用的证书文件(服务器模式下通常为对等方要求,客户端证书仅在特定配置中需要)。

key_file、key = 文件名

证书对应的私钥文件。

listen=1|0

启用时,在指定端口监听连接,握手时作为服务器角色(默认作为客户端)。

http_proxy

用于隧道传输的 HTTP 代理,示例:http://example.com:1234,代理需支持 CONNECT 方法。

示例:

  • 创建 TLS/SSL 服务器并推送输入流:
    ffmpeg -i input -f format tls://hostname:port?listen&cert=server.crt&key=server.key
  • 使用 ffplay 从 TLS/SSL 服务器播放流:
    ffplay tls://hostname:port

3.43 DTLS(数据报传输层安全)

数据报传输层安全协议(DTLS)

DTLS 统一资源定位符(URL)的标准语法格式为:dtls://hostname:port[?options]

其中options为一组由&分隔的key=val格式参数项。可使用标准百分号编码(空格用加号替代)对参数的键名与值进行转义处理。

同时,相关参数也可通过命令行选项(或代码中的AVOptions)进行配置。

DTLS 与 TLS 协议的大部分参数通用,二者核心区别在于 DTLS 基于 UDP 协议传输,而非 TCP 协议。

以下为其支持的参数列表:

  1. ca_file、cafile=filename指定包含可信任的证书颁发机构(CA)根证书的文件路径。若所链接的 TLS 类库内置了默认根证书,则无需手动指定该文件即可完成证书验证;但部分类库或运行环境无内置默认根证书,此时必须配置此参数。证书文件需为 OpenSSL PEM 格式。
  2. tls_verify、verify=1|0启用后将对通信对等端进行证书验证。需注意,在使用 OpenSSL 类库时,该功能仅校验对等端证书是否由 CA 证书库中的根证书签发,不验证证书与目标连接主机名的匹配性。由于多数场景下需要调用方自行提供 CA 证书库,因此该功能默认处于禁用状态。
  3. cert_file、cert=filename指定在与对等端握手阶段使用的本地证书文件。(作为服务端以监听模式运行时,对等端通常会要求服务端提供此证书;而客户端证书仅在特定业务场景下为必填项)
  4. key_file、key=filename指定证书对应的私钥文件路径。
  5. cert_pem=string直接传入证书的 PEM 格式字符串内容。
  6. key_pem=string直接传入私钥的 PEM 格式字符串内容。
  7. listen=1|0启用后将在指定端口监听连接请求,并在握手阶段以服务端角色完成协议协商,而非默认的客户端角色。
  8. mtu=size设置 DTLS 数据包的最大传输单元(MTU)。
  9. use_srtp=1|0启用use_srtpDTLS 扩展功能。该功能常用于 WebRTC 应用,可通过 DTLS 握手流程协商生成 SRTP 加密密钥,默认处于禁用状态。
  10. external_sock=1|0启用后将使用外部已有的套接字,而非新建套接字。此参数仅在通过 API 调用代码时生效,若在命令行中启用会直接导致程序运行失败,默认处于禁用状态。

命令行示例

  1. 搭建 DTLS 服务端ffmpeg -listen 1 -i dtls://hostname:port output
  2. 搭建 DTLS 客户端并向服务端发送数据ffmpeg -i input -f format dtls://hostname:port

3.44 UDP(用户数据报协议)

用户数据报协议(UDP)

UDP 统一资源定位符(URL)的标准语法格式为:udp://hostname:port[?options]

其中options为一组由&分隔的key=val格式参数项。可使用标准百分号编码(空格用加号替代)对参数的键名与值进行转义处理。

相关参数也可通过命令行选项(或代码中的AVOptions)进行配置。

当系统启用线程功能时,程序会通过循环缓冲区存储接收的 UDP 数据,以此降低因 UDP 套接字缓冲区溢出导致的数据丢失风险,fifo_sizeoverrun_nonfatal参数均与此缓冲区相关。

以下为其支持的参数列表:

  1. buffer_size=size设置 UDP 套接字的最大缓冲区大小(单位:字节)。根据套接字的用途(接收或发送),该参数分别对应设置接收缓冲区或发送缓冲区的大小。默认配置为:输出场景下缓冲区大小 32KB,输入场景下缓冲区大小 384KB。相关配置可参考fifo_size参数。
  2. bitrate=bitrate若设置为非零值,当输入数据量足以支撑时,输出数据将保持该参数指定的恒定比特率。
  3. burst_bits=bits当启用bitrate参数时,该参数用于指定数据包突发传输的最大比特数。
  4. localport=port手动指定本地 UDP 绑定端口,覆盖默认端口配置。
  5. localaddr=addr指定用于发送数据包或加入多播组的本地网络接口 IP 地址。
  6. pkt_size=size设置 UDP 数据包的固定大小(单位:字节)。
  7. reuse=1|0显式允许或禁止复用 UDP 套接字。
  8. ttl=ttl设置数据包的生存时间(仅适用于多播场景)。
  9. dscp=dscp为发送的数据包设置 6 位的差分服务代码点(DSCP)字段值。
  10. connect=1|0通过connect()函数初始化 UDP 套接字。启用后,无法通过ff_udp_set_remote_url接口修改目标地址;若初始化阶段未知目标地址,也可在调用ff_udp_set_remote_url时指定此参数。该功能支持通过getsockname获取数据包源地址,且当收到 “目标不可达” 响应时,写入操作会返回AVERROR(ECONNREFUSED)错误;在接收场景下,仅会接收来自指定对等端地址 / 端口的数据包。
  11. sources=address[,address]仅接收来自指定地址的数据包。在多播场景中,将仅订阅来自这些地址的多播流量。
  12. block=address[,address]忽略来自指定地址的数据包。在多播场景中,会在多播订阅中排除这些源地址。
  13. fifo_size=units设置 UDP 接收循环缓冲区的大小,单位为 “188 字节的数据包个数”。未手动指定时,默认大小为 7×4096。
  14. overrun_nonfatal=1|0启用后,当 UDP 接收循环缓冲区溢出时,程序可继续运行而不终止。默认值为 0(即缓冲区溢出会导致程序异常)。
  15. timeout=microseconds设置错误触发超时时间(单位:微秒)。该参数仅在读取模式下生效:若超过设定时间仍未接收到数据,则触发超时错误。
  16. broadcast=1|0显式允许或禁止 UDP 广播功能。需注意,在启用广播风暴防护的网络环境中,UDP 广播功能可能无法正常工作。

3.44.1 示例

  1. 通过 UDP 向远程端点推送流媒体ffmpeg -i input -f format udp://hostname:port
  2. 以 188 字节 UDP 包大小传输 MPEG-TS 格式流,并配置大尺寸输入缓冲区ffmpeg -i input -f mpegts udp://hostname:port?pkt_size=188&buffer_size=65535
  3. 通过 UDP 接收远程端点的流媒体ffmpeg -i udp://[multicast-address]:port ...

3.45 unix(Unix 本地套接字)

Unix 本地套接字

Unix 套接字统一资源定位符(URL)的标准语法格式为:unix://filepath

可通过命令行选项(或代码中的AVOptions)配置以下参数:

  1. timeout:超时时间(单位:毫秒)。
  2. listen:将 Unix 套接字设置为监听模式。

3.46 zmq(ZeroMQ 异步消息传输)

基于 libzmq 类库实现的 ZeroMQ 异步消息传输功能。

该类库支持无需依赖外部服务端的单播流媒体多客户端分发能力。

流媒体推送或连接的统一资源定位符(URL)标准语法格式为:zmq:tcp://ip-address:port

示例

  1. 在本地 5555 端口搭建流媒体服务ffmpeg -re -i input -f mpegts zmq:tcp://127.0.0.1:5555
  2. 多客户端连接该流媒体服务ffplay zmq:tcp://127.0.0.1:5555

多客户端流媒体分发基于 ZeroMQ 的发布 - 订阅(Pub-Sub)模式实现:服务端绑定指定端口并发布流媒体数据,客户端通过 IP 地址与端口连接服务端并订阅流数据。服务端与客户端的启动顺序通常不影响服务正常运行。

注意:ffmpeg 需在编译时开启–enable-libzmq选项,方可支持该传输协议。

可在 ffmpeg/ffplay 命令行中配置以下参数:

  • pkt_size:强制指定发送 / 接收数据的最大数据包大小,默认值为 131,072 字节。服务端侧该参数控制 ZeroMQ 发送数据包的最大尺寸;客户端侧该参数设置内部接收缓冲区大小。需注意,客户端的pkt_size值应大于或等于服务端的配置值,否则接收的消息可能被截断,进而引发解码错误。
Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐