FFmpeg 视频处理相关合集

七月 01, 2024 [桌面与效率] #obsidian #合集 #音视频

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”来进行上述操作,这样的话不用知道编码器名也可以。如下图:

📄 [图片文字版] cmd 执行 ffmpeg -i 1.mp4 -c:v h264 -c:a mp3 1.avi:输入为 B 站下载视频(Bilibili XCode Worker 封装),视频 h264 1920x1080、703kb/s、25fps,音频 aac 44100Hz、127kb/s;流映射 h264→libx264(High 4.0)、aac→mp3(libmp3lame),输出 3 分钟共 11523kB、码率 524kbits/s,speed=2.68x。

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

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

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

📄 [图片文字版] cmd 执行 ffmpeg -i 1.avi -f webm 1.webm:输入 h264 1920x1080、383kb/s,mp3 44100Hz、128kb/s;流映射 vp9(libvpx-vp9)与 opus(libopus),未指定码率时 vp9 默认 CRF=32;输出 3 分钟共 7460kB、码率 339.3kbits/s,speed=0.312x。

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

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

转码思路流程

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

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

📄 [图片文字版] cmd 执行 ffprobe 1.flv 查看 B 站下载的 FLV:时长 00:03:00.18、总码率 290 kb/s;流 #0:0 为 h264 High 1920x1080、153kb/s、25.03fps,流 #0:1 为 aac LC 44100Hz 立体声 128kb/s;元数据 datasize 6531983、videosize 2512679、audiosize 2970280、lasttimestamp 180。

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

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

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

③用“ffmpeg -formats”命令行

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

📄 [图片文字版] ffmpeg -formats 查看支持的封装格式:D 表示可解封装(Demuxing)、E 表示可封装(Muxing),每行为标志、短名与说明,如 3dostr(3DO STR)、3g2(3GP2)、3gp(3GP)等,截图仅展示列表开头几行。

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

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

转码也可以看作是封装

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

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

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

📄 [图片文字版] ffmpeg -codecs 查看编解码器列表:标志含义 D=解码、E=编码、V=视频、A=音频、S=字幕、I=帧内、L=有损、S=无损;列表含 012v、8bps、aasc、apng 等,其中 av1 一行标注 decoders: libdav1d libaom-av1、encoders: libaom-av1(红下划线强调)。

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

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

ffmpeg:文件格式、封装格式、编码_ffmpeg 支持rmvb格式

文件格式

我们经常看见的视频都是以.mp4 .flv等作为后缀名,这是视频的文件格式。 文件格式的作用是方便系统识别,并关联这些文件,好让相应的文件由相应的程序打开。 这些后缀名可以随便改,不会对文件有任何影响,如果打开出错的话再改回来就行。

封装格式

这些视频的后缀其实也叫视频的封装格式,简称视频格式。 封装: 后缀名(封装格式/文件格式)。所谓封装就是把编码器生成的多媒体文件,如视频,音频,字幕按照一定的标准混合封装在一起。 容器: 为多媒体内容提供索引。如果没有容器的话一个视频你只能从头看到尾,没有声音。容器标准由不同的公司制定,有些是兼容的,有些是要改变媒体的编码格式才能转换,一般情况下我们都是选择效率高,兼容性好的容器标准。下面是一些常见的容器标准。

📄 [图片文字版] 表格「常用视频格式及对应的文件格式」:AVI→AVI;WMV→WMV;MPEG(分 MPEG-1/2/4)→MPG、MPEG、VOB、DAT、3GP、MP4;Matroska→MKV;Real Video→RM、RMVB;QuickTime File Format→MOV;Flash Video→FLV。 RMVB:太封闭了,只能用来封装Real video格式的视频 MKV:最开放,几乎支持所有的音视频,但是体积太大了 AVI:有点老旧,已经不太适应最近的媒体文件了 现在比较流行的就是MP4和MOV MOV:是苹果公司制定的,支持透明的视频 MP4:是当前最主流的视频格式,各种软硬件也都支持的

一般我们都是把其他格式的视频文件转换成mp4的视频文件

ffmpeg -i input.mov outout.mp4

【 -i】 i是input的缩写,这个指令是指定输入文件的 这句指令就是指:用ffmpeg把input.mov转换成output.mp4

编码

编码:其实就是压缩,就类似于zip/rar。是为了缩小文件体积的,便于传输和存储。 ffmpeg支持很多的编码格式。如果要查看的话就在命令行输入:ffmpeg -codecs(查看编解码器)

常见的几种编码: mp4封装:H264视频编码+AAC音频编码 WebM封装:VP8视频编码+Vorbis音频编码(谷歌的编码) OGG封装:Theora视频编码+Vorbis音频编码(开元的)

【FFmpeg】FFmpeg 相关术语简介 ( 容器 | 媒体流 | 数据帧 | 数据包 | 编解码器 | 复用

一、FFmpeg 简介

FFmpeg 是 " Fast Forward mpeg " 的缩写 , 其符合 mpeg 视频编码标准 ;

FFmpeg 功能很强大 , 可以对音视频进行 格式转换 , 内容修改 , 等几乎所有涉及音视频的操作 ;

爱奇艺 , 优酷 , YouTube 等公司的音视频产品 , 几乎都是基于 FFmpeg 进行的二次开发 ;

二、FFmpeg 相关术语

1、容器

容器 Container : 容器的本质就是文件 , 是特定的视频文件 , 如 mp4 , mkv , flv 等格式的音视频文件 ;

容器的作用 : 容器中可以存放 音频 , 视频 , 字幕流 等信息 , 将这些信息整合在一起 , 按照特定规则放置在容器文件中 ,

使用 MediaInfo 打开一个 mp4 格式的视频文件 , 在 " 容器格式和一般信息 " 一栏中 , 可以看到该 mp4 容器文件中包含了 1 1 1 个 AVC 视频流 , 1 1 1 个 AAC LC 音频流 ;

【FFmpeg】FFmpeg 相关术语简介 ( 容器 | 媒体流 | 数据帧 | 数据包 | 编解码器 | 复用 | 解复用 )_数据帧

MediaInfo 工具在 http://mediaarea.net/en/MediaInfo 地址下载 , 或本博客的博客资源中下载 ;

2、媒体流

媒体流 ( Stream ) : 时间上的一段连续数据 , 一段声音数据 称为 音频流 , 一段视频数据 称为 视频流 , 一段字幕数据 称为 字幕流 ;

这些媒体流数据 可以压缩 , 也可以不压缩 , 如视频流以 H.264 格式进行压缩 , 将视频帧编码成 关键帧 , 非关键帧 , 音频流一般是 AAC 编码格式进行压缩 ;

媒体流如果是压缩的 , 在播放时 , 先使用解码器解码 , 然后再播放 ; 生成文件时需要使用编码器 , 编码后存储到文件中 ;

3、数据帧

数据帧 ( Data Frame ) : 媒体流 由 若干 数据帧构成 ; 压缩格式中 , 数据帧是最小的处理单元 ;

在容器中如果有多个数据流 , 那么 视频帧 , 音频帧 , 字幕信息 , 交错存储 , 以保证实时性 ;

数据帧是未压缩的原始数据 , 如 : 视频帧每一帧都是一张完整的 YUV 图片 , 音频帧是 PCM 格式的 ;

4、数据包

数据包 ( Data Packet ) : 将 数据帧 压缩后就是 数据包 , 数据帧是未压缩的原始数据 , 数据包时压缩后的数据 ;

生成容器文件时 , 压缩数据 , 将数据帧 编码压缩 成 数据包 ;

播放容器文件时 , 解压数据 , 将数据包 解码展开 成 数据帧 ;

视频编码过程 : YUV 格式的图像 -> H.264 编码器编码 -> H.264 视频帧

视频解码过程 : H.264 视频帧 -> H.264 解码器解码 -> YUV 格式的图像

音频数据编码过程 : PCM 音频数据 -> ACC 编码器编码 -> AAC 音频帧

音频数据解码过程 : AAC 音频帧 -> AAC 解码器解码 -> PCM 音频数据

5、编解码器

编解码器 ( Codec ) : 数据帧 ( 原始数据 ) 与 数据包 ( 压缩数据 ) 之间的转换工具 ;

数据帧 ( 原始数据 ) -> 编解码器 ( 编码 ) -> 数据包 ( 压缩数据 )

数据包 ( 压缩数据 ) -> 编解码器 ( 解码 ) -> 数据帧 ( 原始数据 )

6、复用

复用 ( Mux ) : 将不同的 媒体流流 , 按照一定规则放入容器 ;

音频流 , 视频流 , 字幕流 ,

按照一定规则

封装到 容器 ( 视频文件 ) 中 ;

复用的关键工具时 复用器 ( Muxer ) ;

7、解复用

解复用 ( Demux ) : 从容器中解析不同的流出来 ;

从 容器 ( 视频文件 ) 中 ,

按照一定规则

拆分出 音频流 , 视频流 , 字幕流 ,

解复用的关键工具时 解复用器 ( Demuxer ) ;