音視頻一、音視頻本質(zhì)及ffmpeg安裝

音視頻應(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ò)為載體。

在播放器上查看編碼信息.png

音視頻分為視頻和音頻。我們通常說的視頻一般指音視頻。從專業(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 Google 2013 研發(fā)中
VP8 Google 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這種奇怪的命名。

編碼格式發(fā)展歷程

一個(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。

安卓中創(chuàng)建一個(gè)編碼器使用的格式.png
iOS中選擇編碼器格式.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容