本文主要参考 ffmpeg 官方文档 和 ffmpeg basics
命令行工具 | 语法 | 说明 |
---|---|---|
ffmpeg |
| 快速音频和视频编码器/解码器 |
ffplay |
| 媒体播放器 |
ffprobe |
| 显示媒体文件的信息 |
ffserver |
| 使用HTTP和RTSP协议进行多媒体流的广播服务器 |
ffplay -f lavfi -i testsrc -vf pad='400:300:(ow-iw)/2:(oh-ih)/2:orange'
软件库 | 说明 |
---|---|
libavcodec | 用于解码和编码多媒体的编解码器库 |
libavdevice | 是一个特殊的设备复用/解复用库,是libavformat库的补充 |
libavfilter | 过滤器库,它为FFmpeg和客户端库或应用程序提供媒体过滤层 |
libavformat | 音频/视频容器格式的解复用和复用的库 |
libavutil | 用于FFmpeg的不同部分的例程的辅助库, 如转义,计算音频通道等 |
libpostproc | 用于后期处理的软件库 |
libswresample | 用于音频重采样的软件库 |
libswscale | 视频图像缩放的库 |
ffmpeg [global_options] {[input_file_options] -i INPUT_FILE} ... {[output_file_options] OUTPUT_FILE}...
// 比如:
ffmpeg [参数1]global_options [参数2]input_file_options -i [参数3]INPUT_FILE [参数4]output_file_options [参数5]OUTPUT_FILE
_______ ______________
| | | |
| input | demuxer | encoded data | decoder
| file | ---------> | packets | -----+
|_______| |______________| |
v
_________
| |
| decoded |
| frames |
|_________|
________ ______________ |
| | | | |
| output | <-------- | encoded data | <----+
| file | muxer | packets | encoder
|________| |______________|
ffplay -i input_file ... test_options
ffmpeg -f lavfi -i rgbtestsrc -pix_fmt yuv420p -f sdl Example
# 顺时针旋转 90°:使用转置过滤器
ffplay -f lavfi -i testsrc -vf transpose=1
# 使用atempo音频过滤器将输入音频的速度降低到80%:
ffmpeg -i input.mp3 -af atempo=0.8 output.mp3
filter filtergraph
就是只有1个输入和输出的滤镜,滤镜两边的数据都是同一类型的,可以理解为在非压缩数据帧到再次编码前简单附加了一步 -filter_complex filtergraph
是那些不能简单描述为一个线性处理过程应用到一个流的情况,例如当过程中有多个输入和/或输出,或者输出流类型不同于输入时. -lavfi
或者 -filter_complex
, 两者是等价的. 【这里有个容易混淆的 fflay -f lavfi 给 virtual device 提供输入】[file_index:stream_specifier]
表示 label, 可以在 -map 中引用;如果 stream_specifier 匹配多个 stream,使用第一个 _________ ______________
| | | |
| decoded | | encoded data |
| frames |\ _ | packets |
|_________| \ /||______________|
\ __________ /
simple _\|| | / encoder
filtergraph | filtered |/
| frames |
|__________|
_________
| |
| input 0 |\ __________
|_________| \ | |
\ _________ /| output 0 |
\ | | / |__________|
_________ \| complex | /
| | | |/
| input 1 |---->| filter |\
|_________| | | \ __________
/| graph | \ | |
/ | | \| output 1 |
_________ / |_________| |__________|
| | /
| input 2 |/
|_________|
# -vf <=> -filter:v
ffmpeg -i input.mpg -vf hqdn3d,pad=2*iw output.mp4
ffmpeg -i output.mp4 -i input.mpg -filter_complex overlay=w compare.mp4
使用带有链接标签的filtergraph,就只有一个命令:
# 分割过滤器将输入分为2个输出标签[a]和[b],然后将[a]链接用作第二个filterchain的输入,它为标记[a]的比较创建了一个pad。[b]链接被用作第三个filterchain的输入,它创建一个标记为[b]的输出。最后一个filterchain使用[A]和[B]标签作为覆盖过滤器的输入,从而产生最终的比较。
ffplay -i i.mpg -vf 'split[a][b];[a]pad=2*iw[A];[b]hqdn3d[B];[A][B]overlay=w'
下图是另一个例子: ffplay -f lavfi -i rgbtestsrc -vf "split[a][b];[a]pad=2*iw[1];[b]vflip[2];[1][2]overlay=w"
-map [-]input_file_id[:stream_specifier][?][,sync_file_id[:stream_specifier]] | [linklabel] (output)
, 举例:流的形式说明符
说明符形式 | 描述 |
---|---|
stream_index | 选择该索引的流(编号) |
|
|
|
|
stream_id | 按格式指定的ID选择流 |
-codec:a:1 ac3
对 a:1
使用 ac3 codec, -codec: copy
或者 -codec copy
则对所有 stream 使用 codec copyffmpeg -i input.mpg -b:a 128k -b:v 1500k output.mp4
# 下面这个命令中 out1.mkv out2.wav 将包含 A.avi, B.mp4 中最佳的 video/audio 和第一个 subtitle
# 而 out3.mov 只会有 B.mp4 中的 audio, 而且不会处理,只是 copy
ffmpeg -i A.avi -i B.mp4 out1.mkv out2.wav -map 1:a -c:a copy out3.mov
# 下面的命令中 out1.mkv 只会有 audio/video 因为默认的字幕 encoder 是 Matroska muxer 是 text-based,但是 C.mkv 里面的的字幕是 image-based
# 所以字幕不会被选择;而 out2.mkv 只有 video/subtitle 因为 audio 被 -an 操作排除了
ffmpeg -i C.mkv out1.mkv -c:s dvdsub -an out2.mkv
# 下面这个命令中 overlay 需要两个输入,但是没有指定,所以自动选择 A.avi 和 C.mkv 中的 video 生成 out1.mp4, 同时 out1.mp4 会有 A,C 中最佳
# audio, 但是不会有字幕,因为 mp4 没有默认字幕 encoder,又没主动设置。out2.srt 将选择 A,C 中第一个 text-based 字幕流
ffmpeg -i A.avi -i C.mkv -i B.mp4 -filter_complex "overlay" out1.mp4 out2.srt
# 下面的命令使用 labeled filtergraph, 这里要注意, 对于 label outv1, outv2 都要**有且仅有一次的使用**,如果没有 label 默认输出到第一个输出
# outv1, overlay, aresample 都会输出到 out1.mp4, -an 不会抑制 filtergraphs 的输出;out2.mkv 由 automatic stream selection 决定输出
# out3.mkv 输入内容为 hue filter 的一份输出 + B.mp4 的第一个 audio
ffmpeg -i A.avi -i B.mp4 -i C.mkv -filter_complex "[1:v]hue=s=0,split=2[outv1][outv2];overlay;aresample" \
-map '[outv1]' -an out1.mp4 \
out2.mkv \
-map '[outv2]' -map 1:a:0 out3.mkv
Lavfi通常用于显示测试模式,例如带有命令的SMPTE条:
ffplay -f lavfi -i smptebars
ffplay -f lavfi -i color=c=blue
ffmpeg -? or ffmpeg -h
; ffmpeg -h long or ffmpeg -h full
; ffmpeg –? topic or ffmpeg -h topic
例如,要显示关于FLV解码器的信息,我们可以使用以下命令:
ffmpeg -h decoder=flv
帮助项目 | 命令 |
---|---|
可用的比特流过滤器 |
|
可用的解码器 |
|
可用的编码器 |
|
可用的过滤器 |
|
可用的格式 |
|
可用的音频通道布局 |
|
可用的像素格式 |
|
可用的协议 |
|
可用的音频样本格式 |
|
常见的视频帧率 | 描述 |
---|---|
24p or 23.976 | 从20世纪20年代开始,电影行业的标准帧速率,所有的电影都是以这个频率拍摄的。 当这些电影被采用到NTSC电视广播时,帧速率降低到24×1000/1001 = 23.976值,但是对于PAL / SECAM电视,电影的帧速率增加到25帧/秒。 |
25p | 由于25个逐行扫描视频可轻松转换为50个隔行扫描电视场,因此电影频率为50赫兹(PAL和SECAM标准)的国家中的电影和电视的标准帧频。 |
30p | 常见的视频帧速率,常用于数码相机和摄像机。 它可用于60赫兹(NTSC)隔行场的电视广播。 |
50i | PAL和SECAM电视的标准场率(隔行帧率)。 |
60ior 59.94 | NTSC电视的标准场频率,在彩电发明之后,帧速率被降低到60 * 1000/1001 = 59.94的值,以防止色度副载波和声音载波之间的干扰。 |
50p/60p | HDTV(高清晰度电视)的通用帧频。 |
48p | 提议的帧速率,目前经过测试了 |
72p | 提议的帧速率,目前经过测试了 |
120p | 为UHDTV(超高清晰度电视)标准化的渐进式格式,计划成为UHDTV的单一全球“双精度”帧速率(而不是使用PAL标准的100 Hz和NTSC标准的119.88 Hz) |
ffmpeg -i input -r fps output
fps=fps=number_of_frames
缩写 | 精确值 | 相应的FPS(相应的帧) |
---|---|---|
ntsc-film | 24000/1001 | 23.97 |
film | 24/1 | 24 |
pal, qpal, spal | 25/1 | 25 |
ntsc, qntsc, sntsc | 30000/1001 | 29.97 |
# 改变视频的帧率。avi文件从25到30 fps
ffmpeg -i input.avi -r 30 output.mp4
# 要更改剪辑的输入帧速率。mpg文件到值25
ffmpeg -i clip.mpg -vf fps=fps=25 clip.webm
# 设置帧速率为29.97 fps
ffmpeg -i input.avi -r ntsc output.mpg
比特率是决定整体音频或视频质量的参数。 它规定了每时间单位处理的位数,在FFmpeg中,比特率以每秒位数表示。
-b
【encoding,audio/video】, -ba
【encoding,audio】, -bt
【encoding,video】类型 | 缩写 | 描述 |
---|---|---|
平均比特率 | ABR | 平均每秒处理的位数,该值也用于VBR编码,需要时是输出的某个文件大小 |
恒定比特率 | CBR | 每秒处理的比特数是恒定的,这对于存储是不实际的,因为具有快速运动的部分需要比静态比特更多的比特,CBR主要用于多媒体流 |
可变比特率 | VBR | 每秒处理的比特数是可变的,复杂的场景或声音被编码更多的数据并与CBR进行比较,相同尺寸的文件的VBR质量比CBR更好(VBR编码比CBR需要更多的时间和CPU功率 ,但最近的媒体播放器可以充分解码VBR。)相关option: |
ffmpeg -i input.avi -fs 10MB output.mp4
file_size = (video_bitrate + audio_bitrate) * time_in_seconds / 8
-aspect
调整横纵比# 下面两个命令等价
ffmpeg -i input.avi -s 640x480 output.avi
ffmpeg -i input.avi -s vga output.avi
#例如,800x600(SVGA)分辨率的视频包含2像素宽的细节。 当缩放到640x480(VGA)分辨率时,缩放比率为0.8,并且2像素再缩放为2像素:
640 pixels / 800 pixels = 0.8
2 pixels * 0.8 = 1.6 ≈ 2 pixels
# 但是当这个视频被缩放到160x120 (QQVGA)分辨率时,细节就丢失了:
160 pixels / 800 pixels = 0.2
2 pixels * 0.2 = 0.4 ≈ 0 pixels
# 将128x96视频话放大到分辨率256x192像素
ffmpeg -i phone_video.3gp -vf super2xsai output.mp4
scale=width:height[:interl={1|-1}]
; 有一些变量可用,比如:iw or in_w
: 输入的宽度; ih or in_h
: 输入的高度a
: 纵横比,与iw/ih相同。sar
: 输入样本纵横比,与dar/a相同;dar
:输入显示纵横比,与*sar相同。# 按比例缩放视频输入
ffmpeg -i input.mpg -vf scale=iw/2:ih/2 output.mp4
# 扩展到预定义的宽度或高度: 等比缩放
ffmpeg -i input.avi -vf scale=400:400/a
crop=ow[:oh[:x[:y[:keep_aspect]]]]
; 可用变量:x, y
: 对x的计算值(从左上角水平方向的像素个数)和y(垂直像素的数量),对每个帧进行评估,x的默认值为(iw - ow)/2, y的默认值为(ih - oh)/2 in_w, iw
: 输入的宽度; in_h, ih
: 输入的高度out_w, ow
: 输出(裁剪)宽度,默认值= iw; out_h, oh
: 输出(裁剪)高度,默认值= iha
: 纵横比,与iw/ih相同; sar
: 输入样本比例; dar
: 输入显示宽比,等于表达式a*sarhsub, vsub
: 水平和垂直的色度子样本值,对于像素格式yuv422p, hsub的值为2,vsub为1n
: 输入框的数目,从0开始pos
: 位置在输入框的文件中,如果不知道NANt
: 时间戳以秒表示,如果输入时间戳未知ffmpeg -i input_file -vf crop=w:h output_file
会剪裁中间的 w:h 区域cropdetect[=limit[:round[:reset]]]
, limit 参数表示对灰度值 < limit 的进行剪裁pad=width[:height[:x[:y[:color]]]]
例子
ffplay -f lavfi -i testsrc -vf pad=380:360:30:30:pink -t 50
# 从4:3到16:9的填充视频
ffmpeg -i input -vf pad=ih*16/9:ih:(ow-iw)/2:0:color output
# 从16:9到4:3的填充视频
ffmpeg -i input -vf pad=iw:iw*3/4:0:(oh-ih)/2:color output
-vf hflip
-vf vflip
transpose={0, 1, 2, 3}
, 参数含义见下面的 例子中的 help例子
ffplay -f lavfi -i testsrc -vf hflip
# 一个看 help 的例子
> ffmpeg -h filter=transpose
Filter transpose
Transpose input video.
slice threading supported
Inputs:
#0: default (video)
Outputs:
#0: default (video)
transpose AVOptions:
dir <int> ..FV....... set transpose direction (from 0 to 7) (default cclock_flip)
cclock_flip 0 ..FV....... rotate counter-clockwise with vertical flip
clock 1 ..FV....... rotate clockwise
cclock 2 ..FV....... rotate counter-clockwise
clock_flip 3 ..FV....... rotate clockwise with vertical flip
passthrough <int> ..FV....... do not apply transposition if the input matches the specified geometry (from 0 to INT_MAX) (default none)
none 0 ..FV....... always apply transposition
portrait 2 ..FV....... preserve portrait geometry
landscape 1 ..FV....... preserve landscape geometry
boxblur=luma_r:luma_p[:chroma_r:chroma_p[:alpha_r:alpha_p]]
filter expects 2 or 4 or 6 parameters, r =半径, p = 权重,程度,功率smartblur=luma_r:luma_s:luma_t[:chroma_r:chroma_s:chroma_t]
r = radius, p = power, t = thresholdl_msize_x:l_msize_y:l_amount:c_msize_x:c_msize_y:c_amount
all parameters are optional, if not set, the default is 5:5:1.0:5:5:0.0mp=denoise3d[=luma_spatial[:chroma_spatial[:luma_tmp[:chroma_tmp]]]]
hqdn3d=[luma_spatial[:chroma_spatial[:luma_tmp[:chroma_tmp]]]]
ffplay -i input.avi -nr 500
overlay[=x:y[[:rgb={0, 1}]]
参数x和y是可选的,其默认值为0 rgb参数是可选的,其值为0或1;这个 filter 的意思是在指定位置上覆盖第一个输入. 比如 ffmpeg -i input1 -i input2 -filter_complex overlay=x:y output
itsoffset
: ffmpeg -i video_with_timer.mp4 -itsoffset 5 -i logo.png -filter_complex overlay timer_with_logo.mp4
# overlay 里面重要等变量为:
# main_w or W 主要输入宽度; main_h or H 主要输入高度
# overlay_w or w overlay输入宽度; overlay_h or h overlay输入高度
# 下面这个命令会把 overlay 放在右上角
ffmpeg -i pair.mp4 -i logo.png -filter_complex overlay=W-w pair2.mp4
drawtext=fontfile=font_f:text=text1[:p3=v3[:p4=v4[...]]]
p3,p4 ...表示参数#3,参数#4等; 这个 filter 的参数比较多,可以用 ffmpeg -h filter=drawtext
查看ffplay -f lavfi -i color=white -vf drawtext=fontfile=/Library/Fonts/Baskerville.ttc:text=Welcome
# 横向运动的文字
ffmpeg -f lavfi -i color=orange -vf drawtext="text=hello:x=w-t*50:y=h-th:fontcolor=blue:fontsize=30" -t 50 test.mp4
fmpeg -formats
可以看到所有支持的文件格式(容器),比如 mp4, mp3 等等ffmpeg -codecs
可以看到所有的编解码器,命令行上的编解码器是由-c或-codec选项指定的,语法是:-codec[:stream_specifier] codec_name
ffmpeg -i input.avi -q 1 -c copy output.mov
ffmpeg -h encoder={name}
和 ffmpeg-formats 文档 来查看帮助# 语法如下,用在 input 前面就是 decoder, 用在 output 前面就是 encoder
-c[:stream_specifier] codec (input/output,per-stream)
-codec[:stream_specifier] codec (input/output,per-stream)
# 一个 stream 前面可能应用了很多 codec, 以 last matching c option 为准
# 比如下面这个命令会 用 libx264 encode 第一个 video, libvorbis encode 第 137 个 audio, 其他 stream copy
ffmpeg -i INPUT -map 0 -c copy -c:v:1 libx264 -c:a:137 libvorbis OUTPUT
[-]HH:MM:SS[.m…]
和 [-]S+[.m…]
, 其中,HH 表示小时,MM 表示分钟,SS 或 S 表示秒数,m 表示毫秒.setpts=expression
; 音频速度改变使用 filter atempoffmpeg -i music.mp3 -t 180 music_3_minutes.mp3
ffmpeg -i video.avi -vframes 15000 video_10_minnutes.avi
ffmpeg -i input.avi -ss 10 output.mp4
# 从 video.mpg 中保存第5分钟的部分
ffmpeg -i video.mpg -ss 240 -t 60 clip_5th_minute.mpg
# 音频比视频要快了 1.5 秒 做同步, 这里 -c 表示 -codec[:stream_specifier] codec <=> -c[:stream_specifier] codec (input/output,per-stream)
ffmpeg -i input.mpv -map 0:v -map 0:a -itsoffset 1.5 -c:a copy -c:v copy output.mov
# 视频快了 5 秒 做同步
ffmpeg -i input.mov -map 0:v -itsoffset 5 -map 0:a -c:a copy -c:v copy output.mov
# 两个文件,将音频流延迟 3 秒
ffmpeg -i v.mpg -itsoffset 3 -i a.mp3 -map 0:v:0 -map 1:a:0 output.mp4
# 3 倍速来观看视频
ffplay -f lavfi -i testsrc -vf setpts=PTS/3
# 2 倍速来播放输入音频
ffplay -i speech.mp3 -af atempo=2
# 使用时间戳来同步 music.mpg 文件中的数据
ffmpeg -i music.mpg -af asyncts=compensate=1 -f mpegts music.ts
abs
, asin(x)
, eq(x, y)
, gte(x, y)
, if(expr1, expr2)
, min(x, y)
, while(cond, expr)
等等# 产生频率为523.251 Hz的C5音调(中音高C)的音调
ffplay -f lavfi -i aevalsrc='sin(523.251*2*PI*t)'
元数据
包含艺术家,作者,日期,流派,发布者,标题等附加信息,不会显示在视频帧中。而字幕是文本数据,显示在视频帧底部附近,通常包含在单独的文件中,尽管一些容器文件格式(如VOB)支持包含字幕文件。-metadata k1=v1 -metadata k2=v2
-f ffmetadata
; 加载文件元数据到文件 -i x -i y
-map_metadata -1
subtitles=filename[:original_size]
, 例子: ffmpeg -i video.avi -vf subtitles=titles.srt video.mp4
# 查看一个 mp3 文件的元数据
> ffprobe '~/Downloads/Jack Johnson - Imagine.mp3'
... 省略部分内容
Input #0, mp3, from '~/Downloads/Jack Johnson - Imagine.mp3':
Metadata:
encoder : Lavf56.4.101
disc : 1
track : 11
artist : Jack Johnson
comment : 163 key(Don't modify):L64FU3W4YxX3ZFTmbZ+8/UnVjCnqpKdEibASol9of8KaPX//btdBYF+VVRkXkEDD/iGR355GeUXxh0IUGR/GwBNi9G4ezN6Z7cPYKcJ3G01aqRPkU1umKYjjZLXvNFMCMLrmf5mGqVQo+hTaZlpidWU9kf8oTXfXHN4cj2PKPLh7HFCdJ/oKzLj3tB/BKqQJjZ1moy59PXmgevX6IGXydNfGHhxwts+3ZlZ/1FBko
title : Imagine
album : The Mango Tree
# 新建元数据
ffmpeg -i '~/Downloads/Jack Johnson - Imagine.mp3' -metadata "k1=v1" -metadata "k2=v2" -y ~/Downloads/test.mp3
# 保存元数据到文件
ffmpeg -i ~/Downloads/test.mp3 -f ffmetadata ~/Downloads/test.txt
# 加载文件元数据到文件
ffmpeg -i ~/Downloads/test.txt -i ~/Downloads/test.mp3 ~/Downloads/test2.mp3
# 删除元数据
ffmpeg -i input.avi -map_metadata -1 output.mp4
下图不一定准确,可以参考一下常见的 predefined metadata 有哪些 key
虽然FFmpeg工具的主要用途与音频和视频有关,但ffmpeg可以对各种图像格式进行解码和编码,并且许多图像相关任务可以快速完成
Y.U.V
, BMP
, GIF
, JPG
....略ffmpeg -i input -ss t image.type
ss 表示从哪开始, t 表示 时刻,这是 ffmpeg 一致的参数color[=c=clr[:d=time[:r=fps[:sar=value[:s=resolution]]]]]
ffmpeg -i clip.avi frame%4d.jpg
【todo 补充更多实用例子】ffmpeg -i image.type1 image.type2
ffmpeg -loop 1 -i photo.jpg -t 10 photo.mp4
ffmpeg -f image2 -i img%d.jpg -r 25 video.mp4
# 截图
ffmpeg -i in1.mp4 -ss 3 -frames:v 1 snap.jpg
# gif
ffmpeg -i in1.mp4 -pix_fmt rgb24 in1.gif
# 从内置视频源生成图片,比如生成一个单色的图片
ffmpeg -f lavfi -i color=c=#008080:s=728x90 -frames:v 1 leaderboard.jpg
数字音频是一种技术,用于捕获、记录、编辑、编码和复制声音,这些声音通常由脉冲编码调制(PCM)进行编码。FFmpeg支持许多音频格式,包括AAC、MP3、Vorbis、WAV、WMA等
音频位深度
, 量化常见的位深度有: aevalsrc
来创建声音, 语法为 aevalsrc=exprs[::options]
exprs:是一个冒号分隔的表达式列表,每个新表达式都指定了新通道; options:键=值对的冒号分隔列表; c or channel_layout
: 通道布局,通道数量必须等于表达式的数量; d or duration
: max 持续时间,如果没有指定,或者是负数,音频将生成直到程序停止; n or nb_samples: 每个通道每个输出帧的样本数量,默认为1024个样本; s or sample_rate
: 采样率,默认值为44100 Hz-vol [0-256]
, 如果值<1, 那么 output_volume = vol * input_volume
, 如果有后缀 dB, output_volume = 10 ^(卷/ 20)* input_volume
amix=inputs=ins[:duration=dur[:dropout_transition=dt]]
pan=layout:channel_def[:channel_def[:channel_def...]]
-map_channel
选项可以更改各种音频参数,其语法为: -map_channel [in_file_id.stream_spec.channel_id|-1][:out_file_id.stream_spec]
# 产生音符A4,音高的调优标准,将tone_height设置为440 Hz:
ffplay -f lavfi -i aevalsrc='sin(440*2*PI*t)' -t 2
# 多声道【立体声】
ffplay -f lavfi -i aevalsrc='sin(495*2*PI*t)|cos(505*2*PI*t):c=FL+FR'
# 音频分析
ffmpeg -report -i ~/Downloads/test.mp3 -af ashowinfo -f null /dev/null
ffmpeg -i input -fpre mpeg2.ffpreset -q 1 MPEG2_video.mpg
-target
命令,比如 -target vcd
会自动为输出设置 bitrate, codecs, buffer sizes 等参数vcodec=flv # 视频编解码器, 必填唯一
b:v=300k # 视频比特率
g=160 # 图片组大小
mbd=2 # macroblock决策算法
flags=+aic+mv0+mv4 # aic - h263高级内部编码;总是尝试使用mv=<0,0>;mv4 -使用macroblock的4运动矢量
trellis=1 # rate失真优化量化
ac=1 # 声道数
ar=22050 # 音频采样率
b:a=56k # 音频比特率
功能 | NTSC | PAL, SECAM |
---|---|---|
扫描的行数 | 525 | 625 |
可见扫描行 | 483 | 576 |
每秒帧数 | 30 | 25 |
每秒场数 | 60 | 50 |
concat=a=a_streams:v=v_streams:n=segments[:unsafe]
delogo=x=0:y=0:w=width:h=height[:t=band:show={0,1}]
deshake=x:y:w:h:rx:ry:edge:blocksize:contrast:search:filename
select=expression
setdar[=r=aspect_ratio[:max=number]]
; setdar[=aspect_ratio[:number]]
-f fmt (input/output) :指定输入或者输出文件格式。常规可省略而使用依据扩展名的自动指定
-c:指定编码器
-c copy:直接复制,不经过重新编码(这样比较快)
-c:v:指定视频编码器
-c:a:指定音频编码器
-i:指定输入文件
-an:去除音频流
-vn: 去除视频流
-preset:指定输出的视频质量,会影响文件的生成速度,有以下几个可用的值 ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow。
-y:不经过确认,输出时直接覆盖同名文件。
-c[:stream_specifier] codec (input/output,per-stream)
-codec[:stream_specifier] codec (input/output,per-stream)
为特定的文件选择编/解码模式,对于输出文件就是编码器,对于输入或者某个流就是解码器。选项参数(后面的那个)中codec是编解码器的名字,或者是copy(仅对输出文件)则意味着流数据直接复制而不再编码
// 在输出文件中第2视频流按libx264编码,第138音频流按libvorbis编码,其余都直接复制输出
ffmpeg -i INPUT -map 0 -c copy -c:v:1 libx264 -c:a:137 libvorbis OUTPUT
-t duration (input/output):限制输入/输出的时间。如果是在-i前面,就是限定从输入中读取多少时间的数据;如果是用于限定输出文件,则表示写入多少时间数据后就停止
-ss position (input/output): 当在-i前时,表示定位输入文件到position指定的位置。注意可能一些格式是不支持精确定位的,所以ffmpeg可能是定位到最接近position(在之前)的可定位点。当用于输出文件时,会解码丢弃position对应时间码前的输入文件数据
-dn (input/output)
As an input option, blocks all data streams of a file from being filtered or being automatically selected or mapped for any output. See -discard option to disable streams individually.
As an output option, disables data recording i.e. automatic selection or mapping of any data stream. For full manual control see the -map option.
-dframes number (output):设定指定number数据帧到输出文件,这是-frames:d的别名。
frames[:stream_specifier] framecount (output,per-stream):在指定计数帧后停止写入数据。
-q[:stream_specifier] q (output,per-stream)
-qscale[:stream_specifier] q (output,per-stream)
使用固定的质量品质(VBR)。用于指定q|qscale编码依赖。如果qscale没有跟stream_specifier则只适用于视频。其中值q取值在0.01-255,越小质量越好
-filter[:stream_specifier] filtergraph (output,per-stream):创建一个由filtergraph指定的滤镜,并应用于指定流。
// 视频(video)选项
-vframes number (output):设置输出文件的帧数,是-frames:v的别名
-r[:stream_specifier] fps (input/output,per-stream):设置帧率(一种Hz值,缩写或者分数值)
-s[:stream_specifier] size (input/output,per-stream):设置帧的尺寸。
-aspect[:stream_specifier] aspect (output,per-stream):指定视频的纵横比(长宽显示比例)
-vn (output):禁止输出视频
-vcodec codec (output):设置视频编码器,这是-codec:v的一个别名
// OPTIONS FOR SETTING QUALITY
-b:v or -b:a to set bitrate // e.g., -b:v 1000K = 1000 kbit/s, -b:v 8M = 8 Mbit/s
-q:v or -q:a to set fixed-quality parameter //e.g., -q:a 2 for native AAC encoder
// Examples of encoder-specific options:
-crf to set Constant Rate Factor for libx264/libx265
-vbr to set constant quality for FDK-AAC encoder
// Different kinds of rate control
CBR/VBR/CQP..... //Rate depends on content characteristics
// 音频选项
-aframes number (output):设置number音频帧输出,是-frames:a的别名
-ar[:stream_specifier] freq (input/output,per-stream):设置音频采样率。默认是输出同于输入。对于输入进行设置,仅仅通道是真实的设备或者raw数据分离出并映射的通道才有效。对于输出则可以强制设置音频量化的采用率。
-aq q (output):设置音频品质(编码指定为VBR),它是-q:a的别名。
-ac[:stream_specifier] channels (input/output,per-stream):设置音频通道数。默认输出会有输入相同的音频通道。对于输入进行设置,仅仅通道是真实的设备或者raw数据分离出并映射的通道才有效。
-an (output):禁止输出音频
-acode codec (input/output):设置音频解码/编码的编/解码器,是-codec:a的别名
// 字幕选项
-scodec codec (input/output):设置字幕解码器,是-codec:s的别名。
// Transcoding from one codec to another (e.g. H.264 using libx264):
ffmpeg -i <input> -c:v libx264 output.mp4
// Transmuxing from one container/format to another – without re-encoding:
ffmpeg -i input.mp4 -c copy output.mkv
// Cut a video from timestamp <start> for <duration>, or until <end>:
ffmpeg -ss 00:01:50 -i <input> -t 10.5 -c copy <output>
ffmpeg -ss 2.5 -i <input> -to 10 -c copy <output>
// 使用 SPEED/QUALITY PRESETS IN X264 预置 preset
ffmpeg -i <input> -c:v libx264 -crf 23 -preset ultrafast -an output.mkv
ffmpeg -i <input> -c:v libx264 -crf 23 -preset medium -an output.mkv
ffmpeg -i <input> -c:v libx264 -crf 23 -preset veryslow -an output.mkv
// map input streams to output, e.g. to add audio to a video:
ffmpeg -i input.mp4 -i input.m4a -c copy -map 0:v:0 -map 1:a:0 output.mp4
// scale - Scale to 320×240:
ffmpeg -i <input> -vf "scale=w=320:h=240" <output>
// padding
ffmpeg -i <input> -vf "pad=1920:1080:(ow-iw)/2:(oh-ih)/2" <output>
// Simple fade-in and fade-out at a specific time for a specific duration.
ffmpeg -i <input> -filter:v "fade=t=in:st=0:d=5,fade=t=out:st=30:d=5" <output>
// Complex system for printing text on video
ffmpeg -i <input> -vf \
drawtext="text='Test Text':x=100:y=50:\
fontsize=24:fontcolor=yellow:box=1:boxcolor=red" \
<output>
// Decode three video/audio streams and append to one another:
ffmpeg -i <input1> -i <input2> -i <input3> -filter_complex \
"[0:0][0:1][1:0][1:1][2:0][2:1]concat=n=3:v=1:a=1[outv][outa]" \
-map "[outv]" -map "[outa]" <output>
// Show a watermark in the top left corner between seconds 1 and 2 only
ffmpeg -i <video> -i <watermark> -filter_complex \
"[0:v][1:v]overlay=10:10:enable='between(t,1,2)'[outv]" \
-map "[outv]" <output>
参考:
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。