Ffmpeg转码入门

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演出,会有种视频软件处理音频不够专业,音频软件又无法处理视频的感觉。那不如分别处理吧:

  1. 分出音频
ffmpeg -i example.mp4 -vn -c:a copy example.m4a

当然如果你的音频处理软件不支持压缩格式,也可以直接获取wave

ffmpeg -i example.mp4 -vn example.wav
  1. 分出视频
ffmpeg -i example.mp4 -c:v copy -an example_mute.mp4
  1. 用其他专门软件分别处理音、视频

  2. 用ffmpeg合并处理后的音频、视频

ffmpeg -i "example_mute".mp4 -i "example.m4a" -c copy "example_joint.mp4"

2. 转码

2-1 编码和封装建议

YouTube视频编码建议

YouTube recommended upload encoding settings - YouTube Help

FFmpeg音频编码建议

Encode/HighQualityAudio – 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 VideoVA 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 脚本

5 个赞

有没有兴趣做一个傻瓜化gui软件,或者bat脚本?
我之前试过结果发现自己实在能力有限搞不定

我也分享个批处理手机视频的bat ,复制下面的保存为bat就行.
::后面的是注释.命令行只有第一行. crf改为23 一般能压到原视频的一半.crf 改为28 能压小到原视频大小的20%. 画质基本看不出变化,主要是压缩比特率.但有时候反倒压高了,原来4000,压了后5000了,我也不知道怎么回事,这情况比较少见.
使用方法: 把bat和要压缩的视频都放到一个文件夹里,然后运行即可.文件名的问题可以看注释再自己修改. 在命令行中 ctrl+c 是立即停止批处理. 按p键好像是暂停,不记得了

for %%a in ("*.*") do ffmpeg -i "%%a" -crf 23 -map_metadata 0 "%%~na【压码】.mp4"

::%~dpn1 将 %1 扩展到一个驱动器号、路径和文件名
::-c:a copy又是什么意思呢?因为音频的码率一般都比较小,我们就不折腾它了,况且解码后重新编码也会损害音质,于是,就将音频数据从源文件中以原有编码格式直接拷入目标文件吧
::-map_metadata 0 是复制元数据. 在需要压比特率的文件夹里运行.按需修改
::在需要压比特率的文件夹里运行,注意,要先新建一个 newfiles文件夹.output视频是在newfiles文件夹里,文件名和源文件同名
::[for %%a in (“*.mp4”) do ffmpeg -i “%%a” -crf 23 -map_metadata 0 “newfiles%%~na.mp4”]

::有的视频,如一些视频学习教程通常画面都是不大变化的,和变动速度快的打斗视频所需要的帧数完全不同,音质也不需要很高。可以降低fps和音频码率的方法大大压缩文件大小,而清晰度不变.通常转成.mp4,采用H.264视频压缩算法和AAC音频压缩算法,视频帧率10fps,音频码率32k
::ffmpeg.exe -i “C:\test.mp4” -r 10 -b:a 32k “C:\test_mod.mp4”

1 个赞

翻出了以前写的合并多个文件到一个mp4文件的脚本,保存为bat和ffmpeg放置到同文件夹,直接拖多个文件到bat上,自动合并并输出到输入文件夹。
距离完美还有距离,原先还有这些设想:
输入音频文件和图片,合成带图的视频;
输入多个音频文件,合成一个音频并生成lrc文件,lrc文件根据合并的时长显示当前的音频文件的名字
输入一个视频文件,提示需要转换格式还是提取音频还是提取视频

    @echo off
 
set program=%~dp0ffmpeg
set outformat=.mp4
set outfile=%~1_all%outformat%

set allparam=concat:
 

:param
set str=%1
if "%str%"=="" (

    goto end
)
set allparam=%allparam%%str%char_spacer

shift /0
goto param




:end
echo end
 
set allparam=%allparam:char_spacer=^|%


if "%allparam%"=="concat:" (
 goto ex
)

rem remove left right blank

rem :intercept_left
rem if "%allparam:~0,1%"==" " set "allparam=%allparam:~1%"&goto intercept_left
 
:intercept_right
if "%allparam:~-1%"==" " set "allparam=%allparam:~0,-1%"&goto intercept_right

if "%allparam:~-1%"=="|" set "allparam=%allparam:~0,-1%"&goto intercept_right

if "%allparam:~-1%"=="concat:"  goto ex


:eof
echo ------------
 %program%  -i "%allparam%"  -c copy  "%outfile%"
pause
exit

:ex
echo input 0 file
pause

补充一个旋转视频的命令

顺时针旋转90度:ffmpeg -i old.mp4 -vf transpose=1 new.mp4
逆时针旋转90度:ffmpeg -i old.mp4 -vf transpose=2 new.mp4
旋转180度:ffmpeg -i old.mp4  -vf "transpose=2,transpose=2" new.mp4

其中transpose取值:

  • 0 = 90CounterCLockwise and Vertical Flip (default)
  • 1 = 90Clockwise
  • 2 = 90CounterClockwise
  • 3 = 90Clockwise and Vertical Flip

这个GUI还可以,满足一般需求

1 个赞

这里也分享一个 bat,内含封装音、视频流的命令,适合处理某些通过 DASH 分割的音视频

请教一下,怎么在尽量不改变原视频的质量的前提下,批量转换不同格式的视频为hevc或者av1呢?

我以前倒是分享过一些Windows脚本的

不过能力有限,我的脚本基本上就是帮你省了复制粘贴的一步,用之前还是免不了根据自己情况修改……

经常需要批量压缩,自己做了一个:
视频批量压缩工具
上面链接失效,改用:
http://119.91.147.129/software.html?app=videoconv

我还有设想:拖进去wav音频、lrc文本、otf字体,直接生成带滚动歌词的视频 :joy:

感觉我的帖子钓出了神人 :joy: