ffmpeg logo

最近有一些处理视频的需求,发现 ffmpeg 实在是一款十分强大的开源软件。本文记录一些比较常用的 ffmpeg 使用场景,以及命令参数。

软件的安装方法在此就不详细介绍了,网上类似的教程比比皆是。

格式转换

视频格式转换:

1
$ ffmpeg -i input.avi output.mp4

音频格式转换:

1
$ ffmpeg -i input.mp3 output.ogg

查看所有支持的格式:

1
$ ffmpeg -formats

提取音频或视频

1
2
$ ffmpeg -i input.mp4 -an output.mp4  # 只提取视频
$ ffmpeg -i input.mp4 -vn output.acc  # 只提取音频

-an 表示不提取音频

-vn 表示不提取视频

更改分辨率

1
$ ffmpeg -i input.mp4 -s 1920x1080 -c:a copy output.mp4

-s 1920x1080: 更改为 1920x1080 分辨率 -c:a copy: 使用原视频的编码格式

使用 H.264 编码

详细说明参考链接

1
$ ffmpeg -i input.avi -c:v libx264 -preset slow -crf 22 output.mp4

YouTube 推荐的视频格式

YouTube 官方详细说明参考链接

1
2
3
4
5
6
ffmpeg -i input.avi -c:v libx264 \
    -preset slow -profile:v high \
    -crf 18 -coder 1 -pix_fmt yuv420p \
    -movflags +faststart -g 30 -bf 2 \
    -c:a aac -b:a 384k -profile:a aac_low 
    output.mp4

Container: MP4

Parameter YouTube recommends setting
-movflags faststart moov atom at the front of the file (Fast Start)

Video codec: H.264

Parameter YouTube recommends setting
-profile:v high High Profile
-bf 2 2 consecutive B frames
-g 30 Closed GOP. GOP of half the frame rate.
-coder 1 CABAC
-crf 18 Variable bitrate.
-pix_fmt yuv420p Chroma subsampling: 4:2:0

Audio codec: AAC-LC

Parameter YouTube recommends setting
-c:a aac -profile:a aac_low AAC-LC
-b:a 384k Recommended audio bitrates for uploads: Stereo 384 kbps

图片转换为视频

目录下有 img001.pngimg002.pngimg003.png 等图片,用这个命令可以把图片转换为视频。

1
$ ffmpeg -framerate 24 -i img%03d.png output.mp4

或者用通配符:

1
$ ffmpeg -framerate 24 -pattern_type glob -i '*.png' out.mp4

复杂一点的例子:

1
$ ffmpeg -framerate 1/5 -i img%03d.png -c:v libx264 -r 30 -pix_fmt yuv420p out.mp4

-framerate 1/5: 表示每张图片出现 5 秒( 1/5 的倒数)

-c:v libx264: 使用 H.264 编码

-r 30: 输出视频为 30 fps,ffmpeg 会插入中间选择的帧

后记

刚开始用 ffmpeg 就感受到了它的强大,只用几个命令就基本能完成我目前的需求,视频质量、压缩等等方面的优化目前还没用到,如果以后接触到相关的命令,再回来更新本文。

参考资料

  1. A quick guide to using FFmpeg to create cross-device web videos.
  2. FFmpeg wiki Encode/Slideshow
  3. FFmpeg wiki Encode/H.264
  4. FFmpeg wiki Encode/YouTube
  5. YouTube recommended encoding settings on ffmpeg (+ libx264)