您的位置:首页 > 其它

ffmpeg的中文文档(三)

2017-02-16 00:00 267 查看
由于内容长度过长,第一部分的内容,点此查看;第二部分内容,点此查看

-map_metadata[:metadata_spec_out] infile[:metadata_spec_in] (output,per-metadata)


根据
infile
设置下一个输出文件的元数据信息。请注意,这些都是文件索引(从零开始),而不是文件名。可选参数
metadata_spec_in/out
可用于指定哪些元数据进行复制。元数据说明可以有以下几种形式:

`g`
全局元数据,即元数据应用于整个文件

`s[:stream_spec]`
每个流的元数据`stream_spec`是一个流标识符,参见流标识符一章。在输入的元数据时,将从第一个匹配的流复制。在输出元数据时,将复制到所有匹配流。

`c:chapter_index`
每章的元数据`chapter_index`是从零开始的章节索引。

`p:program_index`
每个项目的元数据`program_index`是从零开始的的项目索引。

如果元数据说明被省略,则默认为全球性的。

缺省情况下,全局元数据是从第一输入文件复制的,每个流和每个章节的元数据与数据流/章节将被依次复制。创建相关类型的任何映射将禁用这些默认映射。否定的文件索引可以用来创建只禁用自动复制的虚拟映射。

例如,从输入文件的第一数据流复制元数据到输出文件的全局元数据:
ffmpeg -i in.ogg -map_metadata 0:s:0 out.mp3

反过来,即全局的元数据复制到所有音频流:
ffmpeg -i in.mkv -map_metadata:s:a 0:g out.mkv

需要注意的是0在本实例中能起到相同的效果,由于全局元数据被假定默认。

-map_chapters input_file_index (output)


从输入文件复制章节与索引
input_file_index
到下一个输出文件中。如果不指定章节映射,则章节从第一输入文件复制并至少有一个章节。使用负的文件索引来排除任何章节的复制。

-benchmark (global)


在编码结束显示基准信息。显示使用的CPU时间和最大内存消耗。不是所有系统都支持最大内存消耗,如果不支持,它通常会显示为0。

-benchmark_all (global)


显示编码过程中基准信息。显示各个步骤(音频/视频编码/解码)所使用的CPU时间。

-timelimit duration (global)


在已经运行
duration
秒后退出ffmpeg

-dump (global)


转储每个输入包到标准错误流。

-hex (global)


当dump包时,也dump有效载荷。

-re (input)


读取输入的原始帧速率。主要用于模拟抓取设备。或实时输入流(例如从文件读取时)。不应该在实际的抓取设备或实时输入流中使用(它可能会导致数据包丢失)。默认ffmpeg尝试尽可能快地读出输入端。此选项会减慢输入的本地帧速率的读取。它是用于实时输出(如直播)是有用的。

-loop_input


循环输入流。目前,它仅适用于图像流。此选项用于自动测试
ffserver
。此选项已被弃用,使用
-loop 1


-loop_output number_of_times


反复循环输出支持循环的格式如动画GIF(0意味着无限循环输出)。此选项已被弃用,使用
-loop


-vsync parameter


视频同步方法。出于兼容性考虑旧值可以被指定为数字。新添加的值将必须总是指定为字符串。

0, passthrough
每一帧传递从分流器到复用器的时间戳。

1, cfr
帧将被复制并下降至达到完全所需的恒定帧速率。

2, vfr
帧通过与其时间戳或下降,从而防止两帧具有相同的时间戳。

drop
与passthrough相同,但破坏所有时间戳,使得复用器生成基于帧速率新的时间戳。

-1, auto
根据复用器的功能选择1或者2。这是默认的方法。

注意,该时间戳在此之后可以进一步由复用器修改。例如,在格式选项
avoid_negative_ts
被启用时。

-map
联用,您可以选择从哪个流提取时间戳。您可以留下视频或音频不变,同步剩余流不变的。

-async samples_per_second


音频同步的方法。“伸展/挤压”音频流相匹配的时间戳,所述参数是音频发生改变所容许的每秒最大点数。
-async 1
是一种特殊情况,音频数据流仅在开始校正,而其后将不再校正。

注意,该时间戳在此之后可以进一步由复用器修改。例如,在格式选项
avoid_negative_ts
被启用时。

此选项已被弃用。使用
aresample
音频过滤器代替。

-copyts


不要处理输入时间戳,但保持它们的值,不尝试对它们进行sanitize。尤其是,不要删除初始启动时间偏移值。

需要注意的是,即使使用了该选项,根据不同的
vsync
选项或对特定复用器处理(例如格式选项
avoid_negative_ts
被启用)输出时间戳与输入可能不匹配时间戳。

-start_at_zero


当与
copyts
使用,调整输入时间戳,使他们从零开始。

这意味着使用例如
-ss 50
将使输出时间戳开始50秒时,不管输入文件开始处的时间戳是多少。

-copytb mode


指定在拷贝流时如何设置编码器的时间基准,mode是一个整型,可以假定为下列值之一:

1
使用分流器的时间基准。

时间基准从相应的输入分流器复制到输出编码器。该情况下,对可变帧速率的视频流的复制,有时需要避免非单调的时间戳。

0
使用解码器时间基准。

时间基准从相应的输入解码器复制到输出编码器。

-1
尝试自动做出选择,以便产生一个合理的输出。

默认值为-1。

-shortest (output)


最短的输入流结束时完成编码。

-dts_delta_threshold


时间戳间断门槛。

-muxdelay seconds (input)


设置最大分流解码延时。

-muxpreload seconds (input)


设定初始解码分流延迟。

-streamid output-stream-index:new-value (output)


分配一个新流id值到输出流。该选项​需指定到输出文件名之前。对于在多个输出文件存在的情况下,一个流id将被重新分配到不同的值。

例如,要设置流0 到流33,同时流1至流36,到MPEGTS格式的输出文件:
ffmpeg -i infile -streamid 0:33 -streamid 1:36 out.ts

-bsf[:stream_specifier] bitstream_filters (output,per-stream)


指定匹配流的
bitstream_filters
。它是一个逗号分隔的滤镜列表。使用
-bsfs
选项得到的滤镜列表。

ffmpeg -i h264.mp4 -c:v copy -bsf:v h264_mp4toannexb -an out.h264
ffmpeg -i file.mov -an -vn -bsf:s mov2textsub -c:s copy -f rawvideo sub.txt

-tag[:stream_specifier] codec_tag (input/output,per-stream)


指定匹配流的
tag/fourcc


-timecode hh:mm:ssSEPff


指定写入的时间码。对于non drop 时间码,分隔符SEP是
:
对于drop时间码是
;
(或
.
)。

ffmpeg -i input.mpg -timecode 01:02:03.04 -r 30000/1001 -s ntsc output.mpg

-filter_complex filtergraph (global)


定义复杂FilterGraph,即具有输入和/或输出任意个数的滤镜组。对于简单滤镜——那些具有一个输入和相同类型的一个输出的滤镜——参见
-filter
选项。FilterGraph是FilterGraph的描述,参见FFMPEG滤镜手册的“FilterGraph语法”部分中的描述。

输入链路标签必须关联到使用
[file_index:stream_specifier]
语法标记的输入流(即-map选项中使用的格式)。如果
stream_specifier
匹配多个流,第一个将被使用。未标记的输入将被连接到匹配类型的第一未使用的输入流。

输出链接标签由
-map
指定。未标记的输出被加到第一输出文件。

注意,使用该选项,可以只有lavfi源而没有正常的输入文件。

例如,叠加图像到视频
ffmpeg -i video.mkv -i image.png -filter_complex '[0:v][1:v]overlay[out]' -map '[out]' out.mkv

这里[0:v]指的是在第一输入文件中的第一视频流,这是与覆盖滤波器的第一(主)输入。同样,在第二输入的第一视频流链接到覆盖层的第二(覆盖)输入。

假定在每个输入文件中只有一个视频流,就可以省略输入标签,因此上述命令相当于
ffmpeg -i video.mkv -i image.png -filter_complex 'overlay[out]' -map'[out]' out.mkv

此外,我们可以省略输出标签和单输出的滤镜,它将被自动添加到输出文件,所以我们可以简单地写
ffmpeg -i video.mkv -i image.png -filter_complex 'overlay' out.mkv

要使用lavfi产生5秒钟的纯红色视频color来源:
ffmpeg -filter_complex 'color=c=red' -t 5 out.mkv

-lavfi filtergraph (global)


定义复杂FilterGraph,即具有输入和/或输出任意个数的滤镜组。相当于
-filter_complex


-filter_complex_script filename (global)


这个选项类似于
-filter_complex
,唯一的区别是,它的参数是包含被读取FilterGraph的文件的名称。

-accurate_seek (input)


此选项启用或禁用准确寻求输入文件,配合
-ss
选项使用。它默认是启用的,所以当转码时是准确的。使用
-noaccurate_seek
禁用它,在拷贝一些数据流和转码时,这可能是有用的。

-override_ffserver (global)


从ffserver 覆盖输入规格。使用这个选项,你可以映射任何输入流到ffserver,并从ffmpeg 控制编码的许多方面。如果没有这个选项ffmpeg将发送ffserver要求的内容。

该选项用于那些不能被指定到ffserver的功能 ,即便他们可以用于ffmpeg 。

-discard (input)


允许在分路器丢弃特定流或流帧。不是所有的分路器都支持。

none
禁止丢弃帧。

default
默认情况下,不丢弃帧。

noref
丢弃所有非参考帧。

bidir
放弃所有双向帧。

nokey
丢弃所有帧除了关键帧。

all
丢弃所有帧。

作为一个特例,可以使用一个位图字幕流作为输入:它将被转换到文件中最大的视频相同尺寸,或720×576,如果没有视频。需要注意的是,这是一个实验性和临时解决方案。它会在libavfilter有适当字幕支持后删除。

例如,硬编码存储在MPEG-TS格式的DVB-T的记录的顶部字幕,1秒延迟字幕:
ffmpeg -i input.ts -filter_complex \
'[#0x2ef] setpts=PTS+1/TB [sub] ; [#0x2d0] [sub] overlay' \
-sn -map '#0x2dc' output.mkv

(0x2d0,0x2dc和0x2ef分别是MPEG-TS的PID的视频,音频和字幕流; 0:0,0:3和0:7可起到同样作用)


5.12 预置文件

预置文件是包含
option = value
的文件 ,每行一个,指定的选项需按照命令行中的顺序。’#’开头的字符行被忽略,并用来提供注释。参见FFmpeg的源代码树中的preset目录中的例子。

Preset files are specified with the vpre, apre, spre, and fpre options. The fpre option takes the filename of the preset instead of a preset name as input and can be used for any kind of codec. For the vpre, apre, and spre options, the options specified in a preset file are applied to the currently selected codec of the same type as the preset option.

The argument passed to the vpre, apre, and spre preset options identifies the preset file to use according to the following rules:

First ffmpeg searches for a file named arg.ffpreset in the directories FFMPEGDATADIR(ifset),andFFMPEGDATADIR(ifset),andHOME/.ffmpeg, and in the datadir defined at configuration time (usually PREFIX/share/ffmpeg) or in a ffpresets folder along the executable on win32, in that order. For example, if the argument is libvpx-1080p, it will search for the file libvpx-1080p.ffpreset.

If no such file is found, then ffmpeg will search for a file named codec_name-arg.ffpreset in the above-mentioned directories, where codec_name is the name of the codec to which the preset file options will be applied.

6 提示

为在非常低的比特率流,使用低帧速率和小的GOP大小。这对于那些配置较低的Linux用户上播放RealVideo尤是如此,它可能会丢帧。例如:
ffmpeg -g 3 -r 3 -t 10 -b:v 50k -s qcif -f rv10 /tmp/b.rm


编码中显示的参数“q”是当前量化器。值1表示非常良好的质量。值31表示最差的质量。如果Q = 31出现过于频繁,这意味着该编码器无法压缩到满足您的比特率要求的码率。您必须增加比特率,降低帧率或减少帧的大小。

如果你的电脑不够快,可以牺牲压缩比换取速度。你可以用
-me 0
加快运动估计和
-g 0
完全禁用运动估计(你仅有I-frames,这意味着它几乎和JPEG压缩一样好)。

可通过降低采样频率获得非常低的音频比特率(对于MPEG音频,下降到22050Hz,对于AC-3, 使用22050或11025Hz)。

有一个恒定的质量(但可变比特率),使用选项
-qscale N
时,
N
是1(优秀品质)和31(质量最差)之间。

7 范例

7.1 预置文件

预置文件包含option=value,一个用于每行,指定其也可以指定的命令行上的选项的序列的序列。’#’开头的字符行被忽略,并用来提供注释。空行将也被忽略。检查的例子FFmpeg的源代码树中的preset目录。

预置文件中指定的pre选项,这个选项需要一个预设名称作为输入。FFmpeg在
$AVCONV_DATADIR
$HOME/.ffmpeg
以及编译时指定的目录(通常是
$PREFIX/share/ffmpeg
)的目录中搜索文件名​​为
preset_name.avpreset
的文件。例如,如果该参数是
libx264-max
,它会搜索文件
libx264-max.avpreset


7.2 视频和音频抓取

如果指定了输入格式和设备,ffmpeg将可以直接抓取视频和音频。 ffmpeg -f oss -i /dev/dsp -f video4linux2 -i /dev/video0 /tmp/out.mpg

或从ALSA音源(单声道输入,卡ID 1),而不是OSS: ffmpeg -f alsa -ac 1 -i hw:1 -f video4linux2 -i /dev/video0 /tmp/out.mpg

请注意,您必须在启动ffmpeg前激活正确的视频源和信道,比如的xawtv。你也必须正确设置混音器中的音频记录电平。

7.3 X11抓取

使用ffmpeg抓取X11显示器 ffmpeg -f x11grab -video_size cif -framerate 25 -i :0.0 /tmp/out.mpg 0.0是display.screen数量的X11服务器,与DISPLAY环境变量一致。

ffmpeg -f x11grab -video_size cif -framerate 25 -i :0.0+10,20 /tmp/out.mpg
0.0是display.screen数量的X11服务器,与DISPLAY环境变量一致。10是在x偏移和20的y偏移。


7.4 视频和音频文件格式转换

任何支持的文件格式和协议可以作为ffmpeg的输入:

范例:

您可以使用YUV文件作为输入:
ffmpeg -i /tmp/test%d.Y /tmp/out.mpg


它将使用文件:

/tmp/test0.Y, /tmp/test0.U, /tmp/test0.V,/tmp/test1.Y, /tmp/test1.U, /tmp/test1.V, etc...Y,/ tmp目录/ TEST0。U, /tmp/test0.V,
/tmp/test1.Y, /tmp/test1.U, /tmp/test1.V, etc...

Y文件使用的U和V文件的分辨率的两倍。他们是原始文件,没有头信息。他们可以通过所有视频解码器产生。您必须指定图像的大小与-s选项,如果ffmpeg的不能猜测它。

您可以从原始YUV420P文件输入:
ffmpeg -i /tmp/test.yuv /tmp/out.avi


test.yuv是含有生YUV平面数据的文件。每个帧是由Y平面后跟U和V平面的一半的垂直和水平分辨率。

可以输出到原始文件YUV420P:
ffmpeg -i mydivx.avi hugefile.yuv


您可以设置多个输入文件和输出文件:
ffmpeg -i /tmp/a.wav -s 640x480 -i /tmp/a.yuv /tmp/a.mpg


转换音频文件a.wav和原始YUV视频文件a.yuv到MPEG文件a.mpg。

你也可以同时做音频和视频转换:
ffmpeg -i /tmp/a.wav -ar 22050 /tmp/a.mp2


使用22050赫兹的采样率转换a.wav到MPEG音频。

可以同时进行多种格式的编码,并定义从输入流到输出数据流的映射:
ffmpeg -i /tmp/a.wav -map 0:a -b:a 64k /tmp/a.mp2 -map 0:a -b:a 128k /tmp/b.mp2


转换a.wav到64千比特的a.mp2和128千比特的b.mp2。
-map file:index
输出数据流的定义的顺序指定了用于每一个输出流的输入流。

您可以转码解密的VOB:
ffmpeg -i snatch_1.vob -f avi -c:v mpeg4 -b:v 800k -g 300 -bf 2 -c:a libmp3lame -b:a 128k snatch.avi


这是一个典型的DVD翻录的例子;输入是VOB文件,输出与MPEG-4视频和MP3音频的AVI文件。注意,在这个命令,我们使用B帧,以便对MPEG-4流与DivX5兼容,并且GOP大小为300,这意味着每10秒插入一帧到29.97fps的输入视频。此外,音频流是MP3编码,所以你需要启用通过传递LAME支持可使用–enable-libmp3lame配置。该映射是特别有用的用于DVD的转码,以获得所需的音频语言。

注意:使用
ffmpeg -formats
查看支持的输入格式。

您可以从视频中提取图像,或从图像创建视频:

从视频中提取图片:
ffmpeg -i foo.avi -r 1 -s WxH -f image2 foo-%03d.jpeg


这将每秒提取一个视频帧,并输出到名为foo-001.jpeg,foo-002.jpeg等图片中。图片将被重新缩放到定义的尺寸。

如果你想提取有限数量的帧,你可以组合使用上面的命令与-vframes或-t选项,或与-ss开始从某一个时间点提取。

从图像创建视频:
ffmpeg -f image2 -i foo-%03d.jpeg -r 12 -s WxH foo.avi


语法
foo-%03d.jpeg
指定要使用的三个数字组成的十进制数用零填充到表达的序列号。它支持C语言
printf
函数相同的语法,但只有格式接受整数。

当导入图像序列,
-i
还支持Shell扩展通配符。这在内部通过image2-specific
-pattern_type glob
选项选择。

例如,从文件名​匹配
foo-*.jpeg
的图片创建视频
ffmpeg -f image2 -pattern_type glob -i 'foo-*.jpeg' -r 12 -s WxH foo.avi


可以把相同类型的许多流到输出文件:
ffmpeg -i test1.avi -i test2.avi -map 1:1 -map 1:0 -map 0:1 -map 0:0 -c copy -y test12.nut


产生的输出文件test12.nut将包含从以相反的顺序存储的输入文件中的四个流。

要强制CBR视频输出:
ffmpeg -i myfile.avi -b 4000k -minrate 4000k -maxrate 4000k -bufsize 1835k out.m2v


lmin
lmax
mblmin
mblmax
四个选项的单位是
lambda
,但你可以使用QP2LAMBDA常熟轻松地从
q
单位转换:
ffmpeg -i src.ext -lmax 21*QP2LAMBDA dst.ext


8 参见

ffmpeg-all , ffplay , ffprobe , ffserver , ffmpeg-utils , ffmpeg-scaler , ffmpeg-resampler , ffmpeg-codecs , ffmpeg-bitstream-filters , ffmpeg-formats , ffmpeg-devices , ffmpeg-protocols , ffmpeg-filters
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: