以前壓片玩距糖,用的x264和AAC玄窝,到射手網(wǎng)找翻譯的比較好的srt/ssa字幕,矯正時間線悍引,轉(zhuǎn)成UTF-16恩脂,封裝成mkv,然后PT或拷貝給朋友看趣斤,很方便俩块。后來HTML5 video出現(xiàn)了,又去折騰MP4/WebM/Ogg浓领,播放很方便玉凯,但沒有字幕。今天一查联贩,才發(fā)現(xiàn)有了<track>元素可以做字幕漫仆,射手網(wǎng)也關(guān)閉了,真是時光飛逝撑蒜。H.265和VP9出現(xiàn)了歹啼,又可以折騰了玄渗。
背景知識:
- .mp4/.mov/.webm/.ogg/.mkv 是文件后綴名座菠,Windows系統(tǒng)需要這個,Linux和macOS不太需要藤树。
- MP4/WebM/Ogg/mkv 是容器浴滴,里面含有視頻軌道和音頻軌道,甚至mkv還可以包含字幕和章節(jié)索引岁钓。每個軌道都是一個單獨的文件升略,最后打包變成一個文件,所以還可以解包變回多個文件屡限。
- 容器里的視頻和音頻是單獨制作的品嚣,可以使用多種編碼。MP4里的視頻常用的是H.264編碼钧大,現(xiàn)在有了新一代的H.265編碼翰撑;MP4里的音頻常用的是AAC-LC、HE-AAC等編碼啊央。WebM里的視頻以前是VP8編碼眶诈,現(xiàn)在有了新一代的VP9編碼涨醋,音頻是從Vorbis進化到了Opus。就算是同一種編碼逝撬,也有不同廠商在做浴骂,比如H.264的編碼器有開源的x264、蘋果的Quicktime宪潮、Nero Digital等等貌亭。編碼需要耗費CPU和顯卡的性能和時間,而解碼輕松多了叠洗,如果顯卡可以“硬解”禁舷,那么CPU占用率很低,否則就是“軟解”谣光,會占用很多CPU檩淋,在插電設(shè)備(比如電腦)上可行(有的同學(xué)為了追求畫質(zhì)而故意軟解),而在手機上要綜合考慮萄金,因為會耗電發(fā)熱蟀悦。在圖片編碼領(lǐng)域,已經(jīng)發(fā)生了類似的問題:新一代圖片編碼只有Google在做氧敢,推出了WebP日戈,Android支持,CPU占用率低孙乖,而iOS不支持浙炼,iPhone4的CPU占用率略高,但性能隨著摩爾定律提升唯袄,目前已經(jīng)不是問題了弯屈。參考:《WebP 探尋之路- 騰訊ISUX - 社交用戶體驗設(shè)計》。
為什么有這么多編碼和容器恋拷?如果只有一個资厉,就不用選了,多簡單蔬顾。
因為市場是開放的宴偿,競爭帶來進步,商業(yè)上一家獨大可能會影響創(chuàng)新和消費者利益诀豁,請看滴滴和Uber合并之后發(fā)生的事……目前看來窄刘,MP4和WebM會持續(xù)競爭下去。
音頻視頻解碼技術(shù)的發(fā)展
視頻音頻編碼以前是3個陣營:
- MP4(H.264 + HE-AAC)
- WebM(VP8 + Vorbis)
- Ogg(Theora + Vorbis)
現(xiàn)在新一代是2家:
- MP4(H.265 + xHE-AAC)
- WebM(VP9 + Opus)
新一代的技術(shù)進步很大舷胜,相同畫質(zhì)時娩践,H.265比H.264小50%,VP9也比VP8小了50%,節(jié)約了空間和流量欺矫。如圖(H.265又稱為HEVC纱新,H.264又稱為AVC。圖片來自中關(guān)村在線):
技術(shù)選型思路
新技術(shù)優(yōu)勢巨大络它,在電腦上可以很快的用上族檬,因為開發(fā)軟件/Web網(wǎng)站可以方便的集成庫/插件,節(jié)約了帶寬化戳,讓網(wǎng)站打開快一點单料,用戶體驗更好,但不用的話也問題不大点楼,主要是節(jié)約廠商的服務(wù)器帶寬費用扫尖,很有意義(淘寶把圖片切換成自適應(yīng)webp很多年了,而國內(nèi)別的網(wǎng)站幾乎沒有跟進的……)掠廓;喜歡下載視頻的話换怖,可以節(jié)約硬盤空間。
在手機上蟀瞧,大部分用戶都很需要這種新技術(shù)沉颂,因為流量很寶貴總是不夠用,而且蜂窩網(wǎng)絡(luò)環(huán)境不穩(wěn)定(比如地鐵時常在地下悦污、商場內(nèi))铸屉,體積小加載速度快會讓用戶體驗更好(在蜂窩網(wǎng)絡(luò)很差時,只有微信能收到消息塞关,而別的APP私信聊天都失敗……)抬探。
作為開發(fā)者子巾,選型時要考慮多方面:
按耗電量選型
- 插電設(shè)備(電腦帆赢、家用Pad、廣告屏):毫不猶豫的使用最新技術(shù)线梗,只要CPU不滿載椰于,能流暢播放即可,不用考慮費電問題仪搔。
- 移動設(shè)備(手機瘾婿、外勤Pad【比如招商銀行信用卡外勤OA】):在最新技術(shù)省流量 和 費電 之間進行評估。集成解碼庫,觀察CPU占用率和幀數(shù)偏陪,如果卡頓抢呆,則說明目前還不能使用。
按軟件形態(tài)選型
- 電腦軟件和PC Web:只使用最新技術(shù)笛谦,如不支持抱虐,則集成庫/插件。
- Mobile Web:同時使用最新技術(shù)和老技術(shù)饥脑,同一視頻提供多個編碼恳邀,瀏覽器會自動降級。注意:APP一般都需要分享灶轰,所以都會有Mobile Web谣沸。
- APP:因為可以集成庫,所以優(yōu)先使用新技術(shù)笋颤,結(jié)合其他策略進行選型乳附。
按產(chǎn)品策略選型
- 大視頻APP(不可下載):一般不允許用戶保存視頻到系統(tǒng)相冊(版權(quán)問題),可緩存到APP的私有數(shù)據(jù)伴澄,可分享播放頁面(Web)給他人许溅,而不會直接傳大文件給他人。所以優(yōu)先使用最新技術(shù)秉版。
- 大視頻APP(可下載):如果允許用戶保存視頻到系統(tǒng)相冊贤重,則要按照各個操作系統(tǒng)版本提供不同的格式,比如Android 4.4及以上才可以播放VP9清焕。由于大文件直接分享較困難并蝗,所以可假設(shè)用戶下載是為了自己看,不用考慮VP9視頻發(fā)送給iOS的好友如何播放秸妥。
- 小視頻APP(可下載):看產(chǎn)品策略滚停,如果是像表情包一樣,希望用戶廣泛傳播粥惧,則需要保存小視頻到系統(tǒng)相冊键畴,然后微信聊天時直接發(fā)給他人,則要考慮Android和iOS都能播放的格式突雪。
常用電腦和Android的同學(xué)已經(jīng)習(xí)慣了瀏覽器里看到的任何東西都可以保存起惕,比如圖片/PDF/壓縮包,而iOS不是這樣咏删,幾乎什么都不能下載……所以需要注意的坑是:iOS瀏覽器或APP能否保存視頻到系統(tǒng)相冊惹想?請看下面的調(diào)研。
Android 和 iOS 對音頻視頻的支持情況
測試環(huán)境
Android 6.0.1(錘子手機M1L)
系統(tǒng)相冊
Chrome瀏覽器(AppleWebKit/537.36 Chrome/54.0.2840.68)
微信 6.3.28 內(nèi)置瀏覽器——掃一掃和朋友圈內(nèi)嵌打開網(wǎng)頁使用的瀏覽器(AppleWebKit/537.36 Chrome/37.0.0.0)
iOS 10.1.1(iPhone 7 Plus)
系統(tǒng)相冊
系統(tǒng)自帶Safari瀏覽器(AppleWebKit/602.2.14)
微信 6.3.29 內(nèi)置瀏覽器(AppleWebKit/602.2.14)
測試結(jié)果
軟件\功能 | 保存圖片到系統(tǒng)相冊 | 保存視頻到系統(tǒng)相冊 |
---|---|---|
Android Chrome | 支持 | 支持 |
Android 微信瀏覽器 | 支持督函,還能“發(fā)送給朋友” | 支持嘀粱,彈出安裝QQ瀏覽器激挪,跳轉(zhuǎn)到QQ瀏覽器里下載 |
Android 微信聊天 | 支持 | 支持,長按可“保存視頻” |
iOS Safari | 支持 | 不支持 |
iOS 微信瀏覽器 | 支持锋叨,還能“發(fā)送給朋友” | 不支持 |
iOS 微信聊天 | 支持 | 不支持垄分,長按可“轉(zhuǎn)發(fā)”和“收藏” |
iOS 微云/有道云 | 支持 | 支持 |
軟件\\功能 | 發(fā)送本地視頻給朋友 |
---|---|
Android 微信聊天 | 支持,只能發(fā)送原始視頻娃磺,對方是iOS的話锋喜,有的編碼可以播放,有的無法播放但可以顯示一個畫面預(yù)覽 |
iOS 微信聊天 | 支持豌鸡,提示進行了自動壓縮嘿般,發(fā)送給Android好友,對方可以播放 |
軟件\\功能 | 視頻播放情況 |
---|---|
Android 微信聊天 | 收到的視頻會全屏內(nèi)嵌播放(無論來自Android還是iOS炉奴,無論編碼)。自己發(fā)出的視頻蛇更,會彈出選擇播放器瞻赶。 |
iOS 微信聊天 | 點擊播放會直接全屏,檢測編碼派任,如果微信支持則自動內(nèi)嵌播放砸逊,如果不支持,則一直停在0秒的預(yù)覽畫面掌逛。 |
軟件\功能 | 發(fā)送本地視頻到朋友圈 |
---|---|
Android 微信朋友圈 | 不支持篓像,只支持“圖片”和微信私有的“小視頻” |
iOS 微信聊天 | 不支持,同上 |
小結(jié):非常慶幸的是iOS可以保存視頻到系統(tǒng)相冊皿伺,但由于Safari/微信不支持保存視頻员辩,只能通過APP實現(xiàn)。所以如果產(chǎn)品上希望用戶保存鸵鸥,則APP里開發(fā)這個功能即可奠滑,當(dāng)用戶看到別人分享的頁面里的視頻有意思,想下載時妒穴,需要告訴TA只能通過APP下載宋税。
Android用戶看到別人分享的頁面里的視頻有意思,可以直接下載宰翅,然后在微信聊天時發(fā)出去弃甥,對方可能是iOS爽室,所以視頻一定要按照Android微信和iOS微信都能播放的編碼來制作汁讼。這對“小視頻APP”的視頻技術(shù)選型產(chǎn)生了巨大的影響淆攻。
iOS用戶微信聊天時收到有意思的視頻無法保存,只能收藏和轉(zhuǎn)發(fā)嘿架,而Android用戶可以保存瓶珊,這可能將導(dǎo)致兩個系統(tǒng)的用戶愛好的視頻不一樣,Android用戶更便于傳播表情包性質(zhì)的搞笑小視頻耸彪。
Android 和 iOS 對音頻視頻解碼的支持情況
軟件\視頻解碼 | H.265 | H.264 | VP9 | VP8 | Theora |
---|---|---|---|---|---|
Android Chrome | 不 | 支持 | 支持 | 支持 | 不 |
Android 微信瀏覽器 | 不 | 支持 | 支持 | 支持 | 支持 |
Android 微信聊天 | 支持 | 支持 | 支持 | 支持 | 不 |
Android 系統(tǒng)相冊 | 支持 | 支持 | 支持 | 支持 | 不 |
Android(應(yīng)與相冊一致) | 5.0+ | 3.0+ | 4.4+ | 4.3+ | 不 |
iOS Safari | 不 | 支持 | 不 | 不 | 不 |
iOS 微信瀏覽器 | 不 | 支持 | 不 | 不 | 不 |
iOS 微信聊天 | 不 | 支持 | 不 | 不 | 不 |
iOS Facetime編碼解碼 | iPhone 6+ | ||||
iOS 系統(tǒng)相冊 | 不 | 支持 | 不 | 不 | 不 |
iOS 微云播放器 | 支持 | 支持 | 支持 | 支持 | 不 |
軟件\音頻解碼 | xHE-AAC| HE-AAC | AAC-LC | MP3 | Opus | Vorbis |
-------------------|----------|--------|-------|-------|----------
Android Chrome | todo | 支持 | 支持 | 支持 | 支持 | 支持
Android 微信瀏覽器 | todo | 支持 | 支持 | 支持 | 不 | 支持
Android | todo | 支持 | 支持 | 支持 | 不 | 不
iOS Safari | todo | 支持 | 支持 | 支持 | 不 | 不
iOS 微信瀏覽器 | todo | 支持 | 支持 | 支持 | 不 | 不
iOS | todo | 4+ | 支持 | 支持 | 不 | 不
可以看到H.264 + AAC最通用伞芹,瀏覽器和系統(tǒng)相冊都能播放。iOS微信自動壓縮后的視頻蝉娜,在Android和iOS的微信和系統(tǒng)相冊里都可以播放唱较,那必然是H.264 + AAC了。下載 MPEG-4-mp42--AVC-Main-L3-avc1--AAC-LC-40.mp4召川,用 mediainfo 分析一下就知:
$ mediainfo Videos/MPEG-4-mp42--AVC-Main-L3-avc1--AAC-LC-40.mp4
General
Complete name : Videos/MPEG-4-mp42--AVC-Main-L3-avc1--AAC-LC-40.mp4
Format : MPEG-4
Format profile : Base Media / Version 2
Codec ID : mp42 (mp41/mp42/isom)
File size : 1.39 MiB
Duration : 14s 850ms
Overall bit rate mode : Variable
Overall bit rate : 785 Kbps
Encoded date : UTC 2016-11-04 04:29:35
Tagged date : UTC 2016-11-04 04:29:35
Video
ID : 2
Format : AVC
Format/Info : Advanced Video Codec
Format profile : Main@L3
Format settings, CABAC : Yes
Format settings, ReFrames : 2 frames
Format settings, GOP : M=1, N=15
Codec ID : avc1
Codec ID/Info : Advanced Video Coding
Duration : 14s 850ms
Bit rate : 716 Kbps
Width : 480 pixels
Height : 480 pixels
Display aspect ratio : 1.000
Frame rate mode : Variable
Frame rate : 18.047 fps
Minimum frame rate : 6.667 fps
Maximum frame rate : 20.000 fps
Color space : YUV
Chroma subsampling : 4:2:0
Bit depth : 8 bits
Scan type : Progressive
Bits/(Pixel*Frame) : 0.172
Stream size : 1.27 MiB (91%)
Title : Core Media Video
Encoded date : UTC 2016-11-04 04:29:35
Tagged date : UTC 2016-11-04 04:29:35
Color range : Limited
Color primaries : BT.601 NTSC
Transfer characteristics : BT.709
Matrix coefficients : BT.601
Audio
ID : 1
Format : AAC
Format/Info : Advanced Audio Codec
Format profile : LC
Codec ID : 40
Duration : 14s 790ms
Source duration : 14s 838ms
Bit rate mode : Variable
Bit rate : 64.2 Kbps
Maximum bit rate : 76.1 Kbps
Channel(s) : 2 channels
Channel(s)_Original : 1 channel
Channel positions : Front: C
Sampling rate : 44.1 KHz
Frame rate : 43.066 fps (1024 spf)
Compression mode : Lossy
Stream size : 116 KiB (8%)
Source stream size : 116 KiB (8%)
Title : Core Media Audio
Encoded date : UTC 2016-11-04 04:29:35
Tagged date : UTC 2016-11-04 04:29:35
但有些H.264 + AAC的視頻在Android和iOS的瀏覽器和系統(tǒng)相冊都能播放南缓,在Android微信里可以發(fā)出去,對方無論是Android還是iOS都無法播放荧呐,比如 MPEG-4-JVT-avc1--AVC-Main-L3.1-avc1--HE-AAC-40--ChID-BLITS-EBU.mp4汉形,用 mediainfo 分析結(jié)果如下:
$ mediainfo Videos/MPEG-4-JVT-avc1--AVC-Main-L3.1-avc1--HE-AAC-40--ChID-BLITS-EBU.mp4
General
Complete name : Videos/MPEG-4-JVT-avc1--AVC-Main-L3.1-avc1--HE-AAC-40--ChID-BLITS-EBU.mp4
Format : MPEG-4
Format profile : JVT
Codec ID : avc1 (isom/avc1)
Overall bit rate mode : Variable
Overall bit rate : 189 Kbps
Video
ID : 1
Format : AVC
Format/Info : Advanced Video Codec
Format profile : Main@L3.1
Format settings, CABAC : Yes
Format settings, ReFrames : 4 frames
Codec ID : avc1
Codec ID/Info : Advanced Video Coding
Audio
ID : 2
Format : AAC
Format/Info : Advanced Audio Codec
Format profile : HE-AAC / LC
Codec ID : 40
Bit rate mode : Variable
Bit rate : 160 Kbps
Channel(s) : 2 channels
Channel(s)_Original : 6 channels
Channel positions : Front: L C R, Side: L R, LFE
對比如下:
軟件\功能 | 微信聊天能播放的視頻 | 微信聊天不能播放的視頻 |
---|---|---|
General Format | MPEG-4 | MPEG-4 |
General Format profile | Base Media / Version 2 | JVT |
General Codec ID | mp42 | avc1 |
Video Format | AVC | AVC |
Video Format profile | Main@L3 | Main@L3.1 |
Video Codec ID | avc1 | avc1 |
Audio Format | AAC | AAC |
Audio Format profile | LC | HE-AAC / LC |
Audio Codec ID | 40 | 40 |
不同的地方太多,需要逐個排除倍阐。難道是微信聊天不支持HE-AAC概疆?那把音頻刪除試試:no-audio.mp4。
$ ffmpeg -i Videos/MPEG-4-JVT-avc1--AVC-Main-L3.1-avc1--HE-AAC-40--ChID-BLITS-EBU.mp4 -vcodec copy -an no-audio.mp4
$ mediainfo no-audio.mp4
General
Complete name : no-audio.mp4
Format : MPEG-4
Format profile : Base Media
Codec ID : isom (isom/iso2/avc1/mp41)
File size : 157 KiB
Video
ID : 1
Format : AVC
Format/Info : Advanced Video Codec
Format profile : Main@L3.1
Format settings, CABAC : Yes
Format settings, ReFrames : 4 frames
Codec ID : avc1
測試結(jié)果:iOS微信聊天可以播放了峰搪,但 General Codec ID 也變了岔冀,所以無法斷定是哪個問題。那再做個 isom + HE-AAC 的視頻試試:isom.mp4概耻。
ffmpeg -i Videos/MPEG-4-JVT-avc1--AVC-Main-L3.1-avc1--HE-AAC-40--ChID-BLITS-EBU.mp4 -vcodec copy -acodec copy isom.mp4
測試結(jié)果:iOS微信聊天無法播放楣颠。再做個 isom + AAC 的視頻試試:aac.mp4。
ffmpeg -i Videos/MPEG-4-JVT-avc1--AVC-Main-L3.1-avc1--HE-AAC-40--ChID-BLITS-EBU.mp4 -vcodec copy -acodec aac -strict -2 aac.mp4
測試結(jié)果:Android和iOS的微信聊天都可以播放咐蚯。
技術(shù)選型結(jié)論
微信聊天時播放視頻不支持HE-AAC音頻童漩,只支持AAC-LC。所以“小視頻APP(可下載)”的技術(shù)選型也就確定了:只能用 H.264 + AAC-LC春锋。
AAC-LC 和 HE-AAC 的使用場景矫膨,請參考 Apple文檔:
- HE-AAC v2 for lower bitrates between 16 - 40 kb/s.
- HE-AAC v1 for bitrates between 32 - 80 kb/s.
- AAC-LC for bitrates higher than 80 kb/s.
測試素材
參考資料
- xHE-AAC和H.265將成為下一代的主流編解碼技術(shù) read01.com
- iTunes 9.2 and iOS 4 include full decoding of HE-AAC v2 parametric stereo streams. en.wikipedia.org
- Android Supported Media Formats android.com
- 再見侧馅,AVC;你好呐萌,HEVC——VCB-Studio關(guān)於全面轉(zhuǎn)型HEVC的決定 vcb-s.com
- 手機游戲音頻壓縮 gad.qq.com
- xHE-AAC是HE-AAC v2的升級版本馁痴,是MPEG AAC家族系列編解碼器中的最新成員,適用于數(shù)字廣播和低比特率流媒體應(yīng)用肺孤。 fraunhofer.de
- iPhone 6支持H.265 將強化蜂窩FaceTime feng.com
- BBC實測:H.265的確比H.264節(jié)省了50%的碼率 read01.com
- WebP 探尋之路- 騰訊ISUX - 社交用戶體驗設(shè)計 isux.tencent.com
- AAC規(guī)格(LC罗晕,HE济欢,HEv2)及性能對比 blog.csdn.net
- AAC (Main only, not AAC-LC, AAC-SSR, HE-AAC) chromium.org
- Supported Media for Google Cast developers.google.com
本文已遷移至我的GitHub博客:https://sinkcup.github.io/android-ios-h265-vp9