音视频应用领域变化:10多年前基本是先去下载文件,下载完成后,在电脑端播放本地文件;现在基本是电脑或手机在线播放音视频。以前电脑端下载一个文件,视频文件格式如.rmvb,.avi,等等,它们是一个整体,如果只下载一半是无法播放的。所以现在我们在网络上不再传输rmvb、avi;我们现在传视频流和音频流,不再区分视频文件格式。市场需求导致了以前学习音视频是学习视频文件格式,现在学习音视频是学习编码,如H264和H265等。一个是以磁盘文件为载体,现在是以网络为载体。
音视频分为视频和音频。我们通常说的视频一般指音视频。从专业角度上说,视频即可视的图像信息;音频指带有频率的声波或者存储声音内容的文件。
大家应该有过这样的经历,在观看视频时,发现声音和画面存在延迟。经常是画面过去几秒后,才播放对应的声音。因为在音视频中,主要存在两种数据,视频数据和音频数据,他们是单独进行处理的,当出现不同步时,就会出现声音和视频画面对不上的情况。
我们在用播放器进行音视频播放时,肯定遇见过播放格式不支持的问题,那么什么是格式?
1.1视频封装格式
1.1.1视频文件格式
我们对视频文件很熟悉,我们经常看到的是视频文件格式,那么视频文件格式与视频封装格式之间是什么样的对应关系呢?下面是几种常用的 视频文件后缀类型 与其相对应的 封装格式。
视频文件格式 | 视频封装格式 |
---|---|
.avi | AVI(Audio Video Interleaved) |
.wmv、.asf | WMV(Windows Media Video) |
.mpg、.mpeg、.vob、.dat、.3gp、.mp4 | MPEG(Moving Picture Experts Group) |
.mkv | Matroska |
.rm、.rmvb | Real Video |
.mov | QuickTime File Format |
.flv | Flash Video |
封装格式(也叫容器),就是将已经编码压缩好的视频轨和音频轨按照一定的格式放到一个文件中,也就是说仅仅是一个外壳,或者把它当成一个放视频轨和音频轨的文件夹也可以。说得通俗点,视频轨相当于饭,而音频轨相当于菜,封装格式就是一个碗,用来盛放饭菜的容器。
1.1.2视频封装格式
我们常见的视频封装格式有:.mov、.avi、.mpg、.vob、.mkv、.rm、.rmvb
等等。为什么会有这么多种不同的文件格式?那是因为它们通过不同的方式实现了视频这件事情,至于这个不同在哪里,那就需要了解一下接下来要说的「视频封装格式」这个概念了。
视频封装格式,简称视频格式,相当于一种存放视频信息的容器
,它里面包含了视频信息
、音频信息
和相关的配置信息
(例如:视频和音频的关联信息、如何解码等)。视频封装格式最直接的反映就是视频文件格式,如下表 👇
视频文件格式 | 视频封装格式 | 释义 |
---|---|---|
.avi | AVI(Audio Video Interleave) | 图像质量好,但体积过于庞大,压缩标准不统一,存在高低版本兼容问题。 |
.wmv | WMV(Windows Media Video) | 可边下载边播放,很适合网上播放和传输 |
.mpg .mpeg .mpe .dat .vob .asf .3gp .mp4 | MPEG(Moving Picture Experts Group) | 由运动图像专家组制定的视频格式,有三个压缩标准,分别是 MPEG-1、MPEG-2、和 MPEG-4,它为了播放流式媒体的高质量视频而专门设计的,以求使用最少的数据获得最佳的图像质量。 |
.mkv | Matroska | 一种新的视频封装格式,它可将多种不同编码的视频及 16 条以上不同格式的音频和不同语言的字幕流封装到一个 Matroska Media 文件当中。 |
.rm、.rmvb | Real Video | Real Networks 公司所制定的音频视频压缩规范称为 Real Media。用户可以使用 RealPlayer 根据不同的网络传输速率制定出不同的压缩比率,从而实现在低速率的网络上进行影像数据实时传送和播放。 |
.mov | QuickTime File Format | Apple 公司开发的一种视频格式,默认的播放器是苹果的 QuickTime。这种封装格式具有较高的压缩比率和较完美的视频清晰度等特点,并可以保存 alpha 通道。 |
.flv | Flash Video | 由 Adobe Flash 延伸出来的一种网络视频封装格式。这种格式被很多视频网站所采用。 |
1.1.3 容器
将已经编码压缩好
的视频数据和音频数据
按照一定的格式
放到一个文件
中,这个文件可以称为容器
。当然可以理解为这只是一个外壳
。
通常,除了音频数据和视频数据外,还会存放一些视频同步的元数据
:例如字幕,这种多数据会给不同的程序来处理,但是在传输和存储的时候,又是被绑定在一起的。
1.2音视频编码方式简介
视频编码的原始数据从摄像头采集。视频采集的数据叫YUV。音频亦是如此,音频采集的原始数据是线性PCM。
编码的本质是压缩,压缩方式不一样,就取了不同的名字。音视频编码格式有几百种,我们只需要知道一些主流的就行。
1.2.1视频编码方式
- 视频编码的作用: 将视频像素数据(RGB,YUV 等)压缩成视频码流,从而降低视频的数据量。
名称 | 推出机构 | 推出时间 | 目前使用领域 |
---|---|---|---|
HEVC(H.265) | MPEG/ITU-T | 2013 | 研发中 |
H.264 | MPEG/ITU-T | 2003 | 各个领域 |
MPEG4 | MPEG | 2001 | 不温不火 |
MPEG2 | MPEG | 1994 | 数字电视 |
VP9 | 2013 | 研发中 | |
VP8 | 2008 | 不普及 | |
VC-1 | Microsoft Inc. | 2006 | 微软平台 |
1.2.2音频编码方式
音频编码的作用: 将音频采样数据(PCM 等)压缩成音频码流,从而降低音频的数据量。 常用的音频编码方式有以下几种:
名称 | 推出机构 | 推出时间 | 目前使用领域 |
---|---|---|---|
AAC | MPEG | 1997 | 各个领域(新) |
MP3 | MPEG | 1993 | 各个领域(旧) |
WMV | Microsoft Inc. | 1999 | 微软平台 |
AC-3 | Dolby Inc. | 1992 | 电影 |
1.2.3 H264是怎么来的?
不得不提两大机构ITU-T和ISO。
-
ITU-T
:中文名称是国际电信联盟电信标准分局(ITU-T for ITU Telecommunication Standardization Sector), 它是国际电信联盟管理下的专门制定电信标准的分支机构。该机构创建于1993年,前身是国际电报电话咨询委员会(CCITT
是法语Comité Consultatif International Téléphonique et Télégraphique的缩写,英文是International Telegraph and Telephone Consultative Committee),总部设在瑞士日内瓦。 -
ISO
:国际标准化组织(International Organization for Standardization,简称为ISO)。这个组织没必要介绍了,随处可见。 -
MPEG
(Moving Picture Experts Group,动态图像专家组)是ISO(International Standardization Organization,国际标准化组织)与IEC
(International Electrotechnical Commission,国际电工委员会)于1988年成立的专门针对运动图像和语音压缩制定国际标准的组织。
ITU-T成名时间早一点,它想做的事情是统一一个标准,推出了H261,推出之后反响不错,在此基础上推出了H262。ISO在看到这种情况后,想抢占市场,也推出了它的第一版Mpeg1,后来在此基础上也开发了Mpeg2。此时,造成了市场上兼容出现了问题,在此期间ITU-T又推出了H263,H263当时超过了市面上所有编码格式。ISO在看到这种情况后,终于选择了握手言和,一起开发。在ITU-T和ISO的合作下,基于H263开发出了H264。在H264开发完成后,两个机构在这种格式取名上出现了分歧,ITU-T坚持叫H264,但在ISO机构的命名为Mpeg4-avc。在取名上谁也不让步,造成了一种格式两种叫法的情况。两种叫法的共存现象,导致了在一些播放器上会出现H264-MPEG-4 AVC
这种奇怪的命名。
一个网上曝出的真实的面试题:请说说H264和MPEG-4 AVC的区别?如果对这段历史不清楚的话,那遇到这个问题,场面将会非常的搞笑。
另外:H265
在ISO的命名叫做HEVC
。
H.265
:高效率视频编码是一种视频压缩标准,H.264/MPEG-4的继任者。可支持4K分辨率甚至到超高画质电视,最高分辨率可达到8192×4320(8K分辨率),这是目前发展的趋势,尚未有大众化编码软件出现 。
1.3验证音视频文件由音频和视频组成
安装FFMpeg,https://evermeet.cx/ffmpeg/,下载当前最新ffmpeg-5.0.1和ffplay-5.0.1,解压后是两个可执行文件。
可执行文件: 1.ffmpeg 用于转码、推流、dump媒体文件 2.ffplay 用于播放媒体文件 3.ffprobe 用于获取媒体文件信息 4.ffserver 用于简单流媒体服务器
要想在终端中能使用,咱们把这两个文件放到/usr/local/bin
目录下,一般这个目录都是已经配置过的。直接打开终端看到下面内容,说明安装成功。如果不行,再配置一下bash_profile。执行vim ~/.bash_profile
chenshuangchao@chenshuangchaodeMacBook-Pro Downloads % ffmpeg -version
ffmpeg version 5.0.1-tessus https://evermeet.cx/ffmpeg/ Copyright (c) 2000-2022 the FFmpeg developers
built with Apple clang version 11.0.0 (clang-1100.0.33.17)
configuration: --cc=/usr/bin/clang --prefix=/opt/ffmpeg --extra-version=tessus --enable-avisynth --enable-fontconfig --enable-gpl --enable-libaom --enable-libass --enable-libbluray --enable-libdav1d --enable-libfreetype --enable-libgsm --enable-libmodplug --enable-libmp3lame --enable-libmysofa --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenh264 --enable-libopenjpeg --enable-libopus --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvmaf --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs --enable-libxvid --enable-libzimg --enable-libzmq --enable-libzvbi --enable-version3 --pkg-config-flags=--static --disable-ffplay
libavutil 57. 17.100 / 57. 17.100
libavcodec 59. 18.100 / 59. 18.100
libavformat 59. 16.100 / 59. 16.100
libavdevice 59. 4.100 / 59. 4.100
libavfilter 8. 24.100 / 8. 24.100
libswscale 6. 4.100 / 6. 4.100
libswresample 4. 3.100 / 4. 3.100
libpostproc 56. 3.100 / 56. 3.100
libavutil:核心工具库,做一些基本音视频处理操作。
libavcodec:音视频各种格式的编解码。
libavformat:用于各种音视频封装格式的生成和解析。
libadvice:用于硬件的音视频采集。
libavfilter:音视频滤镜库。
libswscale:图像进行格式转换模块。
libswresample:用于音频重采样。
libswresample:这个是老版本下编译出来,新版本用libswresample代替。
libpostproc:后期处理模块。
利用ffmpeg将音频中的音频数据和视频数据抽取出来。然后将提取出来的文件通过ffplay进行播放。在网络数据中,视频文件就是一个H264的码流,音频文件就是一个aac的码流。音频数据只有声音,没有画面。视频数据只有画面,没有声音。
通过如下两个命令提取音频和视频:
chenshuangchao@chenshuangchaodeMacBook-Pro ~ % cd /Users/chenshuangchao/Desktop/音视频专题
chenshuangchao@chenshuangchaodeMacBook-Pro 音视频专题 % ffmpeg -i input.mp4 -acodec copy -vn output.aac
chenshuangchao@chenshuangchaodeMacBook-Pro 音视频专题 % ffmpeg -i input.mp4 -c:v copy -bsf:v h264_mp4toannexb -an out.h264
利用ffplay播放out.h264
ffplay -stats -f h264 out.h264
总大小8746KB,视频大小6484KB,音频大小2210KB。还有52KB的数据存放封装格式需要的配置,如轨道信息,封装格式信息。
1.4 本章相关面试题总结
什么是音视频封装格式?如上。
什么是视频轨和音频轨?将从摄像头和麦克风采集的数据,按某种格式封装的数据,就是视频轨和音频轨,就是一种封装格式。音视频有很多种数据结构,那么就存在很多不同种类的视频轨和音频轨。
一个封装格式是否只有一个音频轨和一个视频轨?在音视频领域里面,视频轨和音频轨都可以有多个。例如,两个不同的音频轨,就形成了混音。
视频轨和音频轨是否存在顺序?视频轨和音频轨是没有顺序的。打个比喻,视频轨是饭,音频轨是菜,封装格式就是一个碗。怎么存饭,怎么存菜随便你,你可以饭放在上面,也可以菜放到上面,也可以混合着放。封装格式就是容器。不同的排列就是封装格式。可以根据视频轨和音频轨,在生成音视频文件的时候打包成不同的封装格式。
换一种说法,把视频流和音频流放到一个载体文件中,进行封装,需要一个容器进行排列。放在一个容器中,就需要知道数据是怎么排列的,排列的方式不一样,我们就把它叫做不同的容器。
视频轨跟视频流有什么区别呢?视频轨是指一个视频文件所有的视频数据, 视频流是指一小段视频数据。视频流是为了一点一点的数据传输而产生的一种概念。视频轨是为了对一整个数据进行分析,而提出的一种的概念。
视频流音频流是压缩数据还是非压缩数据?常用的H264也是压缩数据。音频也是压缩数据,真正音频是线性的,但是我们计算机中的音频是离散的,通过采样,因为人眼和人耳的视觉和听觉欺骗,会感觉是连续的。
为什么要编码?编码的本质就是为了压缩。H264是一种编码。压缩的方式不一样就叫不同的格式。
总结:
1.音视频是音频、视频、字幕等组成,至少包含音频数据和视频数据。
2.了解视频文件格式的优劣;视频文件格式与视频封装格式之间的对应关系。
3.稍微认识一下ffmpeg,知道有命令可以做一些操作。
4.了解一下音视频编码格式,清楚H264是编码格式的一种。
5.命名上的历史。
最后附上两张在安卓端和iOS端在创建编码器时的参数:
在安卓端实例化一个编码器使用哪种命名?或者问MediaCodec实例化一个H264的编码器传什么名称?
因为ISO的国际影响力更大,所以在安卓中,使用Mpeg4-avc,传参"vedio/avc"。
因为命名的问题,在安卓端面试有时会被问到,安卓是否支持H265?
但是业界都叫H264。苹果端的格式命名那就有点任性了,力推ITU-T。