前言
Github
地址:Github
简书地址:简书
专辑地址:FFplay专辑
16.协议
协议是FFmpeg
中配置的元素,用于访问需要特定协议的资源。
配置FFmpeg
构建时,默认情况下会启用所有支持的协议。 您可以使用配置选项-list-protocols
列出所有可用的列表。
您可以使用configure
选项-disable-protocols
禁用所有协议,并使用选项-enable-protocol = PROTOCOL
选择性地启用协议,或者可以使用选项-disable-protocol =
禁用特定协议 协议。
ff *
工具的-protocols
选项将显示支持的协议列表。
所有协议都接受以下选项:
rw_timeout
等待(网络)读/写操作完成的最长时间,以微秒为单位。
下面是对当前可用协议的描述。
16.1 async
输入流的异步数据填充包装器。
在后台线程中填充数据,以将I / O
操作与demux
线程分离。
async:URL
async:http://host/resource
async:cache:http://host/resource
16.2 bluray
阅读BluRay
播放列表。
相关选项如下:
angle
蓝光角度
chapter
开始章节(1 ... N)
playlist
要播放的播放列表(BDMV/PLAYLIST/?????.mpls
)
例子:
读取BluRay
中安装到/mnt/bluray
的最长播放列表:
bluray:/mnt/bluray
从BluRay
读取安装到/mnt/bluray
的播放列表4的角度2
,从第2
章开始:
-playlist 4 -angle 2 -chapter 2 bluray:/ mnt / bluray
16.3 cache
输入流的缓存包装器。
将输入流缓存到临时文件。 它为直播带来了搜索能力。
cache:URL
16.4 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
请注意,可能需要转义字符|
这是许多shells
特殊的地方。
16.5 crypto
AES
加密的流读取协议。
接受的选项是:
key
从给定的十六进制表示设置AES
解密密钥二进制块。
iv
从给定的十六进制表示设置AES
解密初始化向量二进制块。
接受的网址格式:
crypto:URL
crypto+URL
16.6 data
URI
中的内联数据。 见http://en.wikipedia.org/wiki/Data_URI_scheme。
例如,要转换与ffmpeg
内联给出的GIF
文件:
ffmpeg -i "data:image/gif;base64,R0lGODdhCAAIAMIEAAAAAAAA//8AAP//AP///////////////ywAAAAACAAIAAADF0gEDLojDgdGiJdJqUX02iB4E8Q9jUMkADs=" smiley.png
16.7 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
,这导致不限制请求的块大小。 将此值设置得相当低可以改善用户终止请求响应时间,这对于慢速介质上的文件很有用。
16.8 ftp
FTP
(文件传输协议)。
使用FTP
协议读取或写入远程资源。
需要以下语法。
ftp://[user[:password]@]server[:port]/path/to/remote/resource.mpeg
该协议接受以下选项。
timeout
设置基础低级操作使用的套接字I/O
操作的超时(以微秒为单位)。默认情况下,它设置为-1
,这意味着未指定超时。
ftp-anonymous-password
以匿名用户身份登录时使用的密码。通常应使用电子邮件地址。
ftp-write-seekable
控制编码期间连接的可查找性。如果设置为1
,则资源应该是可搜索的,如果设置为0
,则认为该资源不可搜索。默认值为0
。
注意:协议可以用作输出,但建议不要这样做,除非特别小心(测试,自定义服务器配置等)。在搜索操作期间,不同的FTP
服务器以不同的方式运行。由于服务器的限制,ff *
工具可能会产生不完整的内容。
该协议接受以下选项:
follow
如果设置为1
,协议将在文件末尾重试读取,允许读取仍在写入的文件。为了终止此操作,您需要使用rw_timeout
选项,或使用中断回调(对于API
用户)。
16.9 gopher
Gopher
协议。
16.10 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 demuxer
,只需使用m3u8
文件的直接URL
即可。
16.11 http
HTTP
(超文本传输协议)。
该协议接受以下选项:
seekable
控制连接的可寻找性。如果设置为1
,则资源应该是可搜索的,如果设置为0
,则认为不可搜索,如果设置为-1
,如果它是可搜索的,它将尝试自动检测。默认值为-1
。
chunked_post
如果设置为1
,则对帖子使用chunked Transfer-Encoding
,默认值为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 / <version>”`)
user-agent
这是一个已弃用的选项,您可以使用user_agent
代替它。
timeout
设置基础低级操作使用的套接字I/O
操作的超时(以微秒为单位)。默认情况下,它设置为-1
,这意味着未指定超时。
reconnect_at_eof
如果设置,则将eof
视为错误并导致重新连接,这对于实时/无限流非常有用。
reconnect_streamed
如果设置,则甚至流式/非可搜索流将在错误时重新连接。
reconnect_delay_max
设置放弃重新连接的最大延迟(以秒为单位)
MIME_TYPE
导出MIME
类型。
http_version
导出HTTP
响应版本号。通常为1.0
或1.1
。
icy
如果设置为1
,则从服务器请求ICY(SHOUTcast)
元数据。如果服务器支持此功能,则应用程序必须通过读取icy_metadata_headers
和icy_metadata_packet
选项来检索元数据。默认值为1
。
icy_metadata_headers
如果服务器支持ICY
元数据,则它包含ICY
特定的HTTP
回复标头,由换行符分隔。
icy_metadata_packet
如果服务器支持ICY
元数据,并且icy
设置为1
,则它包含服务器发送的最后一个非空元数据包。应该对对流中间元数据更新感兴趣的应用程序定期轮询它。
cookies
设置将在以后的请求中发送的cookie
。每个cookie
的格式与Set-Cookie HTTP
响应字段的值相同。多个cookie
可以由换行符分隔。
offset
设置初始字节偏移量。
end_offset
尝试将请求限制为此偏移量之前的字节。
method
当用作客户端选项时,它为请求设置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
16.11.1 HTTP Cookies
除非将cookie
值与请求一起传入,否则将拒绝某些HTTP
请求。 cookies
选项允许指定这些cookie
。 至少,每个cookie
必须指定一个值以及路径和域。 与域和路径匹配的HTTP
请求将自动在HTTP Cookie
标头字段中包含cookie
值。 多个cookie
可以通过换行符分隔。
播放指定cookie
的流所需的语法是:
ffplay -cookies "nlqptid=nltid=tsn; path=/; domain=somedomain.com;" http://somedomain.com/somestream.m3u8
16.12 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
方法。
icecast://[username[:password]@]server:port/mountpoint
16.13 mmst
TCP
上的MMS(Microsoft Media Server)
协议。
16.14 mmsh
通过HTTP
的MMS(Microsoft Media Server)
协议。
所需的语法是:
mmsh://server[:port][/app][/playpath]
16.15 md5
MD5
输出协议。
计算要写入的数据的MD5
哈希值,并在关闭时将其写入指定的输出或stdout
(如果未指定)。 它可用于测试复用器而无需编写实际文件。
一些例子如下:
# 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
输出协议而失败。
16.16 pipe
UNIX
管道访问协议。
从UNIX
管道读取和写入。
接受的语法是:
pipe:[number]
number
是与管道的文件描述符相对应的数字(例如,对于stdin
为0
,对于stdout
为1
,对于stderr
为2
)。 如果未指定number
,则默认情况下stdout
文件描述符将用于写入,stdin
用于读取。
例如,使用ffmpeg
从stdin
读取:
cat test.wav | ffmpeg -i pipe:0
# ...this is the same as...
cat test.wav | ffmpeg -i pipe:
用ffmpeg
写入stdout
:
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
,这导致不限制请求的块大小。 将此值设置得相当低可以改善用户终止请求响应时间,这在数据传输缓慢时很有用。
请注意,某些格式(通常为MOV
)要求输出协议是可搜索的,因此它们将使用管道输出协议失败。
16.17 prompeg
Pro-MPEG
操作规范#3
第2
版FEC
协议。
Pro-MPEG CoP#3 FEC
是用于通过RTP
发送的MPEG-2
传输流的2D
奇偶校验前向纠错机制。
此协议必须与rtp_mpegts muxer
和rtp
协议一起使用。
语法如下:
-f rtp_mpegts -fec prompeg=option=val... rtp://hostname:port
目标UDP
端口对于列FEC
流是端口+ 2
,对于行FEC
流是端口+4
。
该协议接受以下选项:
l=n
列数(4-20,LxD <= 100
)
d=n
行数(4-20,LxD <= 100
)
用法示例:
-f rtp_mpegts -fec prompeg=l=8:d=4 rtp://hostname:port