那天需要将一段视频文件转成 gif,偶遇 ffmpeg,于是就学习了一下,它真的很强大。在看资料的过程中也是挺有趣的,发现其实 kmplayer 以及国内的 QQ 影音,暴风等等,都不同程度的使用了 ffmpeg,可是根据 ffmpeg 的开源许可 LGPL,任何使用 ffmpeg 的软件都必须开源,于是乎 QQ 影音,暴风都上了 ffmpeg 的耻辱柱,如果没接触到 ffmpeg 还真不知道有这一茬,国内的黑心厂商真是拿开源社区的东西都不遵循开源协议。
下面就直接进正题吧:
几个概念
在进入 ffmpeg 入门之前有一些基本概念需要了解,我在查看 ffmpeg 的时候回头查阅了这些资料,觉得先行了解比较好,这些概念都是视频或者音频中的基本概念。
比特率
比特率,英文为 bit rate,描述每秒钟输出多少 KB 的参数,单位是 Kbps,也就是 kbit/s,8Kbit/s = 1KB/s。也就是说 800Kbps 意思就是每秒视频就要占用 100KB 磁盘空间。对于音频文件也存在比特率,同理。压缩同一个视频,视频比特率越大,文件体积越大。视频比特率越大,画质越好,马赛克越少。
MP3 一般使用的比特率为 8~320kbps。
举一个例子:
bitrate 可以理解为 file size / duration
比如一个视频文件 20.8 M 时长为 1min,那么
bitrate = 20.8M bit/60s = 20.8 * 1024 * 1024 * 8 bit/60s = 2831 Kbps
假设音频的码率为固定 128 Kbps,那么视频的码率就是
2831 Kbps - 128 Kbps = 2703 Kbps
H.264 标准建议
视频大小 | 分辨率 | 建议码率 |
---|---|---|
480P | 720X480 | 1800Kbps |
720P | 1280X720 | 3500Kbps |
1080P | 1920X1080 | 8500Kbps |
可变码率
可变码率叫做 Variable Bitrate (VBR),也叫作动态比特率编码,VBR 指的是编码器的输出码率可以根据编码器输入源信号的复杂度自适应调整,目的是为了达到输出质量保持不变的同时节省存储空间。VBR 适用于存储,不太适用流式传输,可以更有效的地利用有限空间。
固定码率
固定码率叫做 Constant Bitrate (CBR),CBR 指的是编码器输出码率固定,CBR 不适合存储,CBR 对于复杂内容可能没有足够码率进行编码,从而导致质量下降,同时会在简单内容部分浪费一些码率。
帧数
帧数,又被叫做帧率,指的是每秒钟播放的图片数,单位 fps(英文:Frames Per Second),每秒的帧数或者帧率表示视频文件或者图形处理器场景时每秒钟能够更新的次数。
高的帧率可以得到更流畅、更逼真的画面。一般来说 30fps 就是可以接受的,但是将性能提升至 60fps 则可以明显提升交互感和逼真感,但是一般来说超过 75fps 一般就不容易察觉到有明显的流畅度提升了。如果帧率超过屏幕刷新率只会浪费图形处理的能力,因为显示器不能以这么快的速度更新,这样超过刷新率的帧率就浪费掉了。
在同一视频,同一码率的情况下,帧数越大,则画质越不好。尤其是运动的画面。因为每张画面会分担每秒有限的文件体积,如果画面越多,那么每张画面所能表现的内容就越有限。
当画面的 FPS 达到 60 帧 / 秒时,已经能满足绝大部分应用需求。一般情况下,如果能够保证游戏画面的平均 FPS 能够达到 30 帧 / 秒,那么画面已经基本流畅;能够达到 50 帧 / 秒,就基本可以体会到行云流水的感觉了。一般人很难分辨出 60 帧 / 秒与 100 帧 / 秒有什么不同。
分辨率
最好理解的概念了,表示画面的大小,单位是像素 px。
和编码率的关系:越高的分辨率,需要越高的编码率,因为图像的细节多了,需要的文件体积也应该增大,否则还不如画面小一些,你会发现同一码率,画面越大,图像的马赛克程度越明显。
采样率
每秒钟对音频信号的采样次数,采样频率越高声音还原度越高,声音更加自然。单位是赫兹 Hz。音频文件一般使用的采样率是 44100 Hz ,也就是一秒钟采样 44100 次,之所以使用这个数值是因为经过了反复实验,人们发现这个采样精度最合适,低于这个值就会有较明显的损失,而高于这个值人的耳朵已经很难分辨,而且增大了数字音频所占用的空间。我们所使用的 CD 的采样标准就是 44.1k,目前 44.1k 还是一个最通行的标准。
安装
Debian/Ubuntu/Linux Mint 下安装 ffmpeg 很简单:
apt-get install ffmpeg
其他操作系统安装方法,参考官网
如果想要手工编译 ffmpeg 可以参考官方 wiki。 Ubuntu/Debian/Mint 系手工编译 ffmpeg 参考 wiki。
用法举例
显示文件信息
显示视频信息
ffmpeg -i input.avi
将视频拆分图片 批量截图
将视频拆分多张图片,每一帧图片,保存到 frames 文件夹下,命名 frame001.png 这种。可以加上 -r 参数以用来限制每秒的帧数,-r 10
就表示每秒 10 帧。
ffmpeg -i input.mp4 frames/frame%03d.png
图片合成视频
将多张图片合成视频
ffmpeg -i frames/frame%3d.png output.mp4
从视频中提取音频
从视频文件中提取音频并保存为 mp3
ffmpeg -i input.mp4 -f mp3 output.mp3
如果需要可以在中间加上 -ar 44100 -ac 2 -ab 192
系数,表示采样率 44100 ,通道 2 立体声,码率 192 kb/s.
将声音合成到视频
将声音合成到视频中
ffmpeg -i input_music.mp3 -i input_video.mp4 output.mp4
转化格式
格式之间转换 大部分的情况下直接运行一下即可
ffmpeg -i