前言
Github地址:Github
简书地址:简书
专辑地址:FFplay专辑
16.18 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
等待传入连接的最长时间。意思是倾听。
此外,可以通过命令行选项(或通过AVOptions在代码中)设置以下参数:
`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_flashver
用于运行SWF播放器的Flash插件的版本。默认值为LNX 9,0,124,2。 (发布时,默认为FMLE/3.0(兼容; <libavformat版本>)。)
rtmp_flush_interval
在同一请求中刷新的数据包数(仅限RTMPT)。默认值为10。
rtmp_live
指定媒体是实时流。不能在直播中恢复或寻找。默认值为any,这意味着订户首先尝试播放在播放规范中指定的直播流。如果找不到该名称的直播流,则播放录制的流。其他可能的值是实时和记录。
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。
例如,使用来自RTMP服务器myserver的应用程序vod中的ffplay读取名为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/
16.19 rtmpe
加密的实时消息传递协议。
加密实时消息传递协议(RTMPE)用于在标准加密原语内流式传输多媒体内容,包括Diffie-Hellman密钥交换和HMACSHA256,生成一对RC4密钥。
16.20 rtmps
通过安全SSL连接的实时消息传递协议。
实时消息传递协议(RTMPS)用于跨加密连接流式传输多媒体内容。
16.21 rtmpt
通过HTTP进行管道传输的实时消息传递协议。
通过HTTP(RTMPT)管道传输的实时消息传递协议用于在HTTP请求中流式传输多媒体内容以遍历防火墙。
16.22 rtmpte
通过HTTP管道传输的加密实时消息传递协议。
通过HTTP管道传输的加密实时消息传递协议(RTMPTE)用于在HTTP请求中流式传输多媒体内容以遍历防火墙。
16.23 rtmpts
通过HTTPS进行管道传输的实时消息传递协议。
通过HTTPS(RTMPTS)管道传输的实时消息传递协议用于在HTTPS请求中流式传输多媒体内容以遍历防火墙。
16.24 libsmbclient
libsmbclient允许用户操作CIFS/SMB网络资源。
语法如下:
smb://[[domain:]user[:password@]]server[/share[/path[/file]]]
该协议接受以下选项。
timeout
设置基础低级操作使用的套接字I/O操作的超时(以毫秒为单位)。 默认情况下,它设置为-1,这意味着未指定超时。
truncate
如果设置为1,则在写入时截断现有文件。值为0可防止截断。 默认值为1。
workgrou
设置用于建立连接的工作组。 默认情况下,未指定工作组。
有关更多信息,请参阅:http://www.samba.org/。
16.25 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
16.26 librtmp rtmp, rtmpe, rtmps, rtmpt, rtmpte
通过librtmp支持实时消息传递协议及其变体。
在配置期间需要存在librtmp标头和库。 需要使用-enable-librtmp显式配置构建。 如果启用,这将替换本机RTMP协议。
该协议提供了大多数客户端功能和支持RTMP所需的一些服务器功能,通过HTTP(RTMPT)管道传输的RTMP,加密的RTMP(RTMPE),基于SSL/TLS的RTMP(RTMPS)以及这些加密类型的管道变体(RTMPTE,RTMPTS)。
所需的语法是:
rtmp_proto://server[:port][/app][/playpath] options
其中rtmp_proto是对应于每个RTMP变体的字符串rtmp,rtmpt,rtmpe,rtmps,rtmpte,rtmpts之一,并且服务器,端口,app和playpath具有与指定相同的含义 用于RTMP本机协议。 options包含key = val形式的空格分隔选项列表。
有关更多信息,请参见librtmp手册页(man 3 librtmp)。
例如,使用ffmpeg将文件实时流式传输到RTMP服务器:
ffmpeg -re -i myfile -f flv rtmp://myserver/live/mystream
要使用ffplay播放相同的流:
ffplay "rtmp://myserver/live/mystream live=1"
16.27 rtp
实时传输协议。
RTP URL所需的语法是:rtp://hostname[:port][?option=val...]
port指定要使用的RTP端口。
支持以下URL选项:
TTL = N
设置TTL (Time-To-Live)值(仅适用于多播)。
rtcpport = N
将远程RTCP端口设置为n。
localrtpport = N
将本地RTP端口设置为n。
localrtcpport = N
将本地RTCP端口设置为n。
pkt_size = N
将最大数据包大小(以字节为单位)设置为n。
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。
重要笔记:
1.如果未设置rtcpport,则RTCP端口将设置为RTP端口值加1。
2.如果未设置localrtpport(本地RTP端口),则任何可用端口都将用于本地RTP和RTCP端口。
3.如果未设置localrtcpport(本地RTCP端口),则将其设置为本地RTP端口值加1。
16.28 rtsp
实时流媒体协议。
RTSP在技术上不是libavformat中的协议处理程序,它是一个分离器和多路复用器。 分路器支持普通RTSP(通过RTP传输数据;例如Apple和Microsoft使用)和Real-RTSP(通过RDT传输数据)。
可以使用muxer将流使用RTSP ANNOUNCE发送到支持它的服务器(目前是Darwin Streaming Server和Mischa Spiegelmock的RTSP服务器)。
RTSP网址所需的语法是:
rtsp://hostname[:port]/path
可以在ffmpeg/ffplay命令行上设置选项,也可以通过AVOptions或avformat_open_input在代码中设置选项。
支持如下选项:
initial_pause
如果设置为1,请勿立即开始播放流。默认值为0。
rtsp_transport
设置RTSP传输协议。
它接受以下值:
| 值 | 解释 |
|---|---|
| UDP | 使用UDP作为较低的传输协议。 |
| TCP | 使用TCP(RTSP控制信道内的交织)作为较低的传输协议。 |
| udp_multicast | 使用UDP多播作为较低的传输协议。 |
| HTTP | 使用HTTP管道作为较低的传输协议,这对于传递代理很有用 |
可以指定多个较低的传输协议,在这种情况下,它们一次尝试一个(如果一个设置失败,则尝试下一个)。 对于复用器,仅支持tcp和udp选项。
rtsp_flags
设置RTSP标志。
能接受的值如下表所述:
| 值 | 解释 |
|---|---|
| filter_src | 仅接受来自协商的对等地址和端口的数据包 |
| listen | 充当服务器,侦听传入连接 |
| prefer_tcp | 如果TCP可用作RTSP RTP传输,请首先尝试使用TCP进行RTP传输 |
默认值为none。
allowed_media_types
设置要从服务器接受的媒体类型。
接受以下标志:
| 值 |
|---|
| video |
| audio |
| data |
默认情况下,它接受所有媒体类型。
min_port
设置最小本地UDP端口。 默认值为5000。
max_port
设置最大本地UDP端口。 默认值为65000。
timeout
设置等待传入连接的最大超时(以秒为单位)。
值-1表示无限(默认)。 此选项意味着rtsp_flags设置为listen。
reorder_queue_size
设置要缓冲的数据包数以处理重新排序的数据包。
stimeout
设置套接字TCP I/O超时(以微秒为单位)。
user-agent
覆盖User-Agent标头。 如果未指定,则默认为libavformat标识符字符串。
当通过UDP接收数据时,解复用器尝试重新排序接收到的数据包(因为它们可能无序到达,或者数据包可能完全丢失)。 可以通过将最大解复用延迟设置为零(通过AVFormatContext的max_delay字段)来禁用此功能。
当使用ffplay观看多比特率Real-RTSP流时,可以分别为视频和音频选择-vst n和-ast n来显示要显示的流,并且可以通过按v和a来即时切换。
16.28.1 Examples
以下示例均使用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输出
16.29 sap
会话公告协议(RFC 2974)。 这在技术上不是libavformat中的协议处理程序,它是一个muxer和demuxer。 它通过在单独的端口上定期通知流的SDP,用于RTP流的信令。
16.29.1 Muxer
提供给多路复用器的SAP url的语法是:
sap://destination[:port][?options]
RTP数据包在端口端口上发送到目标,如果没有指定端口,则发送到端口5004。选项是一个&分离列表。支持以下选项:
announce_addr=address
指定发送通知的目标IP地址。如果省略,则通知将发送到常用的SAP公告多播地址224.2.127.254(sap.mcast.net)或ff0e :: 2:7ffe(如果destination是IPv6地址)。
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
通过IPv6观看ffplay:
ffmpeg -re -i input -f sap sap://[ff0e::1:2:3:4]
16.29.2 Demuxer
提供给解复用程序的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]
16.30 sctp
流控制传输协议。
接受的URL语法是:
sctp://host:port[?options]
该协议接受以下选项:
listen
如果设置为任何值,请侦听传入连接。 默认情况下,传出连接已完成。
max_streams
设置最大流数。 默认情况下,不设置限制。
16.31 srt
通过libsrt实现Haivision安全可靠传输协议。
SRT url支持的语法是:
srt://hostname:port[?options]
options包含key = val形式的&-separated选项列表。
或者:
options srt:// hostname:port
options包含-key val选项列表。
该协议接受以下选项:
connect_timeout
连接超时; SRT无法连接RTT> 1500毫秒(2次握手交换),默认连接超时为3秒。 此选项适用于呼叫者和集合点连接模式。 连接超时是集合点模式设置值的10倍(可以用作早期版本此连接问题的解决方法)。
ffs=bytes
飞行标志大小(窗口大小),以字节为单位。 FFS实际上是一个内部参数,您应该将其设置为不小于recv_buffer_size和mss。 默认值相对较大,因此除非设置非常大的接收缓冲区,否则无需更改此选项。 默认值为25600。
inputbw=bytes/seconds
发送者标称输入速率,以每秒字节数为单位。 与oheadbw一起使用,当maxbw设置为relative(0)时,计算恢复数据包与主媒体流一起发送时的最大发送速率:inputbw'*(100 +'oheadbw')/ 100 if 'maxbw'设置为relative(0)时未设置inputbw,实际输入速率在库内评估。 默认值为0。
iptos=tos
IP服务类型。 仅适用于发件人。 默认值为0xB8。
ipttl=ttl
IP生存时间。 仅适用于发件人。 默认值为64。
listen_timeout
设置套接字监听超时。
maxbw=bytes/seconds
最大发送带宽,以每秒字节数为单位。 -1无限(CSRTCC限制为30mbps)0相对于输入速率(参见inputbw)> 0绝对限制值默认值为0(relative)
mode=caller|listener|rendezvous
连接模式。 caller打开客户端连接。 listener启动服务器以侦听传入的连接。 rendezvous使用Rendez-Vous连接模式。 默认值是调用者。
mss=bytes
最大段大小,以字节为单位。 用于缓冲区分配和速率计算,使用数据包计数器假定完全填充的数据包。 使用对等体之间的最小MSS。 整个互联网默认为1500。 这是UDP数据包的最大大小,只能减少,除非您有一些不寻常的专用网络设置。 默认值为1500。
nakreport=1|0
如果设置为1,Receiver将定期发送UMSG_LOSSREPORT消息,直到重新传输或故意丢弃丢失的数据包。 默认值为1。
oheadbw=percents
恢复带宽开销高于输入速率,以百分比表示。 请参阅inputbw。 默认值为25%。
passphrase=string
HaiCrypt加密/解密密码短语字符串,长度从10到79个字符。 密码短语是发送者和接收者之间的共享秘密。 它用于使用PBKDF2(基于密码的密钥派生函数)生成密钥加密密钥。 仅当pbkeylen非零时才使用它。 仅在接收的数据被加密时才在接收器上使用它。 配置的密码短语无法恢复(只写)。
pbkeylen=bytes
发件人加密密钥长度,以字节为单位。 只能设置为0,16,24和32.如果不是0,则启用发送方加密。接收方不需要(设置为0),从HaiCrypt握手中的发送方获取密钥大小。 默认值为0。
recv_buffer_size=bytes
设置接收缓冲区大小,以字节为单位。
send_buffer_size=bytes
设置发送缓冲区大小,以字节为单位。
rw_timeout
设置读/写选择的引发错误超时。
此选项仅在读取模式下相关:如果没有超过此时间间隔的数据,则引发错误。
tlpktdrop=1|0
Too-late的丢包。 当在接收器上启用时,它会跳过未及时传送的丢失数据包,并在其播放时间到来时将以下数据包传送给应用程序。 它还向发送方发送假ACK。 当在发送方上启用并在接收对等方上启用时,发送方丢弃不能及时交付的旧数据包。 如果接收方支持,它会在发送方自动启用。
tsbpddelay
基于时间戳的数据包传送延迟。 用于吸收丢失数据包重传的突发。
有关更多信息,请参阅:https://github.com/Haivision/srt。
16.32 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个字节用作master salt。
16.33 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
16.34 tee
将输出写入多个协议。 各个输出由|分隔。
tee:file://path/to/local/this.avi|file://path/to/local/that.avi
16.35 tcp
传输控制协议。
TCP网址所需的语法是:
tcp://hostname:port[?options]
options包含key = val形式的&-separated选项列表。
支持的选项列表如下:
listen=1|0
侦听传入连接。 默认值为0。
timeout=microseconds
设置提升错误超时,以微秒表示。
此选项仅在读取模式下相关:如果没有超过此时间间隔的数据,则引发错误。
listen_timeout=milliseconds
设置监听超时,以毫秒为单位。
recv_buffer_size=bytes
设置接收缓冲区大小,表示字节。
send_buffer_size=bytes
设置发送缓冲区大小,表示字节。
tcp_nodelay=1|0
设置TCP_NODELAY以禁用Nagle的算法。 默认值为0。
以下示例显示如何使用ffmpeg设置侦听TCP连接,然后使用ffplay访问该连接:
ffmpeg -i input -f format tcp://hostname:port?listen
ffplay tcp://hostname:port
16.36 tls
传输层安全性(TLS)/安全套接字层(SSL)
TLS/SSL URL语法如下:
tls://hostname:port[?options]
可以通过命令行选项(或通过AVOptions在代码中)设置以下参数:
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
如果启用,请侦听提供的端口上的连接,并假定握手中的服务器角色而不是客户端角色。
示例命令行:
创建服务输入流的TLS/SSL服务器。
ffmpeg -i input -f format tls://hostname:port?listen&cert=server.crt&key=server.key
使用ffplay从TLS/SSL服务器回放流:
ffplay tls://hostname:port
16.37 udp
用户数据报协议。
UDP url所需的语法是:
udp://hostname:port[?options]
options包含key = val形式的&-separated选项列表。
如果在系统上启用了线程,则使用循环缓冲区来存储传入数据,这样可以减少由于UDP套接字缓冲区溢出而导致的数据丢失。 fifo_size和overrun_nonfatal选项与此缓冲区相关。
支持的选项列表如下:
buffer_size=size
设置UDP最大套接字缓冲区大小,以字节为单位这用于设置接收或发送缓冲区大小,具体取决于套接字的用途。默认值为64KB。另见fifo_size。
bitrate=bitrate
如果设置为非零,则输出将具有指定的常量比特率,如果输入具有足够的数据包来维持它。
burst_bits=bits
使用比特率时,它指定数据包突发中的最大比特数。
localport=port
覆盖要绑定的本地UDP端口。
localaddr=addr
选择本地IP地址。这很有用,例如如果发送组播并且主机有多个接口,则用户可以通过指定该接口的IP地址来选择要发送的接口。
pkt_size=size
设置UDP数据包的大小(以字节为单位)。
reuse=1|0
明确允许或禁止重用UDP套接字。
ttl=ttl
设置生存时间值(仅适用于多播)。
connect=1|0
使用connect()初始化UDP套接字。在这种情况下,以后无法使用ff_udp_set_remote_url更改目标地址。如果在开始时未知目标地址,则也可以在ff_udp_set_remote_url中指定此选项。这允许查找具有getsockname的数据包的源地址,并且如果收到destination unreachable,则使用AVERROR(ECONNREFUSED)返回写入。对于接收,这提供了仅接收来自指定对等地址/端口的分组的益处。
sources=address[,address]
仅接收从指定的发送方IP地址之一发送到组播组的数据包。
block=address[,address]
忽略从指定的发送方IP地址发送到组播组的数据包。
fifo_size=units
设置UDP接收循环缓冲区大小,表示为大小为188字节的数据包数。如果未指定,则默认为7 * 4096。
overrun_nonfatal=1|0
在UDP接收循环缓冲区溢出的情况下生存。默认值为0。
timeout=microseconds
设置提升错误超时,以微秒表示。
此选项仅在读取模式下相关:如果没有超过此时间间隔的数据,则引发错误。
broadcast=1|0
明确允许或禁止UDP广播。
请注意,广播可能无法在具有广播风暴保护的网络上正常工作。
16.37.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 ...
16.38 unix
Unix本地套接字
Unix套接字URL所需的语法是:
unix://filepath
可以通过命令行选项(或通过AVOptions在代码中)设置以下参数:
timeout
超时以毫秒为单位。
listen
在侦听模式下创建Unix套接字。