本文会介绍一些FFmpeg的常用命令(也包含FFplay,FFprobe)。笔者在一开始接触FFmpeg时也是从网上找一些文章来看,但都是零零散散,也不知为什么是这个命令,最近为了完成一些任务啃了啃FFmpeg的文档,总结了一些常用且实用的命令。
阅读之前
本文介绍的内容不是从零开始的,不会教你去安装,也不会特别难,但是有点长。建议阅读本文之前阅读一下以下2篇文章:
关于音视频的格式
如何查看一个媒体文件的详细信息
ffprobe 是一个用来收集媒体文件信息的工具,可以以指定的格式打印出媒体文件信息。你可以用ffprobe查看视频,音频甚至是一张图片的信息。
ffprobe -loglevel quiet -of json -show_format -show_streams video.webm
ffprobe -v quiet -of json -show_format -show_streams video.webm
ffprobe -v 8 -of json -show_format -show_streams video.webm
# -v = -loglevel 日志的级别,常用的参数就是 -v quiet / -v 8,这样就可以获得一个比较干净的输出。
# -of = -print_format 输出的格式,json应该算是可读性比较高的,也可以选择 xml, csv 等。
# -show_format 打印格式信息
# -show_streams 打印流信息
拓展:如何比较两个文件的差异
这里会用到 vimdiff,如果会用 vim 的同学可以尝试一下。
vimdiff 的基本用法是:
vimdiff file1 file2
所以比较两个媒体文件的差异还是比较简单的:
vimdiff <(ffprobe -v quiet -of json -show_format -show_streams video1.mp4) <(ffprobe -v quiet -of json -show_format -show_streams video2.mp4)
常用的音视频格式
阮一峰老师的文章中讲的不错,不再赘述。
常用的视频分辨率
FFmpeg官网中提供了一组分辨率的值:
也有一些文章中提到另外一组分辨率的值:
其实不必太纠结,一般用视频高度就可以了,本文中后面的处理也是这样做的。
常用的音频采样率
目前比较常用的 44,100 Hz 和 48,000 Hz,即 44.1k 和 48k。
- 22,050 Hz - 无线电广播所用采样率
- 44,100 Hz - 音频CD,也常用于MPEG-1音频(VCD, SVCD, MP3)所用采样率
- 48,000 Hz - miniDV、数字电视、DVD、DAT、电影和专业音频所用的数字声音所用采样率
- 96,000或者192,000 Hz - DVD-Audio、一些LPCM DVD音轨、Blu-ray Disc(蓝光光盘)音轨、和HD-DVD(高清晰度DVD)音轨所用所用采样率
一般转码
终于进入正题,开始划重点:
$ ffmpeg \
[全局参数] \
[输入文件参数] \
-i [输入文件] \
[输出文件参数] \
[输出文件]
这个命令结构是从阮一峰老师那里拿过来的,对于一般的转码这个命令结构已经够用了。实际上,ffmpeg支持多个输入,多个输出(这里有个印象就好)。
格式的变换
ffmpeg -i video.webm video.mp4
ffmpeg -y -v quiet -i video.webm video.mp4
将webm格式的视频转换成mp4。很简单是不是。
# -y 表示输出结果文件存在时直接覆盖,不会询问
# -n 表示输出结果文件存在时终止转换
# -v 前面说过,是日志级别,-v quiet 就是什么也不输出,包括 banner
# -hide_banner 可以不输出 banner
加一些参数,指定音频编码,视频编码
ffmpeg -i video.webm -c:a aac -c:v h264 video.mp4
# -c = -codec 指定编码器
# -c:a 指定音频编码 -c:a aac 指定音频为 aac
# -c:v 指定视频编码 -c:v h264 指定视频为 h264
# -c:a copy 直接复制 音频编码
# -c:v copy 直接复制 视频编码
# -c copy 直接复制音频视频编码
分辨率的变换
指定分辨率
ffmpeg -i video.mp4 -vf scale=1280:720 video_1280_720.mp4
ffmpeg -i video.mp4 -vf scale=852:480 video_852_480.mp4
# -vf = -filter:v 这个参数在后面还要用到很多次
当然还可以只指定宽或者高,而对应的高或者宽自动计算出来
ffmpeg -i video.mp4 -vf scale=-1:720 video_1280_720.mp4
ffmpeg -i video.mp4 -vf scale=1280:-1 video_1280_720.mp4
-1 就表示这个值是缺省值,可以自动计算出来
YUV 编码的坑 -1 与 -2
但是这里有个坑,就是yuv编码中,分辨率必须是偶数。所以当缺省的宽或者高计算出来是一个奇数的话,就会报错。这个时候我们可以使用-2来代替-1,这样计算出来的结果会取偶数,实际上,我更推荐从一开始就用-2。
# 比如原始分辨率是 1920 * 1080
ffmpeg -i video.mp4 -vf scale=-1:480 video_480.mp4
# 使用 -1 计算就会报错,因为算出来的是 853 * 480
ffmpeg -i video.mp4 -vf scale=-2:480 video_480.mp4
# 使用 -2 计算就不会报错,因为算出来的是 852 * 480