常用的视频压缩编码格式(MPG MP4 AVI)都有商业专利,开源软件如OpenCV一般不提供。开源视频转换工具如VirtualDub等也是调用操作系统事先安装的包。而FFMpeg库是我们可以方便使用的开源编码-解码工具。
windows版本的FFmpeg的可执行程序为ffmpeg.exe ffplay.exe ffprobe.exe三个文件,分别用于编码转换、视频播放、读取视频文件信息,其中ffmpeg.exe是主要程序,大小约35MB,单个文件不依赖其他动态库。
典型指令如下:
使用默认参数对视频进行格式转换
ffmpeg.exe -i inVideo.avi outVide.mp4
截取视频中的一段
ffmpeg -i src.mp4 -ss 00:20:10 -t 00:01:00 -acodec copy -vcodec copy output.mp4
对raw文件进行转换
ffmpeg -i /tmp/test.yuv /tmp/out.avi
设定帧率
ffmpeg -i input.avi -r 30 output.avi
ffmpeg -i input.avi -framerate 30 output.avi
设定比特率
ffmpeg -i input.avi -b:v 64k -bufsize 64k output.avi
转换音频
ffmpeg -i /tmp/a.wav -ar 22050 /tmp/a.mp2
合成音频和视频,并指定大小
ffmpeg -i /tmp/a.wav -s 640x480 -i /tmp/a.yuv /tmp/a.mpg
转换DVD格式并压制,输入VOB文件,输出AVI格式的MPEG-4视频和mp3音频
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
直接从视频设备文件录制视频
ffmpeg -f oss -i /dev/dsp -f video4linux2 -i /dev/video0 /tmp/out.mpg
其中,-f用来指定格式
将视频切分为每一帧保存为图片,自动编号命名,前补0
ffmpeg -i foo.avi -r 1 -s 1280x720 -f image2 foo-%03d.jpeg
将图片合并为视频,图片必须按指定格式编号,注意前导零
ffmpeg -f image2 -framerate 12 -i foo-%03d.jpeg -s 1280x720 foo.avi
合并多段视频
ffmpeg -f concat -i list.txt -c copy output.mp4
其中,list.txt是输入的文件列表,格式如下
# this is a comment
file '/path/Cam01/GOPR0009.MP4'
file '/path/Cam01/GP010009.MP4'
file '/path/Cam01/GP020009.MP4'
还可以对文件名进行匹配
ffmpeg -f image2 -pattern_type glob -framerate 12 -i 'foo-*.jpeg' -s 1280x720 foo.avi
我在视频处理工作中,用到了以下语句合并图像
ffmpeg.exe -y -f image2 -framerate 30 -i out\%06d.png -s 1920x720 out.mpg
其中-y是强制覆盖已存在文件
上面语句生成的mpg文件质量不高,换成MP4格式后略有提高。根本原因是mpg格式的默认比特率太低
可以采用
-qscale:v 2 -maxrate 64000k -bufsize 64000k
或
:-b:v 10000k -bufsize 64000k
-g 指定关键帧间隔
选项提高比特率、降低压缩率。其中qscale后面的数字越小压缩率越低,bufsize和maxrate必须同时指定
若使用mp4扩展名,则默认质量已经很好,但用于较新的yuv格式不被新的播放器支持,需要加入-pix_fmt yuv420p使用老版本,
最终指令为
ffmpeg.exe -y -f image2 -framerate 30 -i DstDir\%06d.png -s 1920x720 -pix_fmt yuv420p -g 60 icon.mp4