翻译ffmpeg-all文档(22),混合器(复用器)

6280阅读 0评论2015-07-20 xdsnet
分类:其他平台

混合器(复用器)

复用器是ffmpeg中负责写入多媒体流到文件中分区的可配置组件。

默认编译时自动允许被支持的混合器。你可以使用--list-muxers作为参数运行编译配置脚本以了解当前支持的所有混合器。

编译也可以同--disable-muxers禁用所有的混合器,或者通过--enable-muxer=MUXER / --disable-muxer=MUXER打开/关闭指定的混合器

在ff*工具集中附加-formats也可以了解到混合器列表。

下面将详细描述有效的混合器直播:

aiff

Audio Interchange File Format(aif)密码器

aiff选项

接受下面选项:

crc值

CRC (Cyclic Redundancy Check)测试格式

这个混合器通过所有输入的音频和视频帧计算(混合)Adler-32 CRC。默认音频会被转换为16bit符号原始音频,视频被解压为原始视频再进行这个计算。

输出会有一个形如CRC=0xCRC的一行,其中CRC的值是由16进制以0补足的8位数字,它由所有帧解码计算的。

参考[framecrc] 混合器

crc值计算例子

计算一个crc放置到out.crc:

ffmpeg -i INPUT -f crc out.crc 

计算crc并直接输出到标准输出设备:

ffmpeg -i INPUT -f crc - 

还可以选择对特定音频、视频编码数据计算crc,例如计算输入文件音频转换成PCM 8bit无符号数据格式,视频转换成MPEG-2 的CRC:

ffmpeg -i INPUT -c:a pcm_u8 -c:v mpeg2video -f crc - 

framecrc

每个数据包的CRC(循环冗余校验)测试格式。

它将对每个数据包做Adler-32 CRC计算并输出。默认音频被转换成16bit符号原始音频,视频被转换成原始视频再进行CRC计算。

输出是针对每个音频/视频数据包都有一行如下格式的信息:

stream_index, packet_dts, packet_pts, packet_duration, packet_size, 0xCRC 

其中CRC值是16进制,以0补足的8位数字值。

framecrc例子

对INPUT输入作每数据包CRC计算,输出到out.crc:

ffmpeg -i INPUT -f framecrc out.crc 

直接把计算结果输出到标准输出设备:

ffmpeg -i INPUT -f framecrc - 

通过ffmpeg,还可以选择输出特定音频和视频格式对应的帧CRC值,例如音频转换成PCM8bit无符号编码,视频为mpeg2计算帧CRC校验值:

ffmpeg -i INPUT -c:a pcm_u8 -c:v mpeg2video -f framecrc - 

参看[crc]混合器

framemd5

每个数据包MD5校验值

计算输出每个数据包MD5校验值,默认音频被转换成16bit符号原始音频,视频被转换成原始视频再进行MD5计算

每个数据包计算对应输出一行如下格式数据:

stream_index, packet_dts, packet_pts, packet_duration, packet_size, MD5 

其中MD5就是计算出的MD5 哈希值

framemd5例子

计算INPUT输入的帧md5值,其中音频被转换成16bit符号原始音频数据,视频被转换成原始视频数据,输出到out.md5

ffmpeg -i INPUT -f framemd5 out.md5 

直接输出到标准输出设备:

ffmpeg -i INPUT -f framemd5 - 

参考[md5]混合器部分

gif

Animated GIF(动画GIF)混合器

它接受如下选项:

注意1如果你想提取帧到指定的GIF文件序列,你可能需要image2混合器

ffmpeg -i INPUT -c:v gif -f image2 "out%d.gif" 

注意2Gif格式有一个非常小的时基:两帧之间的间隔不可小于百分之一秒。

hls

Apple HTTP 直播流混合器,它根据HTTP直播流(HLS)规范进行MPEG-TS分割

它创建一个播放列表文件,包括1个或者多个分段文件,输出文件为指定的播放列表文件。

默认混合器对每段创建一个文件,这些文件有相同的基于播放列表的文件名,段索引数和.tx扩展名

例如,转一个输入文件:

ffmpeg -i in.nut out.m3u8 

这将根据产品播放列表文件out.m3u8产生分段文件:out0.ts out1.ts out2.ts 等等

参考[segment]混合器,它提供了更多可用于HTL分割的常规处理和修正介绍

hls选项

这个混合器支持如下选项

ico

ICO文件混合器

微软ICON(ICO)文件格式有一些限制需要注意:

image2

图像文件混合器

它可以把视频帧重新混合为图像文件

输出文件按模板指定,可以设置成为一个序列数文件。模板中的"%d" 或者 "%0Nd"用于指定序列,其中"%0Nd"表示N位数字,以0补齐。如果文件名中有“%”需要以“%%”转义的形式指定。

如果模板中包含了"%d"或者"%0Nd"则文件名从1计数输出序列

模板可以包含一个后缀用来自动确定图像文件格式

例如模板"img-%03d.bmp"将使得输出为img-001.bmp, img-002.bmp, ...,img-010.bm 等等。而模板"img%%-%d.jpg"则生成img%-1.jpg, img%-2.jpg, ..., img%-10.jpg,等等

image2例子

把输入视频图像帧生成为img-001.jpeg, img-002.jpeg, ...,

ffmpeg -i in.avi -vsync 1 -r 1 -f image2 'img-%03d.jpeg' 

注意ffmpeg如果没有通过-f指定输出文件格式,image2混合器将自动被选择,所以前面的等效于

ffmpeg -i in.avi -vsync 1 -r 1 'img-%03d.jpeg' 

如果strfime选项允许你导出按时间/日期信息命名的文件 "%Y-%m-%d_%H-%M-%S" 模板,在strftime()的文档中了解相关语法

例如:

ffmpeg -f v4l2 -r 1 -i /dev/video0 -f image2 -strftime 1 "%Y-%m-%d_%H-%M-%S.jpg" 

image2选项

这个图像混合器支持.Y.U.V图像文件格式,这种格式将根据每帧输出3个文件,对于每个YUV420P压缩,对于读或者写这种文件格式,只需要指定.Y文件即可,混合器会自动打开需要的.U和.V文件

matroska

Matroska内容混合器

混合输出matroska和webm内容

matroska元数据

混合器需要指定一些必要元数据

例如,对于3DWebM影片,可以由下面命令建立:

ffmpeg -i sample_left_right_clip.mpg -an -c:v libvpx -metadata stereo_mode=left_right -y stereo_clip.webm 

matroska选项

支持如下选项:

md5

MD5检测格式

将计算输出一个MD5值,对于所有的音视频帧。默认音频帧转换为有符号16bit原始音频,视频转换为原始视频来计算。

输出是一个MD5=MD5 格式,其中MD5就是计算出的值。

例如:

ffmpeg -i INPUT -f md5 out.md5 

也可以输出到标准输出设备

ffmpeg -i INPUT -f md5 - 

参考[framemd5]混合器

mov,mp4,ismv

MOV/MP4/ISMV (Smooth Streaming——平滑流)混合器

MOV/MP4/ISMV混合器支持零碎文件(指数据的组织形式)。通常MOV/MP4文件把所有的元数据存储在文件的一个位置中(这是不零碎的数据组织形式,通常在末尾,也可以移动到起始以更好的支持随机定位播放,比如使用qt-faststart工具,并添加movflags快 速启动标志)。这样一个零碎文件包含了很多片段,其中数据包和元数据是存储在一起的。这样零碎数据组织的文件在解码到写中断(普通的MOV/MP4则不能 解码了,因为可能缺少元数据)时也能正常解码,而且这种方式要求更少的内存就可以写很大的文件(因为普通形式的MOV/MP4需要收集所有的信息才能最终 完成元数据集中存储,则这一过程中这些数据一直需要缓存在内存中,直到编码完成,元数据完成存储),这是一个优势。缺点是这种组织数据的格式不太通用(很 多程序不支持)

mov,mp4,ismv选项

零碎形式也支持AVOtions,它可以定义如何切分文件到零碎片段中:

此外,输出还可以通过一些其他选项进行调整:

mov,mp4,ismv例子

平滑流内容可以通过IIS进行发布,例如:

ffmpeg -re <normal input/transcoding options> -movflags isml+frag_keyframe -f ismv (Encoder1) 

mp3

MP3混合器通过下面选项写原始的MP3流:

一些例子:

mpegts

MPEG传输流混合器

这个混合器声明在 ISO 13818-1 和ETSI EN 300 468的部分内容中.

对于通用的元数据设置service_providerservice_name,如果没有特别指明,则默认service_provider为"FFmpeg",service_name为"Service01"

mpegts 选项

mpegts混合器选项有:

选项mpegts_service_type接受如下值:

选项mpegts_flags可以设置如下标志:

mpegts例子

ffmpeg -i file.mpg -c copy \  
 -mpegts_original_network_id 0x1122 \  
 -mpegts_transport_stream_id 0x3344 \  
 -mpegts_service_id 0x5566 \  
 -mpegts_pmt_start_pid 0x1500 \  
 -mpegts_start_pid 0x150 \  
 -metadata service_provider="Some provider" \  
 -metadata service_name="Some Channel" \  
 -y out.ts 

null

Null混合器

这个混合器将不产生任何输出文件,通常用于测试和基准检测

例如要检测一个解码器,你可以使用:

ffmpeg -benchmark -i INPUT -f null out.null 

注意前面的命令行并不读写out.null,仅仅是因为ffmpeg语法要求必须有个输出

等效的,你可以采用:

ffmpeg -benchmark -i INPUT -f null - 

nut

ogg

Ogg内容混合器

segment, stream_segment, ssegment

基本流分段

混合器将输出流到指定的文件(根据最接近的持续时间分段)。输出文件名模板可以采用类似与[image2]的方式,或者使用strftime模板(如果strftime选项被允许)

stream_segment是用于流式输出格式的混合器变种,例如不需要全局头,并要求诸如MPEG传输流分段输出的情况。ssegmentstream_segment的别名。

每个片段都开始于所选流的关键帧,这是通过reference_stream选项设置的

注意如果你想精确分割视频文件,你需要准确输入按关键帧整数倍对应的预期分割器,或者指定混合器按新片段必须是关键帧开始。

分段混合器对于固定帧率的视频有更好的工作表现

或者它可以生成一个创建段的列表,这需要通过segment_list选项设置,列表的类型由segment_list_type选项指定。在段列表输入一个文件名被默认为相应段文件的基本名称。

参看[hls]混合器,其提供更多关于HLS分段的特定实现

segment, stream_segment, ssegment选项

segment混合器器支持如下选项:

segment, stream_segment, ssegment例子

smoothstreaming

平滑流混合器生成一组文件(清单、块),适用于传统web服务器

tee

tee混合器可以用于同时把相同数据写入多个文件,或者任何其他类型的混合器。例如使用它可以同时把视频发布到网络上以及保存到磁盘上。

它不同于在命令行指定多个输出,因为利用tee混合器,音频和视频数据只被编码了一次,而编码是一个非常昂贵的行为。它是很有效的,当利用libavformat的API直接可以把相同的数据包用于多个混合器输出(多种封装格式或者场景)

多个输出文件由’|’分隔,如果参数中包含任意前导或尾随的空格,任何特殊字符都必须经过转义(参考 ffmpeg-utils(1)手册中的中 "Quoting and escaping" 章节).

混合器的选项可以由被“:”分隔的key=value列表进行指定。如果这种形式下选项参数值包含特殊字符,例如“:”则必须被转义。注意这个第二层次的转义

下列选项被要求:

tee例子

webm_dash_manifest

WebM DASH 清单混合器.

这个混合器实现了按WebM DASH清单规范生成DASH清单XML文件。它还支持生成DASH直播流

更多参考:

webm_dash_manifest选项 ####

支持如下选项:

webm_dash_manifest例子

ffmpeg -f webm_dash_manifest -i video1.webm \
   -f webm_dash_manifest -i video2.webm \
   -f webm_dash_manifest -i audio1.webm \
   -f webm_dash_manifest -i audio2.webm \
   -map 0 -map 1 -map 2 -map 3 \
   -c copy \
   -f webm_dash_manifest \
   -adaptation_sets "id=0,streams=0,1 id=1,streams=2,3" \
   manifest.xml 

webm_chunk

WebM直播块混合器

这个混合器输出WebM头和块分离文件,通过DASH它可以被支持WebM直播流的客户端处理。

webm_chunk选项

支持如下选项:

webm_chunk例子

ffmpeg -f v4l2 -i /dev/video0 \
   -f alsa -i hw:0 \
   -map 0:0 \
   -c:v libvpx-vp9 \
   -s 640x360 -keyint_min 30 -g 30 \
   -f webm_chunk \
   -header webm_live_video_360.hdr \
   -chunk_start_index 1 \
   webm_live_video_360_%d.chk \
   -map 1:0 \
   -c:a libvorbis \
   -b:a 128k \
   -f webm_chunk \
   -header webm_live_audio_128.hdr \
   -chunk_start_index 1 \
   -audio_chunk_duration 1000 \
   webm_live_audio_128_%d.chk 
上一篇:翻译ffmpeg-all文档(21),分离器
下一篇:翻译ffmpeg-all文档(23),元数据(metadata)