《ffmpeg basics》中文版 -- 11.格式转换

11.格式转换

​ format:格式

​ ffmpeg工具最常见的用法都和音频和视频的 format 转换有关。format 可以使用 -f 选项来指定,一般位于输出文件之前,但如果使用的是 raw input (原始输入,即未编码的原始图像,如从摄像头获取到的视频数据),那么它也可以放在输入文件之前。我们可以通过命令行来查看可以使用的 format ,详情见《显示帮助和特征(Displaying Help and Features)》。

媒体格式介绍

文件格式

​ 媒体文件格式是指能够存储视频或音频等媒体数据的特殊文件类型。其中一部分仅能存储单个类型的数据,但也有一些格式可以以多个流的方式存储多种数据类型,能存储多种媒体类型数据的文件格式被称作 container(容器)。我们可以使用 ffmpeg -formats 命令来查看可使用的媒体格式。

​ 视频文件格式一般都可以包含音频流和视频流。但也有一些特殊 format ,仅可以包含音频流,它们将在《数字音频(Digital Audio)》一节中描述。

媒体容器

​ 媒体容器是一类特殊的封装文件类型,它的主要特点就是可以存储多个类型的媒体流以及相关的元数据。由于音频和视频可以使用多种方法(算法)来编码和解码,较为复杂,因此容器提供了一种简便的方式,可以在一个文件中存储多个媒体流。有一些容器,如AIFF,WAV,XMF等只能存储音频;而如TIFF则只能存储图片;但大多数容器可以存储 音频,视频,字幕,元数据等。下面列出的所有视频 容器都支持一些字幕格式,比如SubRip 和 Advanced SubStation Alpha。

在这里插入图片描述

​ 如果仅仅是去改变容器而内部的编码不变,那么我们可以使用 -c copy 或 -c:a copy 或 -c:v copy 选项:

ffmpeg -i input.avi -q 1 -c copy output.mov

译者注:媒体格式和媒体容器指的都是同一件事,那就是媒体文件的类型。如AVI,MP4等等。

转码和转化(Transcoding and conversion)

​ ffmpeg从输入文件到输出文件的处理流程,称为 transcoding(转码)。它可以包含 format 之间的conversion步骤,也可以保持媒体的 format 不变,仅仅去修改一些特定的数据。数据包可以被编码压缩或者解压缩,要使用压缩时必须指定特定的编码。transcoding 处理流程可以被分为数个部分:

  • demuxing(demultiplexing:解封装,多路分解,多路解编,分为多路处理):基于文件的扩展名(如 .avi .mpg 等),选取来自 libavformat 库中的最佳 demux(demultiplexer:多路分解器)去处理输入文件,从而生成编码数据包(encoded data packet)。
  • decoding(解码):使用合适的 decoder (解码器)解码数据包,生成未压缩的帧数据;如果使用了 -c copy 或 -codec copy 选项,那么无 decoding 过程(同样无 filtering 过程)。
  • 可选的 filtering:解码后的帧可以被指定的 filter 修改。
  • encoding(编码):使用选择的 encoder(编码器)将未压缩的帧数据编码成数据包。
  • muxing(multiplexing:封装,多路处理,多路技术):将数据包 muxed 成为选定的媒体 format。

在这里插入图片描述

​ 可用于 ffmpeg 格式转换的选项可以分为通用的和私有的,通用的选项可以设置给任意的 container,codec 和 devices,而私有的选项只能设置为特定的 container,codec 和 devices。

编解码器介绍

​ codec:编解码器,编码解码器

​ codec 这个单词是从 coder-decoder 或 encoder-decoder 简化来的,意思就是编码解码器,它的含义是使用一个设备或者软件去编码和解码一个视频流或者音频流,也就是使用某种算法来压缩数据和还原数据。FFmpeg 中 编解码器的定义是一个 media bitstream format(bit:比特位),也就是说,编解码器指的是一个媒体流(本质是一个比特位组成的数据流)的格式,而decoder和encoder是该格式的实际设备和软件工具。下面的命令可以显示可用的 codec :

  • ffmpeg -codes:显示所有可用的编码器和解码器

  • ffmpeg -decoders:仅显示解码器

  • ffmpeg -encoders:仅显示编码器

    在命令行中,我们可以使用 -c 或者 -codec 选项来指定 codec ,语法如下:

 -codec[:stream_specifier] codec_name

​ 我们可以为输入和输出文件指定 codec,如果输出文件包含多个流,每个流可以使用一个不同的 codec 。如果我们不指定输出文件的 codec ,那么ffmpeg会选择默认的 codec 。下面列出了常见媒体格式的默认 codec :

在这里插入图片描述

覆盖同名输出文件

​ 如果在 ffmpeg 命令中指定的输出文件名称已经存在,控制台会询问我们是否覆盖原有的旧文件。为了避免这个询问流程,我们可以用 -n 选项来表示不询问并采用不覆盖操作,-y 选项表示不询问并采用覆盖操作。例如,如果想要默认去覆盖旧的文件,那么可以使用如下命令:

ffmpeg -y -i input.avi output.mp4

格式转换的通用选项

​ 通用选项可用于任意 codec,container,device。下表就是在格式转换中与编码解码器相关的通用选项的详细说明,在 target 这一列仅能包含 5 个字母,它们限制了对应选项的使用范围。而每个字母的含义表示,该选项可以用在 encoding(E),decoding(D),video(V),audio(A),subtitles(S)。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

​ 在《Presets for Codecs》一节中,有如何使用上述部分选项的例子。为了将多个输出文件的质量保持一致,我们可以使用 -q 或者 -qscale[:stream_specifier] 选项来指定输出文件的质量,它的取值为 1 到 31 ,其中 1 表示使用最高质量。

转换的私有选项

​ 通用选项可以设置为任意 codec,container,devices,但私有选项只能为特定的 codec,container,devices 设置。

MPEG-1 video encoder

​ mpeg1video encoder 除了通用选项之外,还能使用下表中的私有选项:

在这里插入图片描述

MPEG-2 video encoder

​ mpeg2video encoder 除了通用选项之外,还能使用下表中的私有选项:

在这里插入图片描述

MPEG-4 video encoder

​ mpeg4 encoder 可以使用的私有选项在上述两个表中均有描述,分别是:

  • data_partioning
  • alternate_scan
  • mpv_flags
  • luma_elim_threshold
  • chroma_elim_threshold
  • quantizer_noise_shaping

libvpx video encoder

​ libvpx 可能会被 WEBM format 使用,其私有选项如下:

在这里插入图片描述

AC-3 audio encoder

​ ac3 encoder的私有选项如下:

在这里插入图片描述

VCD,SVCD,DVD,DV,DV50的简易编码

​ 当我们要转化为特定的媒体类型,如VCD,SVCD,DVD,DV,DV50等,我们可以使用特殊的 -target 选项,此时我们仅需要这一个选项,而不用设置相关的大量选项,相当于 -target 这个选项帮我们做了一个整体的设置。-target 可取的值有:

在这里插入图片描述

​ 所有需要的参数,如帧率,长宽比,比特率等等都会根据我们指定的媒体格式进行自动设置,例如编码一个视频为DVD时,命令如下:

ffmpeg -i input.avi -target dvd output.mpg
H&A
发布了7 篇原创文章 · 获赞 4 · 访问量 822

猜你喜欢

转载自blog.csdn.net/qq_34305316/article/details/103937364
今日推荐