ffmpeg转码常用容器、编码格式与解编码器的搭配总结,-c与-f参数的运用

转码

现今常用的一些编码格式以及它们所支持的容器格式如下:

特别提一点,mkv是个万能的容器格式,下面说的所有编码格式,mkv几乎都能“装”,就不再列出了。

视频编码格式:

h264(又称mpeg-4 avc、mpeg-4 part 10):mp4、flv、avi、mov、wmv、m4v、f4v、3gp、ts

mpeg4(不只一种,这里指mpeg-4 part 2、divx、xvid):mp4、avi、mov、wmv、m4v、3gp、ts

h265(又称hevc、mpeg-h part 2):mp4、avi、mov、ts

vp8:avi、wmv、ts、webm

vp9:mp4、avi、wmv、ts、webm

音频编码格式:(【】左边是视频容器格式,【】右边是音频容器格式,*和^后面再说明)

aac:mp4、flv、avi、mov、wmv、3gp、m4v、f4v、ts【】aac、m4a、wma、ac3

mp3:mp4、avi、mov、wmv、f4v、ts【】mp3、wma、ac3

ac-3:mp4、avi*、mov、wmv、m4v、ts【】ac3、m4a、wma

flac:mp4*、avi*、wmv、ts【】flac、m4a、wma、ac3^

vorbis:mp4、avi*、mov、wmv、ts、webm【】ogg、wma、ac3^

opus:mp4*、ts、webm【】ogg、ac3^

(*的意思是需要进一步使用相应参数,小白不建议)

(^的意思是能转码成功,但很可能播放器不能播放)

(一般听感来说,上述中opus编码格式是有损编码里最好的,其次是vorbis,之后是aac、mp3之类

(ffmpeg似乎不支持ape容器格式)

对新人来说看到这些庞杂的格式可能很懵,通俗说明一下:“一样容器能装不同菜,一样菜能盛在不同容器”的道理,我们只要找到菜和容器都互相能“接受”的组合就行了。只是视频是一个容器两道菜(画面和声音),音频就一个容器一道菜

反之,上面列的这些,也可以理解为视音频容器格式所支持的编码格式。上期说一个视频有画面和声音,那么画和声就有它俩各自的编码格式,所以对一个现存的视频来说,它的容器格式要同时支持画和声的编码格式;音频就只有声音的编码格式,和它的容器格式互相支持就可以

这里指出两点前提:以原文件的编码为参考,ffmpeg的支持。

虽然有着许多的格式,但目前大多数视频的编码格式是h264和aac,音频的编码格式是mp3或aac。因此,只要不同的容器格式之间能同时支持一样的编码格式,就能够进行“高效转码”。

例如同时支持h264和aac的有mp4、flv、avi、mov、wmv……满足这个前提后,这些容器两两之间都可以任意“高效转码”。可如果像上期说的,只知道容器格式mp4和flv,并不能直接认为它俩可以用“-c copy”“高效转码”。

对于需要转换编码格式的音视频,用ffmpeg的前提是ffmpeg要能支持我们想转的编码格式。ffmpeg就像一个批发中心,但它的货总归还是有限的。

不过对于无需转换编码格式的情况,即便是ffmpeg不支持的编码格式,也能用“-c copy”复制照抄(例如将原视频转码成mkv,可理解为原视频中的编码格式给ffmpeg提供了个“模板”),但是如果ffmpeg不支持最后输出文件的容器格式的话,就不能这样转码。

除了音视频,ffmpeg还可以转码字幕和图像文件:

(直接按“输入→输出”流程即可,例如ffmpeg -i .\input.png output.jpg)

(srt转码ass要注意srt先以记事本打开,另存为将编码改成UTF-8或unicode)

字幕容器格式:srt、ass、ssa之间两两任意互转

图像容器格式:jpg、jpeg、png、bmp、gif、webp之间两两任意互转

-c与-f参数的运用

若要转换编码格式,我们将运用“-c”来使用ffmpeg支持的编解码器。

“-c”参数包括了音视频的全部编解码器,所以以前的“-c copy”是复制音视频编码的意思。当然我们也可以直接用“-c copy”转码音频,没有视频也没关系。

要只对视频里的画面或者声音进行操作的话,我们可以用“-c:v”来限定只处理视频画面,“-c:a”来限定只处理视频里的音频声音,“-c:s”来限定只处理字幕。

经常用的比如“-c:v libx264”,表示将编码格式转换成h264;“-c:a libmp3lame”,表示将编码格式转换成mp3。

这里的“libx264”、“libmp3lame”是编码器的名字(文末再说编码器名怎么得知)。简单形象地说,“容器格式、编码格式、编码器”的一个可行搭配是“avi、(h264、mp3)、(libx264、libmp3lame)”。

我们也可以用“-c:v h264”、“-c:a mp3”来进行上述操作,这样的话不用知道编码器名也可以。如下图:

ffmpeg里的“stream”可以理解为“流”、“轨道”、“通道”。红圈里的是编码格式转换的指示说明,从原来的什么转换成什么。例如上图是,视频编码格式从mpeg4转换成h264,视频里的音频编码格式从aac转换成mp3。

我们还可以通过“-f”参数来进行转码。“-f”,“format,格式”的意思,强制输出什么格式的文件,让ffmpeg自行挑选编解码器进行转码输出。但只是一般情况来说,就像前面说过ffmpeg的支持也是有限的,不支持的话当然也转码输出不了。

这个“-f”可以用来“查询”自己想转的容器格式是有什么编码格式或编码器可以支持。它的用法例如“-f webm”。如下图:

这说明vp9和opus是webm容器格式支持的编码格式。

(在一些时候,用“-f”参数转码完的视频质量会不好,这个以后再说)

转码思路流程

①先用命令行ffprobe .\input.mp4

查看文件的编码格式,如下图:

红圈表示该视频的画面(video)编码格式是h264,声音(audio)编码格式是aac

另外,一般查看文件属性也可以知道其编码格式

②确定自己想转的容器或编码格式

③用“ffmpeg -formats”命令行

查询ffmpeg支持哪些容器格式。如下图

demuxing是“解封装”的意思,muxing是“封装”的意思,

就像容器格式又称封装格式

转码也可以看作是封装

解封装就可以看作是转码的相反操作

还有,用“ffmpeg -codecs”命令行

查询ffmpeg支持哪些编码格式及编解码器名。如下图

decoder指解码器名,encoder指编码器名,以此类推

④输入相应命令行进行转码

猜你喜欢

转载自blog.csdn.net/JineD/article/details/125322808