FFmpeg 是一个开源的命令行音视频编解码工具,支持Linux、Windows、macOS三大桌面平台。
楼主会在这个帖子会分享一些简单的ffmpeg命令示例。
当然这些命令其实你去查官方文档和Wiki都能找到。本帖面向的阅读对象主要是已经对封装、编码、码率等概念有基本了解,但记不住语法和命令的ffmpeg小白,例如,楼主就是这种每次用ffmpeg都要去搜命令的小白。
1. 不转码直接封装音、视频流
ffmpeg不转码的命令是-c copy
。在不需要重新编码时省略掉编码过程,将避免多次有损压缩所带来的画质、音质劣化,并节省可能超过99%的运算资源,封装速度的瓶颈可能已经不在CPU,而是受机械硬盘、低端SSD的读写速度所限制
示例一:把优酷PC客户端下载的视频从自有kux封装转封成通用mp4(只对非DRM保护的视频有效)
ffmpeg -i example.kux -c:v copy -c:a copy example.mp4
示例二:直接分离音、视频
有时录制livehouse演出,会有种视频软件处理音频不够专业,音频软件又无法处理视频的感觉。那不如分别处理吧:
- 分出音频
ffmpeg -i example.mp4 -vn -c:a copy example.m4a
当然如果你的音频处理软件不支持压缩格式,也可以直接获取wave
ffmpeg -i example.mp4 -vn example.wav
- 分出视频
ffmpeg -i example.mp4 -c:v copy -an example_mute.mp4
-
用其他专门软件分别处理音、视频
-
用ffmpeg合并处理后的音频、视频
ffmpeg -i "example_mute".mp4 -i "example.m4a" -c copy "example_joint.mp4"
2. 转码
2-1 编码和封装建议
YouTube视频编码建议
FFmpeg音频编码建议
我的建议
视频
如果是归档留待日后回忆的视频,推荐选用画质/体积比更加优秀的H.265(HEVC)、VP9、AV1等高效编码:HEVC在2015年之后的设备就能得到很普遍的硬解支持,VP9可以在大约2017年之后的硬件上硬解(不过目前只有Intel、高通、三星、MTK的芯片支持VP9的硬件加速编码),而AV1的硬解支持则是将来时了;
若是侧重分享,1080P以下的分辨率推荐选择当下仍然是绝对主流的H.264,4K则可以选择正变得越来越主流的HEVC。也许再过2~3年,随着老硬件的逐渐淘汰,所有分辨率的在线视频的绝对主流编码都会是HEVC了。
音频
立体声音频的有损压缩推荐AAC-LC、MP3(MP3其实已经很落后了),无损压缩推荐FLAC、ALAC。
环绕声音频的有损格式主要是AC-3和DTS,以及它们的无损版本Dolby TrueHD和DTS-HD。
封装
2020年主流的视频封装有MP4(H.264、HEVC、VP8、VP9)、MKV(H.264、VP8、VP9)、QuickTime(H.264、HEVC),这三个封装对于上面提到的音频编码都能很好地支持(但MP4不支持FLAC,QuickTime不支持FLAC、DTS和Dolby TrueHD)。行将就木或者已经入土的MPG、RMVB等封装就别再使用了……
纯音频方面,MP3和FLAC都有各自的纯音频封装格式;未压缩PCM音频通常使用WAV、AIFF封装。AAC和ALAC通常用MP4封装,按理来说应该沿用MP4的扩展名,不过习惯上一般改写成M4A,这样就不会被视频播放器打开了。
iTunes的有声书文件m4b
,铃声文件m4r
本质上也都是AAC,与音乐文件m4a
仅仅是扩展名不同,如果有相应的用途,可以在直接修改转码命令中的扩展名,也可以转码完成后、导入iTunes前批量更改扩展名
2-2 视频编码参数
由于每种视频文件扩展名都可以封装非常多种类的编码,有些编码还可能有多个编码器,一般转换视频时,我们要用-c:v
来指定我们想用的编码器。其他重要参数:
分辨率-vf scale=
。语法是长:宽
,例如1920:1080
,如果要指定一条边为1080个像素,另一个边自适应,则填-1:1080
码率-b:v
,H.264编码的码率设置可以参考YouTube的建议。一些codec还支持-crf
码率(类似音频VBR),具体取值范围要去相应encoder的wiki查看
帧率-r
。-r
放在-i
之后是指定输出视频的帧率,-r
放在-i
之前则是忽略视频的实际帧率,而用我们设定的帧率来解码。
示例:4K 60FPS原片缩到1080P 30FPS
ffmpeg -i "DSC_xxxx.mov" -c:v libx264 -b:v 10M -vf scale=1920:1080 -r 30 "DSC_xxxx".mp4
2-3 GPU硬件加速
ffmpeg中支持硬件加速的编码器的详细整理如下:
示例:Intel核显加速转码
ffmpeg有两个支持Intel核显的硬件加速插件,分别是Quick Sync Video和VA API,Windows平台可以使用QSV。
楼主用ffmpeg转码的用途主要是压缩相机拍摄的视频。我们仅仅用ffmpeg压缩一下视频流的码率,音频流我们不动它。
ffmpeg -hwaccel qsv -i "DSC_xxxx.mov" -c:v hevc_qsv -b:v 10M -c:a copy "DSC_xxxx".mp4
启用硬件加速前,CPU占用到80%,编码速度在1x~1.5x的范围内波动,开启硬件加速后,CPU和GPU的占用都保持在50%附近,编码速度则达到了4~5x,可以说是非常地高效节能了
2-4 纯音频编码参数
音频文件的编码-封装对应没有视频那种混乱的多对多关系,也不需要GPU来硬件加速,基本上你指定一个扩展名,ffmpeg就知道要用什么编码了,所以音频转码的-codec
一般可以不填。
对于音频转码,有三个比较重要的参数,分别是量化位深-sample_fmt
、采样率-ar
、CBR码率-b:a
,均可以缺省。此外还有一个VBR的参数-q:a
,取值范围随具体编码器而不同,想用的去翻相应encoder的Wiki页面吧
下面示例这三个参数的使用
FLAC to WAV
ffmpeg -i example.flac example.wav
楼主之前是半个烧友,有时会用到一些奇奇怪怪的播放器,像什么只支持16bit 44.1kHz WAV的播放器啦……手动给ffmpeg指定采样深度和采样率也是可以的:
ffmpeg -i example.flac -sample_fmt s16 -ar 44100 example.wav
WAV to AAC
ffmpeg -i example.wav -b:a 256k example.m4a
如果你用windows
这里有ffmpeg的安装和环境变量配置方法
https://blog.csdn.net/Chanssl/article/details/83050959
这里还有一些楼主分享的 BAT 脚本