AVPlayer支援的視訊格式
發現很多人對視訊格式存在一些誤解,之前寫的一篇文章講AVPlayer的支援格式也有一些問題,所以這裡單獨出一篇文章講一下,希望大家能明白。
基本概念
一個線上視訊能夠播放,大致是經過了如下步驟:
可以總結為:拉資料->解協議->解封裝->音視訊解碼->音視訊同步->播放。 下面就針對這幾個概念一一做下解釋:
播放協議
一般點播採用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 | 2013 | 研發中 | |
VP8 | 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支援的視訊編碼格式:
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等。 如果想支援更多的視訊格式,可以使用使用第三方的框架,常用的視訊編碼和解碼框架有VLC和ffmpeg。