1. 程式人生 > >AVPlayer支援的視訊格式

AVPlayer支援的視訊格式

發現很多人對視訊格式存在一些誤解,之前寫的一篇文章講AVPlayer的支援格式也有一些問題,所以這裡單獨出一篇文章講一下,希望大家能明白。

基本概念

一個線上視訊能夠播放,大致是經過了如下步驟:

video_play_progress.png

可以總結為:拉資料->解協議->解封裝->音視訊解碼->音視訊同步->播放。 下面就針對這幾個概念一一做下解釋:

播放協議

一般點播採用HTTP,而直播的話,大部分還是採用RTMP或者私有協議,原因是延時會比較小,RTMP本身也是為了直播設計的。常見的流媒體協議:

簡寫 全稱 推出機構 目前使用領域
HLS HTTP Live Streaming 蘋果 多應用於蘋果
RTP 實時傳輸協議 IETF 範圍較廣
RTCP 實時傳輸控制協議 IETF 範圍較廣
RTSP 實時串流協議 RealNetworks等 範圍較廣
RTMP 實時訊息協議 Adobe 較流行
MMS 串流媒體協議 Microsoft 範圍較廣

RTP/RTSP/RTCP的區別

RTSP發起/終結流媒體、RTP傳輸流媒體資料 、RTCP對RTP進行控制,同步。

HLS(Http Live Streaming) HLS是蘋果推出,實現的基於HTTP的流媒體傳輸協議: 優點: 1、通過m3u8索引檔案可實現針對當前瀏覽裝置的智慧選擇播放源, 2、通過m3u8索引檔案可實現新增備份索引檔案,防止伺服器崩潰視訊播放失敗 3、和http視訊一樣 不需要太多伺服器額外配置 缺點: 1、並非真正實時視訊,30s左右時間差 2、需要視訊處理 3、因為需要請求索引檔案(ts視訊檔案)請求次數相對較多,對伺服器負載較大

視訊編碼

所謂視訊編碼方式就是指通過特定的壓縮技術,將某個視訊格式的檔案轉換成另一種視訊格式檔案的方式。它是一種為了減少視訊體積,同時保證畫面質量的壓縮技術,常見的視訊編碼有:

名稱 推出機構 推出時間 目前使用領域
HEVC(H.265) MPEG/ITU-T 2013 研發中
H.264 MPEG/ITU-T 2003 各個領域
MPEG4 MPEG 2001 不溫不火
MPEG2 MPEG 1994 數字電視
XviD OpenDivX 2002 流行
VP9 Google 2013 研發中
VP8 Google 2008 不普及
VC-1 Microsoft Inc. 2006 微軟

H.264

H.264又叫AVC,是國際標準化組織(ISO)和國際電信聯盟(ITU)共同提出的繼MPEG4之後的新一代數字視訊壓縮格式,它集合了H.263和MPEG4的優點,擁有更高的資料壓縮比。在同等的影象質量條件下,H.264的資料壓縮比能比H.263高2倍,比MPEG-4高1.5倍。 也是目前蘋果支援最好的編碼格式。

音訊編碼

和視訊編碼類似,音訊編碼的作用是減少音訊中的冗餘,同時在保證一定音訊質量的條件下作的壓縮處理。

名稱 推出機構 推出時間 目前使用領域
AAC MPEG 1997 流媒體
AC-3 Dolby Inc. 1992 DVD, 數字電視
MP3 MPEG 1993 各個領域(舊)
WMA Microsoft Inc. 1999 Windows

AAC AAC(高階音訊編碼技術 Advanced Audio Coding),出現於1997年,是基於MPEG-2的音訊編碼技術。由Fraunhofer IIS、杜比、蘋果、AT&T、索尼等公司共同開發,以取代mp3格式。2000年,MPEG-4標準出臺,AAC從新整合了其特性,故現又稱MPEG-4 AAC,即m4a。 蘋果的CoreAudio對AAC有較好的支援。

封裝格式

我們常見的視訊格式MP4, AVI, RMVB, 3GP, MKV都是指視訊的封裝格式,大部分情況就是視訊檔案的字尾。常見的組合方式有:

名稱 簡介 常用編碼格式 副檔名
Flash Video 由Adobe Flash延伸出來的的一種流行網路視訊封裝格式。隨著視訊網站的豐富,這個格式已經非常普及。 H.264+MP3 flv
AVI(Audio Video Interleave) 比較早的AVI是微軟開發的。其含義是Audio Video Interactive,就是把視訊和音訊編碼混合在一起儲存。AVI也是最長壽的格式,已經存在10餘年了,雖然釋出過改版(V2.0於1996年釋出),但已顯老態。AVI格式上限制比較多,只能有一個視訊軌道和一個音訊軌道(現在有非標準外掛可加入最多兩個音訊軌道),還可以有一些附加軌道,如文字等。AVI格式不提供任何控制功能。 Xvid+MP3 avi
WMV(Windows Media Video) 同樣是微軟開發的一組數字視訊編解碼格式的通稱,ASF(Advanced Systems Format)是其封裝格式。ASF封裝的WMV檔具有“數字版權保護”功能。 VC-1+WMA wmv/asf
MPEG(Moving Picture Experts Group) 是一個國際標準化組織(ISO)認可的媒體封裝形式,受到大部分機器的支援。其儲存方式多樣,可以適應不同的應用環境。MPEG-4檔的檔容器格式在Part 1(mux)、14(asp)、15(avc)等中規定。MPEG的控制功能豐富,可以有多個視訊(即角度)、音軌、字幕(點陣圖字幕)等等。MPEG的一個簡化版本3GP還廣泛的用於準3G手機上。 H.264+AAC,H263+AAC dat(VCD),vob(DVD), mp4, 3gp
Matroska 是一種新的多媒體封裝格式,這個封裝格式可把多種不同編碼的視訊及16條或以上不同格式的音訊和語言不同的字幕封裝到一個Matroska Media檔內。它也是其中一種開放原始碼的多媒體封裝格式。Matroska同時還可以提供非常好的互動功能,而且比MPEG更方便、強大。 各種編碼格式的組合 mkv
Real Video Real Media(RM) 是由RealNetworks開發的一種檔容器。它通常只能容納Real Video和Real Audio編碼的媒體。該檔帶有一定的互動功能,允許編寫指令碼以控制播放。RM,尤其是可變位元率的RMVB格式,沒有複雜的Profile/Level,製作起來較H.264視訊格式簡單,非常受到網路上傳者的歡迎。此外很多人仍有RMVB體積小高質量的錯誤認知,這個不太正確的觀念也導致很多人傾向使用rmvb,事實上在相同位元速率下,rmvb編碼和H.264這個高度壓縮的視訊編碼相比,體積會較大。 RealVideo+RealAudio rm/rmvb
QuickTime File Format 是由蘋果公司開發的容器。1998年2月11日,國際標準化組織(ISO)認可QuickTime檔案格式作為MPEG-4標準的基礎。QuickTime可儲存的內容相當豐富,除了視訊、音訊以外還可支援圖片、文字(文字字幕)等。 H.264+AAC mov, qt

MP4 mp4格式是H.264編碼指定使用的標準封裝格式,3GP是MP4格式的一種簡化版本,減少了儲存空間和較低的頻寬需求,讓手機上有限的儲存空間可以使用。

實際上這些封裝格式對應的音訊視訊編碼格式也不是固定的,就拿MP4來說,常見的MP4是由H.264+AAC封裝,但是也由Xvid+AAC編碼的可能。如果解碼器不支援Xvid,則可能會出現無法播放,或者播放播放過程有聲音無畫面的情況。

蘋果支援哪些音視訊編碼格式

我們可以在手機介紹介面,找到手機支援的視訊格式iPhone - Compare Models - Apple

這裡我們可以找到對應iPhone7支援的視訊編碼格式:

image.png

Video formats supported: HEVC, H.264, MPEG-4 Part 2, and Motion JPEG

HEVC 又叫H.265,iOS11+A9晶片才開始對HEVC的支援,iPhone6s及以前的裝置不支援HEVC解碼。 音訊格式用紅框標出來了,內容較多,可自行對比。

AVPlayer支援哪些視訊格式

蘋果裝置支援音視訊格式並不是就代表AVPlayer也支援那麼多格式,確定AVPlayer的支援格式,我們可以檢視AVKit中的一個API:

//展示當前支援的音視訊格式
let asset = AVURLAsset.audiovisualTypes()
//列印asset可以得到(已經轉過展示格式)
asset type (
    "audio/aacp",
    "video/3gpp2",
    "audio/mpeg3",
    "audio/mp3",
    "audio/x-caf",
    "audio/mpeg",
    "video/quicktime",
    "audio/x-mpeg3",
    "video/mp4",
    "audio/wav",
    "video/avi",
    "audio/scpls",
    "audio/mp4",
    "audio/x-mpg",
    "video/x-m4v",
    "audio/x-wav",
    "audio/x-aiff",
    "application/vnd.apple.mpegurl",
    "video/3gpp",
    "text/vtt",
    "audio/x-mpeg",
    "audio/wave",
    "audio/x-m4r",
    "audio/x-mp3",
    "audio/AMR",
    "audio/aiff",
    "audio/3gpp2",
    "audio/aac",
    "audio/mpg",
    "audio/mpegurl",
    "audio/x-m4b",
    "application/mp4",
    "audio/x-m4p",
    "audio/x-scpls",
    "audio/x-mpegurl",
    "audio/x-aac",
    "audio/3gpp",
    "audio/basic",
    "audio/x-m4a",
    "application/x-mpegurl"
)
複製程式碼

還有一個方式用來判斷當前格式是否可播:

//An extended MIME type string such as video/3gpp2; codecs="mp4v.20.9, mp4a.E1" or audio/aac; codecs="mp4a.E1".
let playable: Bool = AVURLAsset.isPlayableExtendedMIMEType("video/3gpp2; codecs=\"mp4v.20.9, mp4a.E1\"")
複製程式碼

這裡的MIMEType可以在這裡找到 System-Declared Uniform Type Identifiers

總結 由此我們可以下一個總結,AVPlayer支援的: 視訊編碼格式:H.264、HEVC(iPhone7及以後裝置)、MPEG-4。 視訊格式(封裝格式):.mp4、.mov、.m4v、.3gp、.avi等。 如果想支援更多的視訊格式,可以使用使用第三方的框架,常用的視訊編碼和解碼框架有VLCffmpeg

參考文獻

視訊檔案格式 - 維基百科,自由的百科全書 音訊編碼格式的比較 - 維基百科,自由的百科全書