FFmpeg
视频压缩首先想到的自然是FFmpeg,我用的是Ubuntu,很不幸Ubuntu用Libav提到了FFmpeg ,具体为啥有了Libav建议libav官网八卦去,反正就是一些开发人员对项目管理者不满另起 炉灶啥的,这个暂且不提了[fn:6]。
关键是,Libav的资料太少了,去官网看了一下WIKI,直接就没兴趣用了,Google上搜索也 没有太多使用经验,虽然和FFmpeg大致相同,但总觉的别扭。我想把视频转成X264加AAC格 式,采用VBR方式(就是动态码率,更好的压缩比和视频质量),看了一下X264没问题,但 是AAC有好几个实现,其中最好的libfdk_aac不是GPL的license,所以Libav提供的版本不支 持,也就是说我需要自己编译[fn:1]。关键是这玩意编译还依赖很多外部包,人家FFmpeg编 译文档写的很清晰,Libav啥都没有。没办法,直接干掉,换FFmpeg来[fn:2]。
转码压缩
- 发现没啥可写的[fn:3][fn:4][fn:5],别人都写的太清楚了,这里直接上我的命令吧:
ffmpeg -i IMG_2596.MOV -c:v libx264 -crf 28 -c:a libfdk_aac -vbr 4 output.mp4
最后压缩下来,一个7分42秒的视频大概114M左右,之前可是650M,播放了一下,看不出啥 区别,效果不错,就是FFmpeg貌似不是那么高效,CPU都在nice状态,找个时间分析一下。
这里唯一需要解释一下的就是crf参数,该参数取值范围在0~51,值越低质量越高,当然 文件也越大,缺省值是23,一般18~28之间是比较合适的值,太低文件太大,太高图像质 量不高。该值±6对文件大小的影响基本上是一倍关系,+6文件大小缩小一半,-6文件大小 增加一倍[fn:7]。
- 有91M:
ffmpeg -i IMG_2596.MOV -c:v libx264 -crf 28 -preset:v veryfast -c:a libfdk_aac -vbr 4 output.mp4
- 有91M:
ffmpeg -i IMG_2596.MOV -c:v libx264 -crf 28 -preset:v veryfast -c:a libfdk_aac -vbr 4 output.mp4
t.mp4
两者结果对比:
命令一:
Stream mapping:
Stream #0:0 -> #0:0 (h264 -> libx264)
Stream #0:1 -> #0:1 (aac -> libfdk_aac)
Press [q] to stop, [?] for help
frame=11098 fps= 23 q=-1.0 Lsize= 111968kB time=00:07:42.33 bitrate=1983.9kbits/s dup=0 drop=5
video:107236kB audio:4392kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.304443%
[libx264 @ 0x27d10c0] frame I:70 Avg QP:27.89 size: 48280
[libx264 @ 0x27d10c0] frame P:6228 Avg QP:30.50 size: 13988
[libx264 @ 0x27d10c0] frame B:4800 Avg QP:32.41 size: 4024
[libx264 @ 0x27d10c0] consecutive B-frames: 13.5% 86.4% 0.1% 0.0%
[libx264 @ 0x27d10c0] mb I I16..4: 15.7% 59.1% 25.2%
[libx264 @ 0x27d10c0] mb P I16..4: 0.9% 1.8% 0.4% P16..4: 61.4% 9.1% 8.4% 0.0% 0.0% skip:18.1%
[libx264 @ 0x27d10c0] mb B I16..4: 0.0% 0.0% 0.0% B16..8: 48.7% 1.1% 0.1% direct: 1.8% skip:48.2% L0:36.7% L1:62.5% BI: 0.8%
[libx264 @ 0x27d10c0] 8x8 transform intra:59.8% inter:73.3%
[libx264 @ 0x27d10c0] coded y,uvDC,uvAC intra: 58.3% 87.3% 46.3% inter: 15.6% 43.4% 2.3%
[libx264 @ 0x27d10c0] i16 v,h,dc,p: 18% 20% 19% 43%
[libx264 @ 0x27d10c0] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 11% 12% 27% 8% 10% 8% 10% 7% 8%
[libx264 @ 0x27d10c0] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 15% 18% 27% 7% 8% 6% 7% 5% 6%
[libx264 @ 0x27d10c0] i8c dc,h,v,p: 56% 18% 14% 11%
[libx264 @ 0x27d10c0] Weighted P-Frames: Y:0.2% UV:0.1%
[libx264 @ 0x27d10c0] ref P L0: 65.0% 14.6% 13.7% 6.8% 0.0%
[libx264 @ 0x27d10c0] ref B L0: 91.7% 8.3% 0.0%
[libx264 @ 0x27d10c0] ref B L1: 100.0% 0.0%
[libx264 @ 0x27d10c0] kb/s:1899.73
命令二:
Stream mapping:
Stream #0:0 -> #0:0 (h264 -> libx264)
Stream #0:1 -> #0:1 (aac -> libfdk_aac)
Press [q] to stop, [?] for help
frame=11098 fps= 68 q=-1.0 Lsize= 89166kB time=00:07:42.33 bitrate=1579.9kbits/s dup=0 drop=5
video:84434kB audio:4392kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.382292%
[libx264 @ 0x367f940] frame I:69 Avg QP:27.91 size: 44978
[libx264 @ 0x367f940] frame P:6244 Avg QP:30.60 size: 11357
[libx264 @ 0x367f940] frame B:4785 Avg QP:32.14 size: 2600
[libx264 @ 0x367f940] consecutive B-frames: 13.8% 86.1% 0.1% 0.0%
[libx264 @ 0x367f940] mb I I16..4: 45.3% 31.8% 23.0%
[libx264 @ 0x367f940] mb P I16..4: 16.9% 2.9% 0.1% P16..4: 38.6% 11.3% 3.8% 0.0% 0.0% skip:26.3%
[libx264 @ 0x367f940] mb B I16..4: 0.7% 0.1% 0.0% B16..8: 9.9% 1.8% 0.1% direct:17.4% skip:70.0% L0:36.8% L1:53.3% BI: 9.9%
[libx264 @ 0x367f940] 8x8 transform intra:15.2% inter:10.3%
[libx264 @ 0x367f940] coded y,uvDC,uvAC intra: 18.6% 73.0% 27.4% inter: 7.1% 29.0% 0.6%
[libx264 @ 0x367f940] i16 v,h,dc,p: 41% 26% 26% 8%
[libx264 @ 0x367f940] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 10% 15% 47% 4% 5% 4% 5% 4% 5%
[libx264 @ 0x367f940] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 15% 20% 25% 8% 8% 6% 7% 5% 7%
[libx264 @ 0x367f940] i8c dc,h,v,p: 59% 19% 17% 5%
[libx264 @ 0x367f940] Weighted P-Frames: Y:0.2% UV:0.1%
[libx264 @ 0x367f940] kb/s:1495.79
- 批量处理目录下的视频:
for i in $(ls *.MOV); do ffmpeg -i $i -c:v libx264 -crf 28 -preset:v veryfast -c:a libfdk_aac -vbr 4 $i.mp4; done
旋转视频
- 我需要垂直旋转我的视频,命令如下:
- fffmpeg -i IMG_0758.MOV -c:v libx264 -crf 28 -preset:v veryfast -c:a libfdk_aac -vbr 4 -vf “vflip” IMG_0758.MOV.mp4 垂直选择的参数是hflip,其他的90度旋转参考注脚8即可。
c -vbr 4 -vf “vflip” IMG_0758.MOV.mp4 垂直选择的参数是hflip,其他的90度旋转参考注脚8即可。
结尾
总之,FFmpeg是一个非常强大的开源视频处理工具,你能做各种事情(参考ffmpeg-filters 手册),使用它能对你的视频做各种处理,比如去logo,添加字幕,声轨,甚至合并声轨、 裁剪尺寸等,等待你去挖掘了。
最终我成功把我40G的视频压缩到5G,效果明显。
Footnotes
[fn:1] [[http://unix.stackexchange.com/questions/77687/how-do-i-convert-flac-files-to-aac-preferrably-vbr-320k][How do I convert FLAC files to AAC]]
[fn:2] [[https://trac.ffmpeg.org/wiki/UbuntuCompilationGuide][Compile FFmpeg on Ubuntu, Debian, or Mint]]
[fn:3] [[http://slhck.info/video-encoding][Video Encoding]]
[fn:4] [[http://trac.ffmpeg.org/wiki/AACEncodingGuide][FFmpeg and AAC Encoding Guide]]
[fn:5] [[http://trac.ffmpeg.org/wiki/x264EncodingGuide][FFmpeg and x264 Encoding Guide]]
[fn:6] [[http://superuser.com/questions/507386/libav-vs-ffmpeg-better-to-use-libav-avconv-today][libav vs ffmpeg - better to use libav (avconv) today]]
[fn:7] [[http://slhck.info/articles/crf][CRF Guide]]
[fn:8] [[http://stackoverflow.com/questions/3937387/rotating-videos-with-ffmpeg][Rotating videos with FFmpeg]]