正文開始
前面的文章咱們已經學習到麥克風或攝影機如何的將聲音與影像進行採集,並且也學會了將這些 raw data 進行編碼為了讓它們儘量小點兒,好讓咱們傳輸時輕鬆些,接下來咱們要學習將這些東東封裝
在一個容器中。
聲音與影像的封裝
本篇文章中我們將會分為以下章節,來探討這個主題:
- 什麼是封裝呢 ?
- 常見的容器(文件、格式)
- 容器的實際模樣 ( 以 wav 為範例 )
什麼是封裝呢 ?
封裝就是將聲音與影像編碼丟到一個容器中的過程。
簡而言之如下圖:
那為啥要封裝到容器呢 ?
基本上有以下幾個理由:
- 可以讓不同的媒體內容同步變的方便,例如聲音與影像。
- 可以提供索引內容,讓用戶可以決定想要看或聽什麼地方。
- 如果沒有容器,只傳送一串影像編碼,那你還要在傳送聲音編碼才會有聲音。
- 如果只傳送編碼,如果沒有一些編碼資訊,那接受要如何解碼呢 ?
編碼與容器是一對多的關係
有些東西需要先搞個清楚一下,不然我一開始研究時常常在混亂中。
例如咱們很常說的 MP3 編碼、文件、格式,它到底是指啥 ? 編碼還是容器 ?
咱們常看到的 .mp3 檔是個容器(文件、格式),然後它裡面放了 MP3 編碼,再外加一些資訊。
那 mp3 編碼可以放到其它容器裡嗎 ? 當然可以 ! 像他就可以放到 .mp4 或 .avi 容器中。
所以說基本上一種音頻編碼是可以有多種容器選擇的。
常見的容器(文件、格式)
接下來將介紹一些常見的容器,這也先說一下網路上在說明容器時有很多種名稱,例如音頻文件、音頻格式、音頻檔這些,它們指的都是容器的概念。
.wav (聲音)
WAV (Waveform Audio File Format) 它是微軟開發出來的聲音容器,雖然它是微軟開發出來的,但在其它的平台也廣泛的支持,基本上它就是聲音 raw data 容器,就是用來儲放 PCM 編碼的。
備註: 它符合 RIFF 文件規範格式標準。wiki-RIFF
.mp4 (混合、串流)
MP4(MPEG-4 Part 14),它是一種影片的多媒體容器,除了聲音與影像外,它還可以儲放字幕,由於它也有支持串流的播放,所以也可以在網路上支援流傳輸。
它可以支援的編碼如下:
- 影像編碼:H.26X、MPEG4 Part 2、VP9 (VP8 不確定有沒有)
- 聲音編碼:AAC、MPEG-4 Part3 (包含 MP3)
.ogg (混合、串流)
OGG,它也是一種可以裝這影像或聲音的容器,同時也屬於流媒體,可支持串流播放,它比較特殊的是它是自由開源項目,它並沒有軟體專利的限制(MPEG4 就有)。
它可以支援的編碼如下:
- 影像編碼:Theora、Daala
- 聲音編碼:Vorbis、Opus、Flac、PCM
.flv/.f4v (混合、串流)
FLV (Flash video),它是由 Adobe 所開發的網路串流容器,基本上常用於 RTMP、HTTP-FLV 這兩個協議上,這個之後會詳細說明,然後 .f4v 是它的進化版,最後直播很常用它。
它可以支援的編碼如下:
- 影像編碼:H264
- 聲音編碼:MP3、AAC、PCM
.webm (混合、串流)
WebM 它是由 Google 支援的影像檔容器,它裡面使用的封裝格式為 Matroska,基本上這個容器開發出來是專門給 HTML5 使用的,它們們家的 Youtube 也都支持這種格式。
它可以支援的編碼如下:
- 影像編碼:VP8、VP9
- 聲音編碼:Vorbis、Opus
.ts (混合、串流)
TS (MPEG-2 Transport Stream),它是一種影像容器,目前 HLS 協議中專門的使用它,這也在之後會詳細的說明,最後直播也很常用它。
它可以支援的編碼如下:
- 影像編碼:H264、MPEG4 part 2
- 聲音編碼:MP3、AAC
容器的產生與實際樣子 ( 以 .wav 為範例 )
首先聲音會由麥克風採集到,接下來再透過 PCM 將聲音轉換成 PCM 編碼,然後會將這個編碼包裝成一個檔案,這個檔案中包含了這個音訊的資訊與 PCM 編碼,最後就是我們看到的檔案。
以 .wav 容器為例,我們來看看它裡面實際上包裝了啥。
.wav = 表頭 (聲音資訊) + 表身 (聲音編碼)
下圖就是實際上長的樣子,根據資源交換檔案格式 (RIFF),在檔案的前 44 或 46 個位元組當做表頭,用來記錄音訊相關資訊,內容如下,它會記錄音訊格式、取樣頻率與取樣大小,然後表頭以後的表身就是放置咱們剛剛聲音PCM 編碼。
圖片來源: 維基-wav
結論
本篇文章中咱們學習了以下的重點:
- 什麼是封裝呢?就是將聲音與影像編碼丟到一個容器中的過程。
- 常見的容器。自已往上拉。不過有分的清楚那些是聲音容器、那些又是影像容器、還有另一種是流容器(這之後會在詳細說)
- 容器的產生與實際樣子( 以 .wav 為範例 )。
目前基本上咱們已經學完了編碼與封裝,其中這裡有個重點要記得:
要理的清楚什麼是『編碼』與什麼是『容器』。