简单聊一聊FFmpeg的使用;

其有非常强大的功能:包括但不限于 视频采集功能、视频格式转换、视频抓图、给视频加水印等。

以下来源于百度百科:FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec,为了保证高可移植性和编解码质量,libavcodec里很多code都是从头开发的。


简单介绍一下使用方法:

应用场景1:格式转换

我想把用iPhone拍的.MOV文件转成.avi文件。最简单了,可以执行下面的命令:

1
ffmpeg -i D:\Media\IMG_0873.MOV D:\Media\output.avi  

【意思是,把D:\Media目录下的源文件IMG_0873.MOV(视频:h.264,音频:aac)转换成output.avi(编码格式自动选择为:视频mpeg4,音频mp3),目标文件仍然保存到D:\Media目录下。】

问题来了:我想自己指定编码格式,怎么办呢?可通过目标文件的扩展名(.flv、.mpg、.mp4、.wmv等)来控制,比如:

1
ffmpeg -i D:\Media\IMG_0873.MOV D:\Media\output2.flv

应用场景2:调整大小

若源文件的图像帧尺寸是1920x 1080,我不需要这么大——能有720 x 480就够了。于是,就要用上-s参数了。为了保证图像缩放后的质量,最好加上码流参数-b:v。如下:

1
ffmpeg -i D:\Media\IMG_0873.MOV -s 720x480 -b:v 1500k D:\Media\output2.avi

应用场景3:翻转视频

手机拍的视频中,有些是颠倒的,我想让它顺时针旋转90度。这时候,可以使用-vf参数加入一个过滤器,如下:

1
ffmpeg -i D:\Media\IMG_0873.MOV -vf "rotate=90*PI/180" D:\Media\output3.avi

注:如果想逆时针旋转90度,90前面加个负号就可以了。

应用场景4:截取一段

需要从源视频里截取一小段,怎么办呢?比如从第2秒的地方开始,往后截取10秒钟。命令行可以这样:

1
2
3
ffmpeg -ss 2 -t 10 -i D:\Media\IMG_0873.MOV D:\Media\output4.avi

ffmpeg -i ./input.mp4 -c:v libx264 -crf 18 -ss 00:00:10 -to 00:00:15 ./cut_out.mp4

注:这种情况下,-ss和-t参数必须放在-i前面,表示是限定后面跟着的输入文件的。

应用场景5:视频合成

用手机拍的视频有时候背景噪音比较大。怎么把噪音去掉,换成一段美妙的音乐呢?使用FFmpeg也能轻易做到。

第一步:把源文件里的音频去掉,生成一个临时文件tmp.mov

1
ffmpeg -i D:\Media\IMG_0873.MOV -vcodec copy -an D:\Media\tmp.mov

注:-vcodec copy的意思是对源视频不解码,直接拷贝到目标文件;-an的意思是将源文件里的音频丢弃。

第二步:把这个无声的视频文件(tmp.mov)与一个音乐文件(music.mp3)合成,最终生成output.mov

1
2
3
ffmpeg -i D:\Media\tmp.mov -ss 30 -t 52 -i D:\Media\music.mp3 -vcodec copy D:\Media\output5.avi

ffmpeg.exe -i G:\test\removebgm.mp4 -ss 00:00:00.0 -t 00:03:31 -i G:\test\456.mp3 -acodec copy G:\test\hfdk.mp4

为了保证良好的合成效果,音乐时长必须匹配视频时长。这里我们事先知道视频时长为52秒,于是截取music.mp3文件的第30秒往后的52秒与视频合成。另外,为了保证音频时长截取的准确性,我们这里没有使用-acodec copy,而是让音频重新转码。

还有一种情况:我们希望在一段视频上叠加一张图片(将视频画面全部显示该图片)。可以简单实现如下:

1
ffmpeg -i D:\Media\IMG_0873.MOV -i D:\Media\logo.png -filter_complex   'overlay' D:\Media\output6.avi

应用场景6:视频播放

格式转换或合成之后,我们需要试着播放一下。播放器的选择很多。这里顺手用ffplay工具也行:

1
ffplay -i D:\Media\output6.avi

应用场景7:获取视频信息

有时候,我只是想看看这个视频文件的格式信息。可以用ffprobe工具:

1
ffprobe -i D:\Media\IMG_0873.MOV

应用场景8:截取视频前3秒 并转化为gif

1
ffmpeg -ss 00:00:01 -t 3 -i 123.mp4 -vf crop=iw:ih*2/3 -s 320x240 -r 7 456.gif

ps: -ss 00:00:01表示从视频第一秒开始截取 ; - t 表示截图3秒钟的视频 ; -vf crop=iw:ih*2/3 表示截取视频的部分区域,其中宽为视频宽度,高为原视频的2/3 ; -r 7 表示每秒帧率为7帧 ;

应用场景9:把AVI里的音频保存成mp3文件

1
ffmpeg -i source_video.avi -vn -ar 44100 -acodec libmp3lame -ac 2 -ab 192K -f mp3 sound.mp3

应用场景10:分离视频音频流

1
ffmpeg.exe -i G:\test\123.mp4 -f mp3 -vn G:\test\fgsiug.mp3

应用场景11:截取音频

1
2
ffmpeg -i demo.mp3 -ss 00:26 -to 01:16:43 -c copy demo1.mp3
//从26秒截取到一小时16分43秒,并导出

应用场景12:拼接视频

1
2
3
4
5
ffmpeg -f concat -i filelist.txt -c copy output.mp4
//需要在目录下创建一个filelist.txt文件,内容如下:
file '1.mp4'
file '2.mp4'
file '3.mp4'

应用场景13:添加封面

1
ffmpeg -i output.mp4 -i cover.jpg -map 1 -map 0 -c copy -disposition:0 attached_pic -y output_1.mp4

ps:以上来源于互联网以及FFmpeg官方文档


最后

附上FFmpeg官网链接:FFmpeg/FFmpeg: Mirror of https://git.ffmpeg.org/ffmpeg.git (github.com)