視頻容器
視頻容器(又稱視頻文件格式)就是用來裝載多媒體數(shù)據(jù)流(包含:視頻流、音頻流和字幕流)的文件格式,一般包含:文件頭部分(說明多媒體數(shù)據(jù)符合的編碼格式及規(guī)范信息)、索引部分、媒體數(shù)據(jù)部分。
常見的視頻容器有:
FLV
flash video 流媒體文件格式,是隨著Flash MX的推出發(fā)展而來的網(wǎng)絡視頻封裝格式。具有如下特點:
文件體積小,清晰的FLV視頻1分鐘在1MB左右,是普通文件體積的1/3
再加上CPU占有率低
提供數(shù)字版本保護功能
解決了視頻文件導入Flash后,導出的SWF文件體積龐大問題
FLV的文件構成

Tag Header由11字節(jié)組成:
1:Tag的類型:音頻(0x08),視頻(0x09),Script Data(0x12)
2-4:表示一個無符號24位整型數(shù)值,表示當前Tag Data的大小;
5-7:無符號24位整型數(shù)值,當前Tag的開始時間戳(單位為ms)
8:為時間戳的擴展字節(jié),當前24位不夠用時,該字節(jié)作為最高位,將時間戳擴展為32位無符號整數(shù)
9-11:表示Stream ID,總是0
音頻Tag Data:第一個字節(jié)是音頻流信息,接著是音頻流數(shù)據(jù),其中第一個字節(jié)中信息有:
4位 表音頻編碼格式
2位 表示采樣率
1位 采樣的長度(0: 8bit/1: 16bit),壓縮過的都1
1位 音頻類型(0: Mono/1: Stereo)
視頻Tag Data:第一個字節(jié)也是視頻流信息(4bit表示幀類型、4bit表示編碼類型),接著是視頻流數(shù)據(jù)。
Script Data:是flv的第一個Tag,僅有一個,用于存放flv中存放媒體流的總體信息,包括時長、創(chuàng)建時間等,數(shù)據(jù)都是以:數(shù)據(jù)類型 [數(shù)據(jù)長度] 數(shù)據(jù) 格式出現(xiàn)
FLV在H.264的視頻規(guī)格或是AAC的音源規(guī)格都達到功能極限,為了克服這個格式上的限制,F4V于是誕生。F4V是基于ISO base media file format(MPEG-4 Part 12)定制的,支持視頻類型為H.264,圖片類型為GIF、PNG、JPEG,音頻類型為AAC、MP3。由于MPEG-4 Part 14 (即MP4規(guī)范)也是對MPEG-4 Part 12的擴展,直接分析MP4的文件結(jié)構。
參考
FLV and F4V File Format Specification
mp4
mp4是一種符合MPEG-4 part 14規(guī)范的文件格式,文件擴展名為.mp4,以存儲數(shù)字音頻及數(shù)字視頻為主。該標準是對MPEG-4 part 12的擴展。 1998年2月11日,國際標準組織(IS0)認可QuickTime(蘋果支持的視頻文件格式MOV)檔案格式作為MPEG-4標準的基礎。所以兩種文件格式大致相同。
MP4的文件結(jié)構:
MP4文件中的所有數(shù)據(jù)都裝在box(QuickTime中為atom)中,由若干個box組成。每個box有類型和長度,可以將理解為一個數(shù)據(jù)對象塊。box中可以包含另外一個box,這種box稱為container box。
一個MP4文件首先會有且只有一個“ftyp”類型的box,作為MP4格式的標志并包含關于文件的一些信息;
有且只有一個“moov”類型的box(Movie Box),包含了媒體的metadata信息;
MP4文件的媒體數(shù)據(jù)包含在多個“mdat”類型的box中。
在流媒體應用場景,不能預先保存關于整個流數(shù)據(jù)的metadata信息,且預先保存的metadata越少獲取到數(shù)據(jù)越快。所以上面的文件組合方式就不太適用于流媒體。然而MPEG-4 標準允許以fragmented方式組合mdat box 以及其metadata (moof box),結(jié)構如下圖所示:
參考
QuickTime File Format Specification
TS
MPEG2-TS(Transport Stream“傳輸流”;又稱MTS、TS)是一種傳輸和存儲包含音效、視頻與通信協(xié)議各種數(shù)據(jù)的標準格式,多用于數(shù)字電視廣播系統(tǒng)。在傳輸中Packet是最基本單位,由 Header 和 Payload 組成,固定長度為188個字節(jié),但是后面有可能會追加一些驗證字節(jié),所以packets的長度有可能變?yōu)?92、204或者208Byte的長度。Packet結(jié)構如圖所示
終端接收到的視頻數(shù)據(jù)其實是一段段的碼流,根據(jù)處理階段可以分成以下幾個類型:
TS流(Transport stream):傳輸流,將具有共同時間基準或獨立時間基準的一個或多個PES組合而成的單一數(shù)據(jù)流,用于數(shù)據(jù)傳輸。
PES流(Packetized elementary stream):把基本碼流ES分割成段,并加上相應頭打包成形的打包基本碼流。
ES流(Elementary stream):基本碼流,不分段的音頻、視頻或其他信息的連續(xù)碼流。
參考
其它視頻容器格式還有:mkv、vob、 avi、asf、3gp、mov、rm、rvm、rmvb、vob 等
ps:目前我們項目中使用的ExoPlayer,支持的視頻容器有

ps支持文件格式并不代表能播放視頻。
因為Exoplayer采用的是硬解碼方式,視頻能否播放取決于當前系統(tǒng)是否支持該視頻編碼方式。
視頻編碼格式
通俗的講就是音視頻數(shù)據(jù)的壓縮標準,主要作用于將視頻像素數(shù)據(jù)(RGB,YUV等)、音頻PCM數(shù)據(jù)壓縮成視頻碼流、音頻碼流等。每種視頻容器對兼容的編碼格式有所限制,基于Matroska(開源的多媒體封裝規(guī)范)實現(xiàn)的mkv容器,可以把多種不同編碼的音視頻封裝到一個容器里。
MPEG系列
(由ISO[國際標準組織機構]下屬的MPEG[運動圖象專家組]開發(fā) )視頻編碼方面主要是Mpeg1(vcd用的就是它)、Mpeg2(DVD使用)、Mpeg4(的DVDRIP使用的都是它的變種,如:divx,xvid等)、Mpeg4 AVC(正熱門);
音頻編碼方面主要是MPEG Audio Layer 1/2、MPEG Audio Layer 3(大名鼎鼎的mp3)、MPEG-2 AAC 、MPEG-4 AAC等等。注意:DVD音頻沒有采用Mpeg的。
H.26X系列
(由ITU[國際電傳視訊聯(lián)盟]主導,側(cè)重網(wǎng)絡傳輸,注意:只是視頻編碼)
包括H.261、H.262、H.263、H.263+、H.263++、H.264、H.265
其它
RealNetworks公司的:RealVideo (rm、rvm、rmvb 容器支持的編碼方式)
SMPTE 系統(tǒng)列:VC-1(基于Windows Media Video 9壓縮技術的視頻壓縮標準、 VC-2 VC-3、 VC-5
開放媒體聯(lián)盟:AV1(AOMedia Video 1,是一個開放,免專利的視頻編碼格式,由google 推出的 VP9延展、WebM視頻容器支持的編碼)
AVS(Audio Video coding Standard),即數(shù)字音視頻編解碼技術標準,為中國第二代信源編碼標準。
目前最新視頻編碼:AV1 \ H265\ AVS的對比:
AV1 :延展VP9(目前好像還是VP9使用的比較多),開放、免專利,但是硬件支持有限,需要純軟件實現(xiàn)編解碼,現(xiàn)有技術有定的瓶頸。
H265: 旨在有限帶寬下傳輸更高質(zhì)量的網(wǎng)絡視頻,使在線播放1080p的全高清視頻、4K和8K超高清視頻成為可能;且硬件支持比較廣泛。(缺點收費)
AVS 國產(chǎn)
更多詳情信息參考:
視頻編碼
視頻傳輸
首先得了解幾個概念:
視頻流:服務器在向用戶傳輸視頻文件時,不是一次將文件整體發(fā)送出去,將一連串的媒體數(shù)據(jù)壓縮后,經(jīng)過網(wǎng)絡分段發(fā)送數(shù)據(jù),使得數(shù)據(jù)包得以像流水一樣發(fā)送,每一段都是獨立可播的小片斷。
下面將介紹視頻傳輸相關的幾個常用協(xié)議:
RTP/RTCP/RTSP
RTSP:實時流協(xié)議(Real Time Streaming Protocol)
應用層協(xié)議,RTSP提供了一個可供擴展的框架,它的意義在于使得實時流媒體數(shù)據(jù)的受控和點播變得可能,提供DESCRIBE,SETUP,PLAY,PAUSE,TEARDOWN,OPTIONS等方法,本身并不傳輸數(shù)據(jù),基于面向無連接的傳輸協(xié)議UDP。
RTP:實時傳輸協(xié)議(Real-time Transport Protocol)
應用層網(wǎng)絡傳輸協(xié)議,對流媒體數(shù)據(jù)進行封包并實現(xiàn)媒體流的實時傳輸,每一個RTP數(shù)據(jù)報都由頭部(Header)和負載(Payload)兩個部分組成,其中頭部前12個字節(jié)的含義是固定的,而負載則可以是音頻或者視頻數(shù)據(jù)。與控制協(xié)議RTCP一起使用,而且它是創(chuàng)建在UDP協(xié)議上的。該協(xié)議直接傳輸視頻流不再需要容器進行封裝。
RTCP :實時傳輸控制協(xié)議(Real-time Transport Control Protocol)
和RTP一起協(xié)作將多媒體數(shù)據(jù)打包和發(fā)送。RTCP定期在流多媒體會話參加者之間傳輸控制數(shù)據(jù)。RTCP的主要功能是為RTP所提供的服務質(zhì)量 提供反饋。
RTSP發(fā)起/終結(jié)流媒體、RTP傳輸流媒體數(shù)據(jù) 、RTCP對RTP進行控制、同步
其它的實時流傳輸協(xié)議還有:RTMP(Adobe公司提出基于TCP實時消息傳輸應用層協(xié)議)、MMS(微軟提出的一種串流媒體傳送協(xié)議,傳遞和接收Windows Media服務器中.asf文件)
HLS - HTTP live streaming
蘋果公司實現(xiàn)的基于HTTP的流媒體傳輸協(xié)議,可實現(xiàn)直播和點播,相對于RTMP其它有較高的延遲。當媒體流正在播放時,客戶端可以選擇從許多不同的備用源中以不同的速率下載同樣的資源,允許流媒體會話適應不同的數(shù)據(jù)速率。HTML5可以直接打開播放。
獲取視頻流程是如下圖所示:

其中index文件是包含元數(shù)據(jù)的extended M3U (m3u8) 文件。如果視頻具備有不同帶寬切換則會有二級:主index文件中包含子index文件的下載地址,子index文件包含視頻流 MPEG-TS 文件的下載地址。m3u8是個文本文件,其中標簽定義可參考HTTP Live Streaming
點播VOD實現(xiàn):首先下載index文件,再根據(jù)不同帶寬獲取子index文件地址,下載子index文件,再根據(jù)其中記錄的視頻流地址下載視頻文件,進行解碼播放。如果不切換碼率,m3u8 文件只需要下載一次,且二級index中包含所有的ts文件下載地址。
Live 實現(xiàn):實時生成 m3u8 和 ts 文件, 在點播放的基礎上更新二級index文件。
其它基于HTTP實現(xiàn)的自適應串流技術有:
MPEG-DASH 是基于HTTP的自適應串流方案中的唯一國際標準,與具體編碼無關,僅是作為一個標準
HDS(Adobe HTTP Dynamic Streaming,切片文件格式為 FLV/F4V/MP4,索引文件為f4m,同時支持直播和時移)
MSS(Microsoft Smooth Streaming,切片格式為 mp4,索引文件為ism/ismc)
目前我們項目中使用的ExoPlayer 提供了
DASH(DashMediaSource)
SmoothStreaming (SsMediaSource),HLS(HlsMediaSource)` and regular media files (ExtractorMediaSource)
實時傳輸協(xié)議 vs HTTP 自適應流
有些實時傳輸協(xié)議被許多公司防火墻拒絕,而HTTP可以作為一個普通的文件通過;流傳輸協(xié)議適合于大數(shù)據(jù)量、高可用性的流,如直播事件、長事件或大型文,可實時對流進行一些操作,如暫停、快進等
HTTP 自適應流 適合于較小的數(shù)據(jù)傳輸和交互,只能在分片文件流下載完成后,本地模擬暫停、快進操作,并非真正的實時流。
ps:我們現(xiàn)在播放預告片就是使用HTTP漸進式下載,依賴是HTTP漸進式下載技術。以MP4文件舉例,只有在下載到媒體的元信息(Moov box)才能開始播放,Moov box中有媒體數(shù)據(jù)的索引表及開始位置,通過HTTP的range 字段獲取我需要的媒體數(shù)據(jù)。如果Moov atom 放在最后,則需要下載全部文件內(nèi)容才能開始播放。