Chinaunix首页 | 论坛 | 博客
  • 博客访问: 703727
  • 博文数量: 95
  • 博客积分: 1773
  • 博客等级: 上尉
  • 技术积分: 1653
  • 用 户 组: 普通用户
  • 注册时间: 2007-08-17 23:28
文章分类
文章存档

2018年(2)

2017年(10)

2016年(7)

2015年(48)

2014年(2)

2013年(2)

2012年(2)

2011年(7)

2010年(7)

2009年(3)

2008年(1)

2007年(4)

分类: 其他平台

2015-07-20 08:48:29

协议

FFmpeg协议配置元素,用于访问资源时要求特定的协议。

默认编译时会自动支持所有可用协议。你可以在编译脚本中添加 "–list-protocols"选项来了解有哪些协议被支持。

你也可以在编译时通过 "–disable-protocols"禁止所有的协议支持,然后通过 "–enable-protocol=PROTOCOL"来启用个别协议,或者在默认基础上通过 "–disable-protocol=PROTOCOL"关闭个别协议支持。

在ff*工具集中,"-protocols"选项可以了解编译支持了的协议

当前有效协议介绍如下。

bluray

读取BluRay(蓝光)播放列表,其接受如下选项:

  • angle

    BluRay 角度/方向

  • chapter

    开始章(1...N)

  • playlist

    在(BDMV/PLAYLIST/?????.mpls) 读取播放列表

例如:

从加载映射目录/mnt/bluray 读取很长的蓝光播放列表

bluray:/mnt/bluray 

从加载映射目录/mnt/bluray 读取蓝光播放列表,从章2(chapter 2)开始,读取playlist 4angle 2

-playlist 4 -angle 2 -chapter 2 bluray:/mnt/bluray 

cache

对输入流的缓冲封装

缓存输入流到临时文件,以提供对在线流的搜寻/定位支持。

cache:URL 

concat

物理连接协议

从许多资源(资源序列,把它们当作一种独特的资源)中读取和搜索定位

这个协议按如下语法接受URL:

concat:URL1|URL2|...|URLN 

这里的URL1、URL2...URLN都是需要连接起来的资源url,每个可能是一个不同的协议

例如,需要利用ffplay播放一个序列的资源(包含split1.mpeg,split2.mpeg,split3.mpeg):

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

注意在大多数shell中可能你需要对"|"进行转义

crypto

AES加密(AES-encrypted)流读取协议,其接受如下选项:

  • key:设置AES解密密钥,是用16进制表示的二进制数据块
  • iv:设置AES解密初始化向量二进制块,也是用16进制表示。

允许如下的URL格式:

  • crypto:URL
  • crypto+URL

data

在URI中的行内数据,参考

  • timeout

    以毫秒(microseconds)为单位设置I/O操作超时时间。默认为-1,表示没有指定。

  • mime_type

    导出MIME类型

  • icy

    如果设置为1将从服务器请求ICY (SHOUTcast)元数据。如果服务器支持,将通过icy_metadata_headersicy_metadata_packet传递具体的请求,默认值为1。

  • icy_metadata_headers

    如果服务器支持ICY元数据,它将包含由换行符分隔(即每行1个)的ICY-specific HTTP 应答头

  • icy_metadata_packet

    如果服务器支持ICY元数据,且icy被设置为1,这将包含服务器发送的最后非空元数据包, 它用于定期处理程序执行期间中间流元数据更新

  • cookies

    设置未来请求的cookie。 格式为Set-Cookie HTTP响应一样,多个cookie值可以由换行符隔开。

  • offset

    设置初始字节偏移量

  • end_offset

    尝试偏移限定,单位字节

  • method

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

    当用在服务器端选项时,它设定(预计)从客户机获要用的方法。如果预期和收到的HTTP方法都不能与客户端匹配将是一个很糟糕的问题。当前对是否设置本方式不检测,以后会自动检测。

  • listen

    如果设置为1,将使用实验性质的HTTP服务。它可以用于在输出中指定数据(例如)——对输出文件,或者通过HTTP POST读取输入端数据

  •  # 服务器段(发送):
        ffmpeg -i somefile.ogg -c copy -listen 1 -f ogg 
    
        # 客户端 (接收):
        ffmpeg -i  -c copy somefile.ogg
    
        # 客户端可以像下面这样工作
        wget  -O somefile.ogg
    
        # 服务器端接收
    
        # 客户端 (发送):
        ffmpeg -i somefile.ogg -chunked_post 0 -c copy -f ogg 
    
        # 客户端也可以联用在`wget`中
        wget --post-file=somefile.ogg  

    HTTP Cookie

    一些HTTP请求将被拒绝,除非cookie值按要求进行传递。cookies选项允许对cookie进行指定。至少cookie需要指定一个路径和域。HTTP请求将自动匹配域和路径,并把包含的cookie值放置HTTP Cookie头中。多个cookie可以由换行分隔。

    下面的请求语法就是播放一个流时指定了cookie:

    ffplay -cookies "nlqptid=nltid=tsn; path=/; domain=somedomain.com;"  

    Icecast

    Icecast (stream to Icecast servers) 协议

    协议支持如下的选项:

    • ice_genre

      设置流样式

    • ice_name

      设置流名字

    • ice_description

      设置流说明

    • ice_url

      设置流web URL

    • ice_public

      为1表示流可以被公开,否则为0表示不能公开,默认为0(不公开)

    • user_agent

      覆盖用户代理头。如果没有指定则 "Lavf/" 被使用

    • password

      设置Icecast挂载password.

    • content_type

      设置内容类型。它对audio/mpeg 必须设置为不同

    • legacy_icecast

      这将使得支持 Icecast的版本< 2.4.0,不过源方法将不再支持HTTP PUT方法。

    协议URL指定方法:

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

    mmst

    基于TCP的MMS (Microsoft Media Server)协议.

    mmsh

    基于HTTP的MMS (Microsoft Media Server)协议

    请求语法:

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

    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)要求输出协议是可以搜索/检索(seekable)的,这时MD5输出协议将不被支持(对于这样的MD5计算要求,只能是先生成文件,再利用其它工具对文件计算MD5)。

    pipe

    UNIX先入先出访问协议(管道)

    通过UNIX pipe读写

    语法为:

    pipe:[number] 

    这里number是对应管道文件描述符(例如0对应stdin,1对应stdout,2对应stderr)。如果number没有指定,默认为stdout被用于输出写,stdin被用于输入读

    例如 ffmpeg从stdin读取

    cat test.wav | ffmpeg -i pipe: 

    又如写入标准输出:

    ffmpeg -i test.wav -f avi pipe:1 | cat > test.avi 

    它等效于

    ffmpeg -i test.wav -f avi pipe: | cat > test.avi 

    协议支持如下选项:

    • blocksize

      设置I/O操作最大块尺寸,单位byte(字节)。默认是INT_MAX,表示没有限制。如果设置了这个值将改善对数据传输缓慢的情况下用户终止请求反应的时间。

    注意一些格式(例如MOV)要求输出协议是可以搜索/检索(seekable)的,这时pipe输出协议将不被支持

    rtmp

    rtmp(Real-Time Messaging Protocol.)

    RTMP被用通过TCP/IP网络流式处理多媒体内容

    请求语法:

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

    其中各个参数为:

    • username

      可选的用户名,一般在公开发布时

    • passwrod

      可选的密码,一般在公开发布时

    • server

      RTMP服务器地址

    • port

      TCP端口号,默认1935

    • app

      它是根据应用程序的名称来访问,它通常对应于应用程序在RTMP服务器上的安装路径(例如/ondemand/, /flash/live/等等),你可以通过rtmp_app选项值来覆盖URI

    • playpath

      是通过app指定的要播放资源的路径或者名称,可能有mp4:前缀,你可以通过rtmp_playpath选项值来覆盖

    • listen

      作为服务器,侦听传入的连接

    • timeout

      设置传入连接最大等待时间,其间一直侦听

    额外的,下面的参数可以通过命令行(或者在代码中通过AVOptionS)设置

    • rtmp_app

      连接到RTMP服务的程序名。它可以用于覆盖URI中对应部分

    • rtmp_buffer

      设置客户端缓冲时间,单位milliseconds,默认3000.

    • rtmp_conn

      额外的AMF连接参数,参数值是字符串,从中解析出AMF信息。例如: B:1 S:authMe O:1 NN:code:1.23 NS:flag:ok O:0 .每个值有一个单字符前导(B表示布尔值,N表示数字值,S表示字符串,O表示对象,Z表示null),后面加冒号":",对于布尔值,范围为0或者1分 别对应FALSETRUE。同样对于对象值,必须由0或者1开始或者结束. 数据子项可以被命名,如果数据前面指定了N并且在值前面命名了数据(例如NB:myFlag:1),这个选项可以被多次在AMF序列中使用。

    • rtmp_flashver

      SWF播放器插件版本,默认 LNX 9,0,124,2. (当发布,默认为FMLE/3.0 (兼容与 ).)

    • rtmp_flush_interval

      在同一请求的数据包刷新数量(只RTMPT)。默认值是10。

    • rtmp_live

      指示是一个直播流。直播流不能重放和搜索。默认值为any,它意味着首先尝试按直播流去搜索playpath,如果没有找到再以记录流去搜索。其他参数值为liverecorded

    • rtmp_pageurl

      嵌入在URL中的媒体页面。默认没有值被发送

    • rtmp_playpath

      要播放/发布的流的ID。这个值将覆盖URI中的对应部分

    • rtmp_subscribe

      直接订阅的直播流名字,默认没有值被发送。这个值仅在被指定,而且rtmp_live被设置为live时发送

    • rtmp_swfhash

      解压SWF文件的SHA256(32 bytes).

    • rtmp_swfsize

      解压SWF文件的尺寸,被SWFVerification要求

    • rtmp_swfurl

      对应媒体SWF播放器的URL。默认没有值被发送

    • rtmp_swfverify

      播放对应swf文件URL,会自动计算hash/size

    • rtmp_tcurl

      目标流URL,默认为proto://host[:port]/app 例如利用ffplay播放myserver服务器上vod应用下的sample资源:

      ffplay rtmp://myserver/vod/sample 发布一个资源到密码保护的服务器上

      ffmpeg -re -i -f flv -rtmp_playpath some/long/path -rtmp_app long/app/name rtmp://username:password@myserver/ 这里最终发布的URL为rtmp://username:password@myserver/long/app/name/some/long/path

    rtmpe

    加密的Real-Time Messaging Protocol.

    通过提供的标准加密原语加密流式多媒体内容的RTMPE。由Diffie-Hellman 和 HMACSHA256作为密钥交换,产生一对RC4密钥

    rtmps

    基于安全SSL的rtmp

    通过SSL通道传输的rtmp

    rtmpt

    基于HTTP的Rtmp

    由HTTP通道承载的RTMP,这样可以突破很多防火墙限制。

    rtmpte

    加密RTMP,且通过http传输

    在HTTP通道承载下,进行加密rtmp的传输。

    rtmpts

    通过HTTPS传输的rtmp。

    通过HTTPS进行传输的rtmp,它可以突破很多防火墙并提供安全的连接

    libsmbclient

    libsmbclient提供对CIFS/SMB网络资源访问支持

    支持一下语法:

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

    支持下面选项:

    • timeout

      以miliseconds为单位设置I/O操作时限。默认设置为-1,表示没有限制

    • truncate

      如果设置为1,表示文件存在则覆盖,否则为0,默认为1

    • workgroup

      设置工作组属性覆盖参数,默认未设置

    更多信息参考

    它提供了关于(rtmp, rtmpe, rtmps, rtmpt, rtmpte)大部分客户端功能和一些服务器功能。

    请求语法为:

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

    这里rtmp_proto可以是(rtmp, rtmpe, rtmps, rtmpt, rtmpte)中的一个,此外诸如serverportappplaypath都和在原生RTMP中一样。options是由空格分隔的key=val值对列表

    例如,在ffmpeg中流式输出到RTMP协议:

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

    用ffplay播放这个流:

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

    rtp

    Real-time Transport Protocol——RTP,实时传输协议

    请求语法: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,单位 bytes. 

    connect=0|1

    为1则在UDP socket上连接(connect()),否则(为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.

    rtsp

    Real-Time Streaming Protocol——RTSP,实时流协议

    RTSP在libavformat中不是作为技术协议处理,而是作为分离器和混合器。分离器支持两种常见的RTSP(基于RTP的数据传输,被用在Apple 和Microsoft)和Real-RTSP(基于RDT的数据传输)

    混合器可以用来发送流(使用RTSP ANNOUNCE)给支持它的服务器(当前有Darwin流服务器和Mischa Spiegelmock管理员在2009年8月13日编辑了该文章文章。

    -->
    阅读(2440) | 评论(0) | 转发(0) |
    给主人留下些什么吧!~~