發(fā)現(xiàn)很多人對(duì)視頻格式存在一些誤解,之前寫(xiě)的一篇文章講AVPlayer的支持格式也有一些問(wèn)題,所以這里單獨(dú)出一篇文章講一下,希望大家能明白。
基本概念
一個(gè)在線視頻能夠播放,大致是經(jīng)過(guò)了如下步驟:

可以總結(jié)為:拉數(shù)據(jù)->解協(xié)議->解封裝->音視頻解碼->音視頻同步->播放。
下面就針對(duì)這幾個(gè)概念一一做下解釋:
播放協(xié)議
一般點(diǎn)播采用HTTP,而直播的話,大部分還是采用RTMP或者私有協(xié)議,原因是延時(shí)會(huì)比較小,RTMP本身也是為了直播設(shè)計(jì)的。常見(jiàn)的流媒體協(xié)議:
| 簡(jiǎn)寫(xiě) | 全稱 | 推出機(jī)構(gòu) | 目前使用領(lǐng)域 |
|---|---|---|---|
| HLS | HTTP Live Streaming | 蘋(píng)果 | 多應(yīng)用于蘋(píng)果 |
| RTP | 實(shí)時(shí)傳輸協(xié)議 | IETF | 范圍較廣 |
| RTCP | 實(shí)時(shí)傳輸控制協(xié)議 | IETF | 范圍較廣 |
| RTSP | 實(shí)時(shí)串流協(xié)議 | RealNetworks等 | 范圍較廣 |
| RTMP | 實(shí)時(shí)消息協(xié)議 | Adobe | 較流行 |
| MMS | 串流媒體協(xié)議 | Microsoft | 范圍較廣 |
RTP/RTSP/RTCP的區(qū)別
RTSP發(fā)起/終結(jié)流媒體、RTP傳輸流媒體數(shù)據(jù) 、RTCP對(duì)RTP進(jìn)行控制,同步。
HLS(Http Live Streaming)
HLS是蘋(píng)果推出,實(shí)現(xiàn)的基于HTTP的流媒體傳輸協(xié)議:
優(yōu)點(diǎn):
1、通過(guò)m3u8索引文件可實(shí)現(xiàn)針對(duì)當(dāng)前瀏覽設(shè)備的智能選擇播放源,
2、通過(guò)m3u8索引文件可實(shí)現(xiàn)添加備份索引文件,防止服務(wù)器崩潰視頻播放失敗
3、和http視頻一樣 不需要太多服務(wù)器額外配置
缺點(diǎn):
1、并非真正實(shí)時(shí)視頻,30s左右時(shí)間差
2、需要視頻處理
3、因?yàn)樾枰?qǐng)求索引文件(ts視頻文件)請(qǐng)求次數(shù)相對(duì)較多,對(duì)服務(wù)器負(fù)載較大
視頻編碼
所謂視頻編碼方式就是指通過(guò)特定的壓縮技術(shù),將某個(gè)視頻格式的文件轉(zhuǎn)換成另一種視頻格式文件的方式。它是一種為了減少視頻體積,同時(shí)保證畫(huà)面質(zhì)量的壓縮技術(shù),常見(jiàn)的視頻編碼有:
| 名稱 | 推出機(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ù)字電視 |
| XviD | OpenDivX | 2002 | 流行 |
| VP9 | 2013 | 研發(fā)中 | |
| VP8 | 2008 | 不普及 | |
| VC-1 | Microsoft Inc. | 2006 | 微軟 |
H.264
H.264又叫AVC,是國(guó)際標(biāo)準(zhǔn)化組織(ISO)和國(guó)際電信聯(lián)盟(ITU)共同提出的繼MPEG4之后的新一代數(shù)字視頻壓縮格式,它集合了H.263和MPEG4的優(yōu)點(diǎn),擁有更高的數(shù)據(jù)壓縮比。在同等的圖像質(zhì)量條件下,H.264的數(shù)據(jù)壓縮比能比H.263高2倍,比MPEG-4高1.5倍。
也是目前蘋(píng)果支持最好的編碼格式。
音頻編碼
和視頻編碼類似,音頻編碼的作用是減少音頻中的冗余,同時(shí)在保證一定音頻質(zhì)量的條件下作的壓縮處理。
| 名稱 | 推出機(jī)構(gòu) | 推出時(shí)間 | 目前使用領(lǐng)域 |
|---|---|---|---|
| AAC | MPEG | 1997 | 流媒體 |
| AC-3 | Dolby Inc. | 1992 | DVD, 數(shù)字電視 |
| MP3 | MPEG | 1993 | 各個(gè)領(lǐng)域(舊) |
| WMA | Microsoft Inc. | 1999 | Windows |
AAC
AAC(高級(jí)音頻編碼技術(shù) Advanced Audio Coding),出現(xiàn)于1997年,是基于MPEG-2的音頻編碼技術(shù)。由Fraunhofer IIS、杜比、蘋(píng)果、AT&T、索尼等公司共同開(kāi)發(fā),以取代mp3格式。2000年,MPEG-4標(biāo)準(zhǔn)出臺(tái),AAC從新整合了其特性,故現(xiàn)又稱MPEG-4 AAC,即m4a。
蘋(píng)果的CoreAudio對(duì)AAC有較好的支持。
封裝格式
我們常見(jiàn)的視頻格式MP4, AVI, RMVB, 3GP, MKV都是指視頻的封裝格式,大部分情況就是視頻文件的后綴。常見(jiàn)的組合方式有:
| 名稱 | 簡(jiǎn)介 | 常用編碼格式 | 擴(kuò)展名 |
|---|---|---|---|
| Flash Video | 由Adobe Flash延伸出來(lái)的的一種流行網(wǎng)絡(luò)視頻封裝格式。隨著視頻網(wǎng)站的豐富,這個(gè)格式已經(jīng)非常普及。 | H.264+MP3 | flv |
| AVI(Audio Video Interleave) | 比較早的AVI是微軟開(kāi)發(fā)的。其含義是Audio Video Interactive,就是把視頻和音頻編碼混合在一起存儲(chǔ)。AVI也是最長(zhǎng)壽的格式,已經(jīng)存在10余年了,雖然發(fā)布過(guò)改版(V2.0于1996年發(fā)布),但已顯老態(tài)。AVI格式上限制比較多,只能有一個(gè)視頻軌道和一個(gè)音頻軌道(現(xiàn)在有非標(biāo)準(zhǔn)插件可加入最多兩個(gè)音頻軌道),還可以有一些附加軌道,如文字等。AVI格式不提供任何控制功能。 | Xvid+MP3 | avi |
| WMV(Windows Media Video) | 同樣是微軟開(kāi)發(fā)的一組數(shù)字視頻編解碼格式的通稱,ASF(Advanced Systems Format)是其封裝格式。ASF封裝的WMV檔具有“數(shù)字版權(quán)保護(hù)”功能。 | VC-1+WMA | wmv/asf |
| MPEG(Moving Picture Experts Group) | 是一個(gè)國(guó)際標(biāo)準(zhǔn)化組織(ISO)認(rèn)可的媒體封裝形式,受到大部分機(jī)器的支持。其存儲(chǔ)方式多樣,可以適應(yīng)不同的應(yīng)用環(huán)境。MPEG-4檔的檔容器格式在Part 1(mux)、14(asp)、15(avc)等中規(guī)定。MPEG的控制功能豐富,可以有多個(gè)視頻(即角度)、音軌、字幕(位圖字幕)等等。MPEG的一個(gè)簡(jiǎn)化版本3GP還廣泛的用于準(zhǔn)3G手機(jī)上。 | H.264+AAC,H263+AAC | dat(VCD),vob(DVD), mp4, 3gp |
| Matroska | 是一種新的多媒體封裝格式,這個(gè)封裝格式可把多種不同編碼的視頻及16條或以上不同格式的音頻和語(yǔ)言不同的字幕封裝到一個(gè)Matroska Media檔內(nèi)。它也是其中一種開(kāi)放源代碼的多媒體封裝格式。Matroska同時(shí)還可以提供非常好的交互功能,而且比MPEG更方便、強(qiáng)大。 | 各種編碼格式的組合 | mkv |
| Real Video Real Media(RM) | 是由RealNetworks開(kāi)發(fā)的一種檔容器。它通常只能容納Real Video和Real Audio編碼的媒體。該檔帶有一定的交互功能,允許編寫(xiě)腳本以控制播放。RM,尤其是可變比特率的RMVB格式,沒(méi)有復(fù)雜的Profile/Level,制作起來(lái)較H.264視頻格式簡(jiǎn)單,非常受到網(wǎng)絡(luò)上傳者的歡迎。此外很多人仍有RMVB體積小高質(zhì)量的錯(cuò)誤認(rèn)知,這個(gè)不太正確的觀念也導(dǎo)致很多人傾向使用rmvb,事實(shí)上在相同碼率下,rmvb編碼和H.264這個(gè)高度壓縮的視頻編碼相比,體積會(huì)較大。 | RealVideo+RealAudio | rm/rmvb |
| QuickTime File Format | 是由蘋(píng)果公司開(kāi)發(fā)的容器。1998年2月11日,國(guó)際標(biāo)準(zhǔn)化組織(ISO)認(rèn)可QuickTime文件格式作為MPEG-4標(biāo)準(zhǔn)的基礎(chǔ)。QuickTime可存儲(chǔ)的內(nèi)容相當(dāng)豐富,除了視頻、音頻以外還可支持圖片、文字(文本字幕)等。 | H.264+AAC | mov, qt |
MP4
mp4格式是H.264編碼指定使用的標(biāo)準(zhǔn)封裝格式,3GP是MP4格式的一種簡(jiǎn)化版本,減少了儲(chǔ)存空間和較低的頻寬需求,讓手機(jī)上有限的儲(chǔ)存空間可以使用。
實(shí)際上這些封裝格式對(duì)應(yīng)的音頻視頻編碼格式也不是固定的,就拿MP4來(lái)說(shuō),常見(jiàn)的MP4是由H.264+AAC封裝,但是也由Xvid+AAC編碼的可能。如果解碼器不支持Xvid,則可能會(huì)出現(xiàn)無(wú)法播放,或者播放播放過(guò)程有聲音無(wú)畫(huà)面的情況。
蘋(píng)果支持哪些音視頻編碼格式
我們可以在手機(jī)介紹界面,找到手機(jī)支持的視頻格式iPhone - Compare Models - Apple
這里我們可以找到對(duì)應(yīng)iPhone7支持的視頻編碼格式:

Video formats supported: HEVC, H.264, MPEG-4 Part 2, and Motion JPEG
HEVC
又叫H.265,iOS11+A9芯片才開(kāi)始對(duì)HEVC的支持,iPhone6s及以前的設(shè)備不支持HEVC解碼。
音頻格式用紅框標(biāo)出來(lái)了,內(nèi)容較多,可自行對(duì)比。
AVPlayer支持哪些視頻格式
蘋(píng)果設(shè)備支持音視頻格式并不是就代表AVPlayer也支持那么多格式,確定AVPlayer的支持格式,我們可以查看AVKit中的一個(gè)API:
//展示當(dāng)前支持的音視頻格式
let asset = AVURLAsset.audiovisualTypes()
//打印asset可以得到(已經(jīng)轉(zhuǎn)過(guò)展示格式)
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"
)
還有一個(gè)方式用來(lái)判斷當(dāng)前格式是否可播:
//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
總結(jié)
由此我們可以下一個(gè)總結(jié),AVPlayer支持的:
視頻編碼格式:H.264、HEVC(iPhone7及以后設(shè)備)、MPEG-4。
視頻格式(封裝格式):.mp4、.mov、.m4v、.3gp、.avi等。
如果想支持更多的視頻格式,可以使用使用第三方的框架,常用的視頻編碼和解碼框架有VLC和ffmpeg。