音視頻應(yīng)用領(lǐng)域變化:10多年前基本是先去下載文件,下載完成后,在電腦端播放本地文件;現(xiàn)在基本是電腦或手機(jī)在線播放音視頻。以前電腦端下載一個(gè)文件,視頻文件格式如.rmvb,.avi,等等,它們是一個(gè)整體,如果只下載一半是無法播放的。所以現(xiàn)在我們在網(wǎng)絡(luò)上不再傳輸rmvb、avi;我們現(xiàn)在傳視頻流和音頻流,不再區(qū)分視頻文件格式。市場需求導(dǎo)致了以前學(xué)習(xí)音視頻是學(xué)習(xí)視頻文件格式,現(xiàn)在學(xué)習(xí)音視頻是學(xué)習(xí)編碼,如H264和H265等。一個(gè)是以磁盤文件為載體,現(xiàn)在是以網(wǎng)絡(luò)為載體。

音視頻分為視頻和音頻。我們通常說的視頻一般指音視頻。從專業(yè)角度上說,視頻即可視的圖像信息;音頻指帶有頻率的聲波或者存儲(chǔ)聲音內(nèi)容的文件。
大家應(yīng)該有過這樣的經(jīng)歷,在觀看視頻時(shí),發(fā)現(xiàn)聲音和畫面存在延遲。經(jīng)常是畫面過去幾秒后,才播放對(duì)應(yīng)的聲音。因?yàn)樵谝粢曨l中,主要存在兩種數(shù)據(jù),視頻數(shù)據(jù)和音頻數(shù)據(jù),他們是單獨(dú)進(jìn)行處理的,當(dāng)出現(xiàn)不同步時(shí),就會(huì)出現(xiàn)聲音和視頻畫面對(duì)不上的情況。
我們在用播放器進(jìn)行音視頻播放時(shí),肯定遇見過播放格式不支持的問題,那么什么是格式?
1.1視頻封裝格式
1.1.1視頻文件格式
我們對(duì)視頻文件很熟悉,我們經(jīng)??吹降氖且曨l文件格式,那么視頻文件格式與視頻封裝格式之間是什么樣的對(duì)應(yīng)關(guān)系呢?下面是幾種常用的 視頻文件后綴類型 與其相對(duì)應(yīng)的 封裝格式。
| 視頻文件格式 | 視頻封裝格式 |
|---|---|
| .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 |
封裝格式(也叫容器),就是將已經(jīng)編碼壓縮好的視頻軌和音頻軌按照一定的格式放到一個(gè)文件中,也就是說僅僅是一個(gè)外殼,或者把它當(dāng)成一個(gè)放視頻軌和音頻軌的文件夾也可以。說得通俗點(diǎn),視頻軌相當(dāng)于飯,而音頻軌相當(dāng)于菜,封裝格式就是一個(gè)碗,用來盛放飯菜的容器。
1.1.2視頻封裝格式
我們常見的視頻封裝格式有:.mov、.avi、.mpg、.vob、.mkv、.rm、.rmvb等等。為什么會(huì)有這么多種不同的文件格式?那是因?yàn)?strong>它們通過不同的方式實(shí)現(xiàn)了視頻這件事情,至于這個(gè)不同在哪里,那就需要了解一下接下來要說的「視頻封裝格式」這個(gè)概念了。
視頻封裝格式,簡稱視頻格式,相當(dāng)于一種存放視頻信息的容器,它里面包含了視頻信息、音頻信息和相關(guān)的配置信息(例如:視頻和音頻的關(guān)聯(lián)信息、如何解碼等)。視頻封裝格式最直接的反映就是視頻文件格式,如下表 ??
| 視頻文件格式 | 視頻封裝格式 | 釋義 |
|---|---|---|
| .avi | AVI(Audio Video Interleave) | 圖像質(zhì)量好,但體積過于龐大,壓縮標(biāo)準(zhǔn)不統(tǒng)一,存在高低版本兼容問題。 |
| .wmv | WMV(Windows Media Video) | 可邊下載邊播放,很適合網(wǎng)上播放和傳輸 |
| .mpg .mpeg .mpe .dat .vob .asf .3gp .mp4 | MPEG(Moving Picture Experts Group) | 由運(yùn)動(dòng)圖像專家組制定的視頻格式,有三個(gè)壓縮標(biāo)準(zhǔn),分別是 MPEG-1、MPEG-2、和 MPEG-4,它為了播放流式媒體的高質(zhì)量視頻而專門設(shè)計(jì)的,以求使用最少的數(shù)據(jù)獲得最佳的圖像質(zhì)量。 |
| .mkv | Matroska | 一種新的視頻封裝格式,它可將多種不同編碼的視頻及 16 條以上不同格式的音頻和不同語言的字幕流封裝到一個(gè) Matroska Media 文件當(dāng)中。 |
| .rm、.rmvb | Real Video | Real Networks 公司所制定的音頻視頻壓縮規(guī)范稱為 Real Media。用戶可以使用 RealPlayer 根據(jù)不同的網(wǎng)絡(luò)傳輸速率制定出不同的壓縮比率,從而實(shí)現(xiàn)在低速率的網(wǎng)絡(luò)上進(jìn)行影像數(shù)據(jù)實(shí)時(shí)傳送和播放。 |
| .mov | QuickTime File Format | Apple 公司開發(fā)的一種視頻格式,默認(rèn)的播放器是蘋果的 QuickTime。這種封裝格式具有較高的壓縮比率和較完美的視頻清晰度等特點(diǎn),并可以保存 alpha 通道。 |
| .flv | Flash Video | 由 Adobe Flash 延伸出來的一種網(wǎng)絡(luò)視頻封裝格式。這種格式被很多視頻網(wǎng)站所采用。 |
1.1.3 容器
將已經(jīng)編碼壓縮好的視頻數(shù)據(jù)和音頻數(shù)據(jù)按照一定的格式放到一個(gè)文件中,這個(gè)文件可以稱為容器。當(dāng)然可以理解為這只是一個(gè)外殼。

通常,除了音頻數(shù)據(jù)和視頻數(shù)據(jù)外,還會(huì)存放一些視頻同步的元數(shù)據(jù):例如字幕,這種多數(shù)據(jù)會(huì)給不同的程序來處理,但是在傳輸和存儲(chǔ)的時(shí)候,又是被綁定在一起的。
1.2音視頻編碼方式簡介
視頻編碼的原始數(shù)據(jù)從攝像頭采集。視頻采集的數(shù)據(jù)叫YUV。音頻亦是如此,音頻采集的原始數(shù)據(jù)是線性PCM。
編碼的本質(zhì)是壓縮,壓縮方式不一樣,就取了不同的名字。音視頻編碼格式有幾百種,我們只需要知道一些主流的就行。
1.2.1視頻編碼方式
- 視頻編碼的作用: 將視頻像素?cái)?shù)據(jù)(RGB,YUV 等)壓縮成視頻碼流,從而降低視頻的數(shù)據(jù)量。
| 名稱 | 推出機(jī)構(gòu) | 推出時(shí)間 | 目前使用領(lǐng)域 |
|---|---|---|---|
| HEVC(H.265) | MPEG/ITU-T | 2013 | 研發(fā)中 |
| H.264 | MPEG/ITU-T | 2003 | 各個(gè)領(lǐng)域 |
| MPEG4 | MPEG | 2001 | 不溫不火 |
| MPEG2 | MPEG | 1994 | 數(shù)字電視 |
| VP9 | 2013 | 研發(fā)中 | |
| VP8 | 2008 | 不普及 | |
| VC-1 | Microsoft Inc. | 2006 | 微軟平臺(tái) |
1.2.2音頻編碼方式
音頻編碼的作用: 將音頻采樣數(shù)據(jù)(PCM 等)壓縮成音頻碼流,從而降低音頻的數(shù)據(jù)量。 常用的音頻編碼方式有以下幾種:
| 名稱 | 推出機(jī)構(gòu) | 推出時(shí)間 | 目前使用領(lǐng)域 |
|---|---|---|---|
| AAC | MPEG | 1997 | 各個(gè)領(lǐng)域(新) |
| MP3 | MPEG | 1993 | 各個(gè)領(lǐng)域(舊) |
| WMV | Microsoft Inc. | 1999 | 微軟平臺(tái) |
| AC-3 | Dolby Inc. | 1992 | 電影 |
1.2.3 H264是怎么來的?
不得不提兩大機(jī)構(gòu)ITU-T和ISO。
-
ITU-T:中文名稱是國際電信聯(lián)盟電信標(biāo)準(zhǔn)分局(ITU-T for ITU Telecommunication Standardization Sector), 它是國際電信聯(lián)盟管理下的專門制定電信標(biāo)準(zhǔn)的分支機(jī)構(gòu)。該機(jī)構(gòu)創(chuàng)建于1993年,前身是國際電報(bào)電話咨詢委員會(huì)(CCITT是法語Comité Consultatif International Téléphonique et Télégraphique的縮寫,英文是International Telegraph and Telephone Consultative Committee),總部設(shè)在瑞士日內(nèi)瓦。 -
ISO:國際標(biāo)準(zhǔn)化組織(International Organization for Standardization,簡稱為ISO)。這個(gè)組織沒必要介紹了,隨處可見。 -
MPEG(Moving Picture Experts Group,動(dòng)態(tài)圖像專家組)是ISO(International Standardization Organization,國際標(biāo)準(zhǔn)化組織)與IEC(International Electrotechnical Commission,國際電工委員會(huì))于1988年成立的專門針對(duì)運(yùn)動(dòng)圖像和語音壓縮制定國際標(biāo)準(zhǔn)的組織。
ITU-T成名時(shí)間早一點(diǎn),它想做的事情是統(tǒng)一一個(gè)標(biāo)準(zhǔn),推出了H261,推出之后反響不錯(cuò),在此基礎(chǔ)上推出了H262。ISO在看到這種情況后,想搶占市場,也推出了它的第一版Mpeg1,后來在此基礎(chǔ)上也開發(fā)了Mpeg2。此時(shí),造成了市場上兼容出現(xiàn)了問題,在此期間ITU-T又推出了H263,H263當(dāng)時(shí)超過了市面上所有編碼格式。ISO在看到這種情況后,終于選擇了握手言和,一起開發(fā)。在ITU-T和ISO的合作下,基于H263開發(fā)出了H264。在H264開發(fā)完成后,兩個(gè)機(jī)構(gòu)在這種格式取名上出現(xiàn)了分歧,ITU-T堅(jiān)持叫H264,但在ISO機(jī)構(gòu)的命名為Mpeg4-avc。在取名上誰也不讓步,造成了一種格式兩種叫法的情況。兩種叫法的共存現(xiàn)象,導(dǎo)致了在一些播放器上會(huì)出現(xiàn)H264-MPEG-4 AVC這種奇怪的命名。

一個(gè)網(wǎng)上曝出的真實(shí)的面試題:請說說H264和MPEG-4 AVC的區(qū)別?如果對(duì)這段歷史不清楚的話,那遇到這個(gè)問題,場面將會(huì)非常的搞笑。
另外:H265在ISO的命名叫做HEVC。
H.265:高效率視頻編碼是一種視頻壓縮標(biāo)準(zhǔn),H.264/MPEG-4的繼任者??芍С?K分辨率甚至到超高畫質(zhì)電視,最高分辨率可達(dá)到8192×4320(8K分辨率),這是目前發(fā)展的趨勢,尚未有大眾化編碼軟件出現(xiàn) 。
1.3驗(yàn)證音視頻文件由音頻和視頻組成
安裝FFMpeg,https://evermeet.cx/ffmpeg/,下載當(dāng)前最新ffmpeg-5.0.1和ffplay-5.0.1,解壓后是兩個(gè)可執(zhí)行文件。
可執(zhí)行文件: 1.ffmpeg 用于轉(zhuǎn)碼、推流、dump媒體文件 2.ffplay 用于播放媒體文件 3.ffprobe 用于獲取媒體文件信息 4.ffserver 用于簡單流媒體服務(wù)器
要想在終端中能使用,咱們把這兩個(gè)文件放到/usr/local/bin目錄下,一般這個(gè)目錄都是已經(jīng)配置過的。直接打開終端看到下面內(nèi)容,說明安裝成功。如果不行,再配置一下bash_profile。執(zhí)行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:圖像進(jìn)行格式轉(zhuǎn)換模塊。
libswresample:用于音頻重采樣。
libswresample:這個(gè)是老版本下編譯出來,新版本用libswresample代替。
libpostproc:后期處理模塊。
利用ffmpeg將音頻中的音頻數(shù)據(jù)和視頻數(shù)據(jù)抽取出來。然后將提取出來的文件通過ffplay進(jìn)行播放。在網(wǎng)絡(luò)數(shù)據(jù)中,視頻文件就是一個(gè)H264的碼流,音頻文件就是一個(gè)aac的碼流。音頻數(shù)據(jù)只有聲音,沒有畫面。視頻數(shù)據(jù)只有畫面,沒有聲音。
通過如下兩個(gè)命令提取音頻和視頻:
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的數(shù)據(jù)存放封裝格式需要的配置,如軌道信息,封裝格式信息。
1.4 本章相關(guān)面試題總結(jié)
什么是音視頻封裝格式?如上。
什么是視頻軌和音頻軌?將從攝像頭和麥克風(fēng)采集的數(shù)據(jù),按某種格式封裝的數(shù)據(jù),就是視頻軌和音頻軌,就是一種封裝格式。音視頻有很多種數(shù)據(jù)結(jié)構(gòu),那么就存在很多不同種類的視頻軌和音頻軌。
一個(gè)封裝格式是否只有一個(gè)音頻軌和一個(gè)視頻軌?在音視頻領(lǐng)域里面,視頻軌和音頻軌都可以有多個(gè)。例如,兩個(gè)不同的音頻軌,就形成了混音。
視頻軌和音頻軌是否存在順序?視頻軌和音頻軌是沒有順序的。打個(gè)比喻,視頻軌是飯,音頻軌是菜,封裝格式就是一個(gè)碗。怎么存飯,怎么存菜隨便你,你可以飯放在上面,也可以菜放到上面,也可以混合著放。封裝格式就是容器。不同的排列就是封裝格式??梢愿鶕?jù)視頻軌和音頻軌,在生成音視頻文件的時(shí)候打包成不同的封裝格式。
換一種說法,把視頻流和音頻流放到一個(gè)載體文件中,進(jìn)行封裝,需要一個(gè)容器進(jìn)行排列。放在一個(gè)容器中,就需要知道數(shù)據(jù)是怎么排列的,排列的方式不一樣,我們就把它叫做不同的容器。
視頻軌跟視頻流有什么區(qū)別呢?視頻軌是指一個(gè)視頻文件所有的視頻數(shù)據(jù), 視頻流是指一小段視頻數(shù)據(jù)。視頻流是為了一點(diǎn)一點(diǎn)的數(shù)據(jù)傳輸而產(chǎn)生的一種概念。視頻軌是為了對(duì)一整個(gè)數(shù)據(jù)進(jìn)行分析,而提出的一種的概念。
視頻流音頻流是壓縮數(shù)據(jù)還是非壓縮數(shù)據(jù)?常用的H264也是壓縮數(shù)據(jù)。音頻也是壓縮數(shù)據(jù),真正音頻是線性的,但是我們計(jì)算機(jī)中的音頻是離散的,通過采樣,因?yàn)槿搜酆腿硕囊曈X和聽覺欺騙,會(huì)感覺是連續(xù)的。
為什么要編碼?編碼的本質(zhì)就是為了壓縮。H264是一種編碼。壓縮的方式不一樣就叫不同的格式。
總結(jié):
1.音視頻是音頻、視頻、字幕等組成,至少包含音頻數(shù)據(jù)和視頻數(shù)據(jù)。
2.了解視頻文件格式的優(yōu)劣;視頻文件格式與視頻封裝格式之間的對(duì)應(yīng)關(guān)系。
3.稍微認(rèn)識(shí)一下ffmpeg,知道有命令可以做一些操作。
4.了解一下音視頻編碼格式,清楚H264是編碼格式的一種。
5.命名上的歷史。
最后附上兩張?jiān)诎沧慷撕蚷OS端在創(chuàng)建編碼器時(shí)的參數(shù):
在安卓端實(shí)例化一個(gè)編碼器使用哪種命名?或者問MediaCodec實(shí)例化一個(gè)H264的編碼器傳什么名稱?
因?yàn)镮SO的國際影響力更大,所以在安卓中,使用Mpeg4-avc,傳參"vedio/avc"。
因?yàn)槊膯栴},在安卓端面試有時(shí)會(huì)被問到,安卓是否支持H265?
但是業(yè)界都叫H264。蘋果端的格式命名那就有點(diǎn)任性了,力推ITU-T。

