(二)如何理解ffmpeg的命令行,-i与-c参数介绍,高效转码的一些实用知识
往期回顾,第一期启蒙篇:(有不懂的都可以在动态评论问我,私信up不容易看见)

按上期的命令行转码成功的小伙伴可能会觉得很惊讶,为什么这么快就能转码完?而且质量也非常好,似乎没有任何损失。上次我也说了其实一些转码软件都可以做到这样的,所以这一期up会通俗地来解释说明。
但在这之前,up先说明一下上次用到的ffmpeg的两个参数,以及ffmpeg命令行的基本逻辑。
就是说,“ffmpeg -i”和“-c copy”这两个东东是啥意思?ffmpeg的命令行怎么写?一条命令行怎么去理解它整个或者每一部分是什么意思?
一、-i与-c参数的介绍、如何理解命令行
-i
这里先说一点可能一开始会误解的地方,是“-i”,而不是“ffmpeg -i”。虽然一般来说“ffmpeg”是绝大部分时候ffmpeg命令行的开头,命令行也经常以“ffmpeg -i”的样子开头,但它不是后面一定要接上“-i”的(这个例子以后再说)。
“-i”,简单理解就是“input,输入”的意思,我要输入什么文件给ffmpeg,从而让ffmpeg有个准备去做什么。比如说“ffmpeg -i .\input1.mp4”、“-i .\刚下载的音乐.mp3”、“-i .\做视频的素材要转码.mkv”……视频、音频、甚至jpg、gif等格式的图像都可以这么输入进ffmpeg处理。
有输入了,那输出呢?请看下面这个只有输入和输出的命令行:(注意命令行里是有空格的!!)
ffmpeg -i C:\input.mp4 C:\output.mp4
最后的“.\output.mp4”就是输出的文件。注意这个命令行是没有任何我们自己的处理的,这样的话,ffmpeg会以自己的默认方法来重新渲染!(虽说对于观看一般也还行,以后再另说)
所以,一般我们用ffmpeg是以“输入→处理→输出”的流程来理解,来写命令行的。像这样:
ffmpeg -i .\input.mp4 -c copy .\output.mp4
“-c copy”就是指我们给ffmpeg的“处理”这一步。ffmpeg有许许多多用来做“处理”的参数等,以后慢慢道来,敬请关注。
-c
“-c”,是“codec,编解码器”的意思,告诉ffmpeg接下来要用什么编码器、解码器。打个歪比方,做一道菜,写好菜谱给人看就像编码,按菜谱做好菜就像解码。简单来说,对于音视频图像,编码就是,它们要以什么规则呈现,以便我们存储传送等操作;解码就是,它们要按什么规则来解读,以便我们最终播放。平时说的“导出视频”、“渲染视频”通常就是指“编码”这一过程。
之前一直提到的“-c copy”是“-c”参数的一种很经常的用法,顾名思义,复制照抄输入文件原来的编解码器所做的事。那ffmpeg舒服了,不用自己再来做编解码什么的。所以,这就是为什么转码可以这么快的原因。咱能多快好省啊,何必呐。
那就是说,只要在小丸工具箱、格式工厂等其它软件也做到这点就行,照样很快转码。这两个软件的下载安装up不多说了,搜索一下吧。
小丸的转码做法如下:
很多人尤其小白一开始以为是在“视频”那里转码,
那里是一般压制用的(以后也许会再说)
转码是在“封装”这里,如下图

一样地单击按住鼠标,把文件拖进去,或者按“添加”
输出格式有几种常见的主流格式,按需选择
(例如up现在想把mp4转码成flv)
aac编码器建议选libfdk_aac
(选另一个aac也行,只是建议用更先进的而已)
最后点击“封装”,会弹出旁边这个命令提示符窗口,很快转码完了

像这样,转码完的文件默认和待转码文件一个地方
接着是格式工厂的转码做法:
比如现在想把flv转码成mp4,就点击红圈的这个“mp4”,其它类推不多说了

最关键的是,视频和音频这两个编码都要选copy
其它直接默认,根本不要改
点击“确定”,再点“开始”

几乎瞬间就转码完了,质量完全ok的
(如果不是这样的话,把全文看完了再问我吧)
最后说一点,在以前的ffmpeg里,“-c copy”是以“-vcodec copy -acodec copy”这种形式表示的。现在的ffmpeg不存在这个问题了,而且这两种都可以用。
二、如何高效转码:编码格式、容器格式的知识
生活总是有些小插曲,教程也是。up先介绍一个特别实用的命令行:
ffprobe .\input.mp4
用于查看文件的详细信息,比如说一个视频的编码格式。简单理解,“编码器”就是用来做什么的工具,“编码格式”就是约定俗成的什么规则。一个视频,它有画面和声音,我们就是想去知道它的画面是以什么规则呈现的,声音又是以什么另外的规则去呈现。
下面进入正题。(这一节狭窄来说和ffmpeg没啥关系,算是背景知识。如果明白编码格式与容器格式的意思和区别的朋友可以直接一键三连到这已经算看完啦,感谢!)
up这里有一个在b站客户端下载的视频:

可以看到,这个是blv格式的视频,画面的编码格式是h264,声音的编码格式是aac
(还有许多其它的信息,以后会慢慢说明)
现在我们先知道一点:mp4格式的画面、声音编码格式也是h264、aac
那就容易想到,我们可以直接用上一期的转码命令行
把blv转码成mp4,实现这种高效超快的转码

可能有人会想问,最高效的转码难道不是直接改文件名吗?比如我有个视频“input.flv”,直接把它后缀改成“.mp4”不就行了吗,照样能播放啊。
播放是能播放,但是这里不是因为“转码成功了”,而是因为你的播放器是真的强大,它的“菜谱”实在是多,转不转码它都能拿来做好菜,成功播放。例如up在用的potplayer,还有其它像暴风影音、kmplayer、vlc media player等(up没试过这些,就懒得试了明白道理就行)
但有些播放器比如Windows 10自带的“电影与电视”就不能播放flv,直接改后缀没用的。如果就是要播放flv视频,要不就给它外加更多的编解码器“菜谱”,要不就选用其它的播放器。
所以有一个疑问:按之前的道理,那么flv和mp4这两个视频格式,编解码照着copy转码成功了,画面和声音都应该是一样的编码格式吧?欸,确实如此(仅这个例子来说,下期再做说明)。那为什么有的播放器能播放mp4又不能播放flv?
这里就是我们所说的“编码格式”和“容器格式”的概念和区别了。之前说编解码,我们看着菜谱做得一手好菜,那这菜还得拿东西盛着不是?这个用来盛放的东西就是“容器”,而“容器”又有它们各自不同的样子。
因此,“容器格式”简单来说,就是什么样子的“容器”。比如mp4、flv、mkv、avi……它们又叫“封装格式”,这就是我们平常说的“视频格式”、“视频是什么格式”。(其实一开始明白这个的话在小丸那里我们就知道怎么转码了)
可规则是,一样的容器它可以装不同的菜,一样的菜也可以盛在不同的容器里。
所以说,所谓“高效转码”就是利用了编码格式相同而容器格式又不同这一点,转换的只是容器格式。
那有没有什么规则给我们参考,哪些容器格式可以允许我们做“高效转码”?如果不允许,我们又该怎么去转换编码格式呢?且看下期分解。
感谢你观看到这里。