视频文件工作的基本原理
前言
在文件中存储视频比存储文本或 HTML 更具挑战性。“描述”视频的数据量比文本大几个数量级(比如某岛的教学视频,通常都是几个G级别),因此需要对其进行优化和压缩才能使视频文件可用。
视频数据通常由一系列图像描述,每个图像包括图像中每个像素的颜色(视频本质就是连起来的图片,你可以理解为快速翻书)。此序列通常通过仅记录从一帧到下一帧的变化来压缩,压缩有助于减少视频数据的存储和带宽需求。
视频通常包括一个或多个音轨,这些视频和音轨需要同步才能一起播放。 视频也可以包含字幕和其他元数据,它们使用完全不同的格式,但也需要实现时间同步。
因此,视频文件有两个基本要求:
包含不同的多媒体元素;
压缩这些元素以使其可用
这些元素通常称为流或轨道
容器(Containers)
为了解决 “包含不同的多媒体元素” 要求,视频文件被定义为容器。这意味着一个视频文件可以包含多种元素(视频轨道、音频轨道、元数据……)。另外,容器也有多种格式(如:MP4、MKV、MOV 等)。
所以当我们通常说一个视频是 MP4 格式时,我们指的是它的容器格式。
编解码器(Codecs)
为了满足第二个要求(压缩这些元素以使其可用),容器内的每个元素都以特定方式编码(也称为压缩)。
一些编解码器提供非常好的压缩(文件大小减小)但是丢失质量,称为有损编解码器。而另一些编解码器压缩质量一般但是不丢失任何质量,称为无损编解码器。
由于这些原因,在实现视频编解码时我们通常不会追求极致的完美,而是选择适合目标场景所需的编解码器。
常见的音、视频编解码器有:H.264、H.265、AAC、MP3、FLAC。
编辑视频文件
现在我们知道了视频文件是一个容器,每个容器通常都会使用不同的编解码器来压缩其元素或流。而对视频文件的编辑步骤通常如下:
Demuxing:打开容器并提取不同的流
Decoding:解压缩我们要修改的流
Editing:对流应用任何更改
Encoding:重新压缩回流
Muxing:将流打包到容器文件中
在这个过程中,我们可以实现使用与原始容器不同的格式进行压缩和打包流。例如,如果我们将 MP4 文件转换为 MKV,又或者我们将 MP4 文件的音频编码从 MP3 更改为 AAC。
将容器从一种格式更改为另一种格式的过程称为转换(transmuxing)。将编码从一种格式更改为另一种格式的过程称为转码(transcoding)。
当你在工作中使用视频技术时,你可能会一次又一次地发现这些概念。因为这些概念就是用于创建、编辑和共享视频。
视频容器的兼容性问题(Compatibility)
并非所有视频容器都可以使用任何格式编码的流。比如某些容器的流可能是特定或至少是一个简短的编解码器列表。而在实际中,MKV 是最通用的容器格式之一。
同样的,并不是所有的视频播放器都能播放所有的视频文件。这是因为视频播放器必须知道如何打开容器以及如何解压缩媒体元素。不过,最通用的视频播放器绝对是 VLC,也是我的最爱~
在很多时候,我们必须确保我们的视频文件与最常见的视频播放器兼容,例如 Quicktime(在 MacOSX 中)或浏览器(Chrome、Edge、Safari、Firefox)中嵌入的 HTMl5 本机视频播放器。 为此,在某些情况下,我们需要添加特定选项。