FFmpeg是一款非常快速的视频和音频转换器, 是开源项目 ffmpeg (Fast Forward moving pictures expert group) 的命令行程序。 它可以在任意采样率之间转换,并通过高质量的多相滤波器实时调整视频大小。

FFppeg 载地址:http://ffmpeg.org/download.html

FFmpeg程序的转码流程,如下所示

使用ffmpeg分析(FFmpeg多媒体处理命令行工具详解)(1)

其中, demuxer 为解复用器, muxer 为复用器; decoder 为解码器, encoder 为编码器

ffmpeg 语法:ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...

ffmpeg参数

1)通用选项:

-L license

-h 帮助

-fromats 显示可用的格式,编解码的,协议的。

-f fmt 强迫采用格式fmt

-I filename 输入文件

-y 覆盖输出文件

-t duration 设置记录时间 hh:mm:ss[.xxx]格式的记录时间也支持

-ss position 搜索到指定的时间 [-]hh:mm:ss[.xxx]的格式也支持

-title string 设置标题

-author string 设置作者

-copyright string 设置版权

-comment string 设置评论

-target type 设置目标文件类型(vcd,svcd,dvd) 所有的格式选项(比特率,编解码以及缓冲区大小)自动设置 ,只需要输入如下的就可以了: ffmpeg -i myfile.avi -target vcd /tmp/vcd.mpg

-hq 激活高质量设置

-itsoffset offset 设置以秒为基准的时间偏移,该选项影响所有后面的输入文件。该偏移被加到输入文件的时戳,定义一个正偏移意味着相应的流被延迟了 offset秒。 [-]hh:mm:ss[.xxx]的格式也支持

2)视频选项:

-b bitrate 设置比特率,缺省200kb/s

-r fps 设置帧频 缺省25

-s size 设置帧大小 格式为WXH 缺省160X128.下面的简写也可以直接使用:Sqcif 128X96 qcif 176X144 cif 252X288 4cif 704X576

-aspect aspect 设置横纵比 4:3 16:9 或 1.3333 1.7777

-croptop size 设置顶部切除带大小 像素单位

-cropbottom size –cropleft size –cropright size

-padtop size 设置顶部补齐的大小 像素单位

-padbottom size –padleft size –padright size –padcolor color 设置补齐条颜色(hex,6个16进制的数,红:绿:兰排列,比如 000000代表黑色)

-vn 不做视频记录

-bt tolerance 设置视频码率容忍度kbit/s

-maxrate bitrate设置最大视频码率容忍度

-minrate bitreate 设置最小视频码率容忍度

-bufsize size 设置码率控制缓冲区大小

-vcodec codec 强制使用codec编解码方式。 如果用copy表示原始编解码数据必须被拷贝。

-sameq 使用同样视频质量作为源(VBR)

-pass n 选择处理遍数(1或者2)。两遍编码非常有用。第一遍生成统计信息,第二遍生成精确的请求的码率

-passlogfile file 选择两遍的纪录文件名为file

3)音频选项:

-ab bitrate 设置音频码率

-ar freq 设置音频采样率

-ac channels 设置通道 缺省为1

-an 不使能音频纪录

-acodec codec 使用codec编解码

4)音频/视频捕获选项

-vd device 设置视频捕获设备。比如/dev/video0

-vc channel 设置视频捕获通道 DV1394专用

-tvstd standard 设置电视标准 NTSC PAL(SECAM)

-dv1394 设置DV1394捕获

-av device 设置音频设备 比如/dev/dsp

5)高级选项

-map file:stream 设置输入流映射

-debug 打印特定调试信息

-benchmark 为基准测试加入时间

-hex 倾倒每一个输入包

-bitexact 仅使用位精确算法 用于编解码测试

-ps size 设置包大小,以bits为单位

-re 以本地帧频读数据,主要用于模拟捕获设备

-loop 循环输入流。只工作于图像流,用于ffserver测试

1、获取音频/视频文件信息

查看视频文件的元信息,比如编码格式和比特率,可以只使用-i参数。

ffmpeg -i input.mp4

上面命令会输出很多冗余信息,加上-hide_banner参数,可以只显示元信息。

ffmpeg -i input.mp4 -hide_banner

2、转换视频文件到不同的格式

ffmpeg -formats #检查FFmpeg支持格式的列表

ffmpeg -i video.mp4 video.avi #转换mp4文件为avi文件

ffmpeg -i video.flv video.mpeg #转换flv格式视频为mpeg 格式

ffmpeg -i input.webm -qscale 0 output.mp4 #使用-qscale 0参数维持源视频文件的质量,

ffmpeg -i [input.file] -c:v libx264 output.mp4 #转成H.264编码

ffmpeg -i [input.file] -c:v libx265 output.mp4 #转成H.265编码

ffmpeg -i test.mp4 -ab 56 -ar 22050 -qmin 2 -qmax 16 -b 320k -r 15 -s 320x240 outputfile.flv #mp4转flv

ffmpeg -i outputfile.flv -copyts -strict -2 test.mp4 #flv转mp4

3、转换视频文件到音频文件

转换一个视频文件到音频文件,只需具体指明输出格式,像 .mp3或 .ogg,或其它任意音频格式。

ffmpeg -i input.mp4 -vn output.mp3 #转换 input.mp4 视频文件到 output.mp3 音频文件

ffmpeg -i input.mp4 -vn -c:a copy output.aac #-c:a copy表示不改变音频编码,直接拷贝

也可以对输出文件使用各种各样的音频转换编码选项:

ffmpeg -i input.mp4 -vn -ar 44100 -ac 2 -ab 320 -f mp3 output.mp3

相关选项:

◈ -vn – 表明我们已经在输出文件中禁用视频录制。

◈ -ar – 设置输出文件的音频频率。通常使用的值是22050 Hz、44100 Hz、48000 Hz。

◈ -ac – 设置音频通道的数目。

◈ -ab – 表明音频比特率。

◈ -f – 输出文件格式。在我们的实例中,它是 mp3 格式。

4、更改视频文件的分辨率

设置视频文件的分辨率到 1280×720

ffmpeg -i input.mp4 -filter:v scale=1280:720 -c:a copy output.mp4或

ffmpeg -i input.mp4 -s 1280x720 -c:a copy output.mp4

转换视频文件到 640×480 大小

ffmpeg -i input.mp4 -filter:v scale=640:480 -c:a copy output.mp4或

ffmpeg -i input.mp4 -s 640x480 -c:a copy output.mp4

该技巧帮助缩放视频文件到较小的显示设备上,如平板电脑和手机。

ffmpeg -i input.mp4 -vf scale=480:-1 output.mp4 #转换文件为480p

5、压缩视频文件

ffmpeg -i input.mp4 -vf scale=1280:-1 -c:v libx264 -preset veryslow -crf 24 output.mp4

减小视频文件的大小,将损失视频质量。如果24值过大,可以降低 -crf 值到或更低值。

也可以通过下面的选项来转换编码音频降低比特率,使其有立体声感,从而减小大小。

-ac 2 -c:a aac -strict -2 -b:a 128k

6、压缩音频文件

假设input.mp3是比特率320kbps的音频文件,可通过更改比特率到任意较低的值来压缩

$ ffmpeg -i input.mp3 -ab 128 output.mp3 #-ab标志压缩音频文件

各种各样可用的音频比特率列表是: 96kbps、112kbps、128kbps、160kbps、192kbps、256kbps、320kbps

7、调整码率

调整码率(transrating)指的是,改变编码的比特率,一般用来将视频文件的体积变小。下面的例子指定码率最小为964K,最大为3856K,缓冲区大小为 2000K。

ffmpeg -i input.mp4 -minrate 964K -maxrate 3856K -bufsize 2000K output.mp4

8、从一个视频文件移除音频流

ffmpeg -i input.mp4 -an output.mp4 #-an表示没有音频录制。

上面的命令会撤销所有音频相关的标志。

9、从一个媒体文件移除视频流

ffmpeg -i input.mp4 -vn output.mp3 #-vn表示没有视频录制

ffmpeg -i input.mp4 -vn -ab 320 output.mp3 #加-ab标志来指出输出文件的比特率

10、从视频中提取图像(截图)

ffmpeg -i input.mp4 -r 1 -f image2 image--.png

其中:

◈ -r – 设置帧速度。即每秒提取帧到图像的数字。默认值是 25。

◈ -f – 表示输出格式,在上例中是图像。

◈ image--.png – 表示如何命名提取的图像。上例命名文件像image-01.png、image-02.png、image-03.png开始递加。如果使用 =,那么图像的命名像 image-001.png、image-002.png递加。

ffmpeg -y -i input.mp4 -ss 00:01:24 -t 00:00:01 #从指定时间开始,连续对1秒钟的视频进行截图

ffmpeg -ss 01:23:45 -i input -vframes 1 -q:v 2 output.jpg #-vframes 1指定只截取一帧,-q:v 2表示输出的图片质量,一般是1到5之间(1 为质量最高)

ffeg -i test.mp4 -y -f mjpeg -ss 3 -t 1 test1.jpg #在第三秒的时候截图

ffmpeg -i test.mp4 -y -f image2 -ss 3 -vframes 1 test1.jpg #在第三秒的时候截图

11、视频内裁剪

ffmpeg -i input.mp4 -filter:v "crop=w:h:x:y" output.mp4

其中:

◈ input.mp4 – 源视频文件。

◈ -filter:v – 表示视频过滤器。

◈ crop – 表示裁剪过滤器。

◈ w – 我们想自源视频中裁剪的矩形的宽度。

◈ h – 矩形的高度。

◈ x – 我们想自源视频中裁剪的矩形的 x 坐标 。

◈ y – 矩形的 y 坐标。

比如需要一个来自视频的位置 (200,150),且具有 640 像素宽度和 480 像素高度的视频

ffmpeg -i input.mp4 -filter:v "crop=640:480:200:150" output.mp4

注意,剪切视频将影响质量。除非必要,请勿剪切。

12、转换一个视频的具体的部分

ffmpeg -i input.mp4 -t 10 output.avi #转换文件开头10秒到视频avi格式

上例以秒具体说明时间。也可用hh.mm.ss 格式具体说明时间。

13、设置视频的屏幕高宽比

$ ffmpeg -i input.mp4 -aspect 16:9 output.mp4 #使用-aspect标志设置一个视频文件的屏幕高宽比

常用高宽比有:16:9、4:3、16:10、5:4、2:21:1、2:35:1、2:39:1

14、添加海报图像到音频文件

添加海报图像到文件,以便图像将在播放音频文件时显示,相当于将音频文件转为带封面的视频文件。

ffmpeg -loop 1 -i inputimage.jpg -i inputaudio.mp3 -c:v libx264 -c:a aac -strict experimental -b:a 192k -shortest output.mp4

ffmpeg -loop 1 -i cover.jpg -i input.mp3 -c:v libx264 -c:a aac -b:a 192k -shortest output.mp4

-loop 1参数表示图片无限循环,-shortest参数表示音频文件结束,输出视频就结束。

15、使用开始和停止时间剪下一段媒体文件

ffmpeg -i input.mp4 -ss 00:00:50 -codec copy -t 50 output.mp4

ffmpeg -ss 00:00:00 -t 00:00:03 -y -i test.mp4 -vcodec copy -acodec copy test1.mp4 #将test.mp4视频的前3秒,重新生成一个新视频

-ss 开始时间,如: 00:00:00,表示从0秒开始,格式也可以00:00:0

-t 时长,如: 00:00:03,表示截取3秒长的视频,格式也可以00:00:3

-y 如果文件已存在强制替换;

-i 输入,后面是空格,紧跟着就是输入视频文件;

-vcodec copy 和 -acodec copy表示所要使用的视频和音频的编码格式,这里指定为copy表示原样拷贝;

也可剪辑音频

ffmpeg -i audio.mp3 -ss 00:01:54 -to 00:06:53 -c copy output.mp3

16、切分视频文件为多个部分

ffmpeg -i input.mp4 -t 00:00:30 -c copy part1.mp4 -ss 00:00:30 -codec copy part2.mp4

其中:

◈ -t 00:00:30 表示从视频的开始到视频的第 30 秒创建一部分视频。

◈ -ss 00:00:30 为视频的下一部分显示开始时间戳。它意味着第2部分将从第30秒开始,并将持续到原始视频文件的结尾。

17、接合或合并多个视频部分到一个单个视频文件

方法一:

创建包含你想接合文件的准确的路径的 join.txt。

所有的文件要求相同的编码格式。所有文件的路径应该逐个列出如下。

file /home/sk/myvideos/part1.mp4

file /home/sk/myvideos/part2.mp4

file /home/sk/myvideos/part3.mp4

file /home/sk/myvideos/part4.mp4

使用命令接合join.txt中列的所有文件:

ffmpeg -f concat -i join.txt -c copy output.mp4

如果出现下面的错误;

[concat @ 0x555fed174cc0] Unsafe file name '/path/to/mp4'

join.txt: Operation not permitted

添加 -safe 0 :

ffmpeg -f concat -safe 0 -i join.txt -c copy output.mp4

上面的命令接合 part1.mp4、part2.mp4、part3.mp4 和 part4.mp4 文件到一个称为output.mp4的单个文件中。

方法二:

ffmpeg -i "concat:1.flv|2.flv|3.flv" -c copy 4.flv

方法三:

ffmpeg -f concat -i <(for i in {1..4}; do printf "file '%s'" input.mp4; done) -c copy output.mp4

18、添加字幕到一个视频文件

为视频下载正确的字幕,并如下所示添加它到视频文件中。

fmpeg -i input.mp4 -i subtitle.srt -map 0 -map 1 -c copy -c:v libx264 -crf 23 -preset veryfast output.mp4

19、 添加音频到一个视频文件(音轨)

添加音轨(muxing):将外部音频加入视频,比如添加背景音乐或旁白。

ffmpeg -i input.aac -i input.mp4 output.mp4

上例中,有音频和视频两个输入文件,ffmpeg 会将它们合成为一个文件。

20、音频合成

ffmpeg -i test.mp3 -i test1.mp3 -filter_complex amix=inputs=2 -f mp3 c.mp3 #合并二个音频

ffmpeg -i test.mp3 -i test1.mp3 -filter_complex amix=inputs=2:duration=first:dropout_transition=2 -f mp3 a.mp3 #合并二个音频,以第一个音频的时长为新音频时长

21、预览或测试视频或音频文件

ffplay video.mp4 #预览视频

ffplay audio.mp3 #测试音频

22、增加/减少视频播放速度

增加视频播放速度,运行:

ffmpeg -i input.mp4 -vf "setpts=0.5*PTS" output.mp4 #该命令将双倍视频的速度。

为降低你的视频速度,需要使用一个大于 1 的倍数。

减少播放速度,运行:

fmpeg -i input.mp4 -vf "setpts=4.0*PTS" output.mp4

23、转换容器格式

转换容器格式(transmuxing)指的是,将视频文件从一种容器转到另一种容器。

下面是 mp4 转 webm 的写法

ffmpeg -i input.mp4 -c copy output.webm

24、获取视频时长

ffmpeg -i test.mp4 2>&1 | grep 'Duration' | cut -d ' ' -f 4 | sed s/,//

25、视频加水印

ffmpeg -y -i test.mp4 -acodec copy -vf "movie=input.jpg [logo]; [in][logo] overlay=10:10:1 [out]" test2.mp4

overlay=10:10:1,后三个数据表示是距离左边的距离,距离上边的距离,是否透明,1表示透明。上例我用的是jpg,当然不可能透明。

ffmpeg -y -i test.mp4 -acodec copy -vf "movie=input.jpg [logo]; [in][logo] overlay=enable='lte(t,1)' [out]" test2.mp4

overlay=enable='lte(t,1)' ,这个参数表示,水印在前一秒显示。

26、生成GIF图片

ffmpeg -i test.asf -vframes 30 -y -f gif output.gif #把视频的前30帧转换成一个Gif

ffmpeg -i test2.mp4 -y -f image2 -ss 08 -t 0.001 -s 352x240 output.jpg #在秒处接取一个352X240的图片

27、下载RTMP流

ffmpeg -i "rtmp://192.168.10.103:1935/live/111 live=1" -acodec copy -vcodec copy -f flv -y test.flv #将rtmp流,以文件的形势保存到本地

,