以前壓片玩,用的x264和AAC,到射手網(wǎng)找翻譯的比較好的srt/ssa字幕,矯正時(shí)間線,轉(zhuǎn)成UTF-16,封裝成mkv,然后PT或拷貝給朋友看,很方便。后來(lái)HTML5 video出現(xiàn)了,又去折騰MP4/WebM/Ogg,播放很方便,但沒(méi)有字幕。今天一查,才發(fā)現(xiàn)有了<track>元素可以做字幕,射手網(wǎng)也關(guān)閉了,真是時(shí)光飛逝。H.265和VP9出現(xiàn)了,又可以折騰了。
背景知識(shí):
- .mp4/.mov/.webm/.ogg/.mkv 是文件后綴名,Windows系統(tǒng)需要這個(gè),Linux和macOS不太需要。
- MP4/WebM/Ogg/mkv 是容器,里面含有視頻軌道和音頻軌道,甚至mkv還可以包含字幕和章節(jié)索引。每個(gè)軌道都是一個(gè)單獨(dú)的文件,最后打包變成一個(gè)文件,所以還可以解包變回多個(gè)文件。
- 容器里的視頻和音頻是單獨(dú)制作的,可以使用多種編碼。MP4里的視頻常用的是H.264編碼,現(xiàn)在有了新一代的H.265編碼;MP4里的音頻常用的是AAC-LC、HE-AAC等編碼。WebM里的視頻以前是VP8編碼,現(xiàn)在有了新一代的VP9編碼,音頻是從Vorbis進(jìn)化到了Opus。就算是同一種編碼,也有不同廠商在做,比如H.264的編碼器有開(kāi)源的x264、蘋(píng)果的Quicktime、Nero Digital等等。編碼需要耗費(fèi)CPU和顯卡的性能和時(shí)間,而解碼輕松多了,如果顯卡可以“硬解”,那么CPU占用率很低,否則就是“軟解”,會(huì)占用很多CPU,在插電設(shè)備(比如電腦)上可行(有的同學(xué)為了追求畫(huà)質(zhì)而故意軟解),而在手機(jī)上要綜合考慮,因?yàn)闀?huì)耗電發(fā)熱。在圖片編碼領(lǐng)域,已經(jīng)發(fā)生了類(lèi)似的問(wèn)題:新一代圖片編碼只有Google在做,推出了WebP,Android支持,CPU占用率低,而iOS不支持,iPhone4的CPU占用率略高,但性能隨著摩爾定律提升,目前已經(jīng)不是問(wèn)題了。參考:《WebP 探尋之路- 騰訊ISUX - 社交用戶(hù)體驗(yàn)設(shè)計(jì)》。
為什么有這么多編碼和容器?如果只有一個(gè),就不用選了,多簡(jiǎn)單。
因?yàn)槭袌?chǎng)是開(kāi)放的,競(jìng)爭(zhēng)帶來(lái)進(jìn)步,商業(yè)上一家獨(dú)大可能會(huì)影響創(chuàng)新和消費(fèi)者利益,請(qǐng)看滴滴和Uber合并之后發(fā)生的事……目前看來(lái),MP4和WebM會(huì)持續(xù)競(jìng)爭(zhēng)下去。
音頻視頻解碼技術(shù)的發(fā)展
視頻音頻編碼以前是3個(gè)陣營(yíng):
- MP4(H.264 + HE-AAC)
- WebM(VP8 + Vorbis)
- Ogg(Theora + Vorbis)
現(xiàn)在新一代是2家:
- MP4(H.265 + xHE-AAC)
- WebM(VP9 + Opus)
新一代的技術(shù)進(jìn)步很大,相同畫(huà)質(zhì)時(shí),H.265比H.264小50%,VP9也比VP8小了50%,節(jié)約了空間和流量。如圖(H.265又稱(chēng)為HEVC,H.264又稱(chēng)為AVC。圖片來(lái)自中關(guān)村在線):
技術(shù)選型思路
新技術(shù)優(yōu)勢(shì)巨大,在電腦上可以很快的用上,因?yàn)殚_(kāi)發(fā)軟件/Web網(wǎng)站可以方便的集成庫(kù)/插件,節(jié)約了帶寬,讓網(wǎng)站打開(kāi)快一點(diǎn),用戶(hù)體驗(yàn)更好,但不用的話也問(wèn)題不大,主要是節(jié)約廠商的服務(wù)器帶寬費(fèi)用,很有意義(淘寶把圖片切換成自適應(yīng)webp很多年了,而國(guó)內(nèi)別的網(wǎng)站幾乎沒(méi)有跟進(jìn)的……);喜歡下載視頻的話,可以節(jié)約硬盤(pán)空間。
在手機(jī)上,大部分用戶(hù)都很需要這種新技術(shù),因?yàn)榱髁亢軐氋F總是不夠用,而且蜂窩網(wǎng)絡(luò)環(huán)境不穩(wěn)定(比如地鐵時(shí)常在地下、商場(chǎng)內(nèi)),體積小加載速度快會(huì)讓用戶(hù)體驗(yàn)更好(在蜂窩網(wǎng)絡(luò)很差時(shí),只有微信能收到消息,而別的APP私信聊天都失敗……)。
作為開(kāi)發(fā)者,選型時(shí)要考慮多方面:
按耗電量選型
- 插電設(shè)備(電腦、家用Pad、廣告屏):毫不猶豫的使用最新技術(shù),只要CPU不滿(mǎn)載,能流暢播放即可,不用考慮費(fèi)電問(wèn)題。
- 移動(dòng)設(shè)備(手機(jī)、外勤Pad【比如招商銀行信用卡外勤OA】):在最新技術(shù)省流量 和 費(fèi)電 之間進(jìn)行評(píng)估。集成解碼庫(kù),觀察CPU占用率和幀數(shù),如果卡頓,則說(shuō)明目前還不能使用。
按軟件形態(tài)選型
- 電腦軟件和PC Web:只使用最新技術(shù),如不支持,則集成庫(kù)/插件。
- Mobile Web:同時(shí)使用最新技術(shù)和老技術(shù),同一視頻提供多個(gè)編碼,瀏覽器會(huì)自動(dòng)降級(jí)。注意:APP一般都需要分享,所以都會(huì)有Mobile Web。
- APP:因?yàn)榭梢约蓭?kù),所以?xún)?yōu)先使用新技術(shù),結(jié)合其他策略進(jìn)行選型。
按產(chǎn)品策略選型
- 大視頻APP(不可下載):一般不允許用戶(hù)保存視頻到系統(tǒng)相冊(cè)(版權(quán)問(wèn)題),可緩存到APP的私有數(shù)據(jù),可分享播放頁(yè)面(Web)給他人,而不會(huì)直接傳大文件給他人。所以?xún)?yōu)先使用最新技術(shù)。
- 大視頻APP(可下載):如果允許用戶(hù)保存視頻到系統(tǒng)相冊(cè),則要按照各個(gè)操作系統(tǒng)版本提供不同的格式,比如Android 4.4及以上才可以播放VP9。由于大文件直接分享較困難,所以可假設(shè)用戶(hù)下載是為了自己看,不用考慮VP9視頻發(fā)送給iOS的好友如何播放。
- 小視頻APP(可下載):看產(chǎn)品策略,如果是像表情包一樣,希望用戶(hù)廣泛傳播,則需要保存小視頻到系統(tǒng)相冊(cè),然后微信聊天時(shí)直接發(fā)給他人,則要考慮Android和iOS都能播放的格式。
常用電腦和Android的同學(xué)已經(jīng)習(xí)慣了瀏覽器里看到的任何東西都可以保存,比如圖片/PDF/壓縮包,而iOS不是這樣,幾乎什么都不能下載……所以需要注意的坑是:iOS瀏覽器或APP能否保存視頻到系統(tǒng)相冊(cè)?請(qǐng)看下面的調(diào)研。
Android 和 iOS 對(duì)音頻視頻的支持情況
測(cè)試環(huán)境
Android 6.0.1(錘子手機(jī)M1L)
系統(tǒng)相冊(cè)
Chrome瀏覽器(AppleWebKit/537.36 Chrome/54.0.2840.68)
微信 6.3.28 內(nèi)置瀏覽器——掃一掃和朋友圈內(nèi)嵌打開(kāi)網(wǎng)頁(yè)使用的瀏覽器(AppleWebKit/537.36 Chrome/37.0.0.0)
iOS 10.1.1(iPhone 7 Plus)
系統(tǒng)相冊(cè)
系統(tǒng)自帶Safari瀏覽器(AppleWebKit/602.2.14)
微信 6.3.29 內(nèi)置瀏覽器(AppleWebKit/602.2.14)
測(cè)試結(jié)果
軟件\功能 | 保存圖片到系統(tǒng)相冊(cè) | 保存視頻到系統(tǒng)相冊(cè) |
---|---|---|
Android Chrome | 支持 | 支持 |
Android 微信瀏覽器 | 支持,還能“發(fā)送給朋友” | 支持,彈出安裝QQ瀏覽器,跳轉(zhuǎn)到QQ瀏覽器里下載 |
Android 微信聊天 | 支持 | 支持,長(zhǎng)按可“保存視頻” |
iOS Safari | 支持 | 不支持 |
iOS 微信瀏覽器 | 支持,還能“發(fā)送給朋友” | 不支持 |
iOS 微信聊天 | 支持 | 不支持,長(zhǎng)按可“轉(zhuǎn)發(fā)”和“收藏” |
iOS 微云/有道云 | 支持 | 支持 |
軟件\\功能 | 發(fā)送本地視頻給朋友 |
---|---|
Android 微信聊天 | 支持,只能發(fā)送原始視頻,對(duì)方是iOS的話,有的編碼可以播放,有的無(wú)法播放但可以顯示一個(gè)畫(huà)面預(yù)覽 |
iOS 微信聊天 | 支持,提示進(jìn)行了自動(dòng)壓縮,發(fā)送給Android好友,對(duì)方可以播放 |
軟件\\功能 | 視頻播放情況 |
---|---|
Android 微信聊天 | 收到的視頻會(huì)全屏內(nèi)嵌播放(無(wú)論來(lái)自Android還是iOS,無(wú)論編碼)。自己發(fā)出的視頻,會(huì)彈出選擇播放器。 |
iOS 微信聊天 | 點(diǎn)擊播放會(huì)直接全屏,檢測(cè)編碼,如果微信支持則自動(dòng)內(nèi)嵌播放,如果不支持,則一直停在0秒的預(yù)覽畫(huà)面。 |
軟件\功能 | 發(fā)送本地視頻到朋友圈 |
---|---|
Android 微信朋友圈 | 不支持,只支持“圖片”和微信私有的“小視頻” |
iOS 微信聊天 | 不支持,同上 |
小結(jié):非常慶幸的是iOS可以保存視頻到系統(tǒng)相冊(cè),但由于Safari/微信不支持保存視頻,只能通過(guò)APP實(shí)現(xiàn)。所以如果產(chǎn)品上希望用戶(hù)保存,則APP里開(kāi)發(fā)這個(gè)功能即可,當(dāng)用戶(hù)看到別人分享的頁(yè)面里的視頻有意思,想下載時(shí),需要告訴TA只能通過(guò)APP下載。
Android用戶(hù)看到別人分享的頁(yè)面里的視頻有意思,可以直接下載,然后在微信聊天時(shí)發(fā)出去,對(duì)方可能是iOS,所以視頻一定要按照Android微信和iOS微信都能播放的編碼來(lái)制作。這對(duì)“小視頻APP”的視頻技術(shù)選型產(chǎn)生了巨大的影響。
iOS用戶(hù)微信聊天時(shí)收到有意思的視頻無(wú)法保存,只能收藏和轉(zhuǎn)發(fā),而Android用戶(hù)可以保存,這可能將導(dǎo)致兩個(gè)系統(tǒng)的用戶(hù)愛(ài)好的視頻不一樣,Android用戶(hù)更便于傳播表情包性質(zhì)的搞笑小視頻。
Android 和 iOS 對(duì)音頻視頻解碼的支持情況
軟件\視頻解碼 | H.265 | H.264 | VP9 | VP8 | Theora |
---|---|---|---|---|---|
Android Chrome | 不 | 支持 | 支持 | 支持 | 不 |
Android 微信瀏覽器 | 不 | 支持 | 支持 | 支持 | 支持 |
Android 微信聊天 | 支持 | 支持 | 支持 | 支持 | 不 |
Android 系統(tǒng)相冊(cè) | 支持 | 支持 | 支持 | 支持 | 不 |
Android(應(yīng)與相冊(cè)一致) | 5.0+ | 3.0+ | 4.4+ | 4.3+ | 不 |
iOS Safari | 不 | 支持 | 不 | 不 | 不 |
iOS 微信瀏覽器 | 不 | 支持 | 不 | 不 | 不 |
iOS 微信聊天 | 不 | 支持 | 不 | 不 | 不 |
iOS Facetime編碼解碼 | iPhone 6+ | ||||
iOS 系統(tǒng)相冊(cè) | 不 | 支持 | 不 | 不 | 不 |
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)相冊(cè)都能播放。iOS微信自動(dòng)壓縮后的視頻,在Android和iOS的微信和系統(tǒng)相冊(cè)里都可以播放,那必然是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)相冊(cè)都能播放,在Android微信里可以發(fā)出去,對(duì)方無(wú)論是Android還是iOS都無(wú)法播放,比如 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
對(duì)比如下:
軟件\功能 | 微信聊天能播放的視頻 | 微信聊天不能播放的視頻 |
---|---|---|
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 |
不同的地方太多,需要逐個(gè)排除。難道是微信聊天不支持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
測(cè)試結(jié)果:iOS微信聊天可以播放了,但 General Codec ID 也變了,所以無(wú)法斷定是哪個(gè)問(wèn)題。那再做個(gè) 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
測(cè)試結(jié)果:iOS微信聊天無(wú)法播放。再做個(gè) 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
測(cè)試結(jié)果:Android和iOS的微信聊天都可以播放。
技術(shù)選型結(jié)論
微信聊天時(shí)播放視頻不支持HE-AAC音頻,只支持AAC-LC。所以“小視頻APP(可下載)”的技術(shù)選型也就確定了:只能用 H.264 + AAC-LC。
AAC-LC 和 HE-AAC 的使用場(chǎng)景,請(qǐng)參考 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.
測(cè)試素材
參考資料
- 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
- 再見(jiàn),AVC;你好,HEVC——VCB-Studio關(guān)於全面轉(zhuǎn)型HEVC的決定 vcb-s.com
- 手機(jī)游戲音頻壓縮 gad.qq.com
- xHE-AAC是HE-AAC v2的升級(jí)版本,是MPEG AAC家族系列編解碼器中的最新成員,適用于數(shù)字廣播和低比特率流媒體應(yīng)用。 fraunhofer.de
- iPhone 6支持H.265 將強(qiáng)化蜂窩FaceTime feng.com
- BBC實(shí)測(cè):H.265的確比H.264節(jié)省了50%的碼率 read01.com
- WebP 探尋之路- 騰訊ISUX - 社交用戶(hù)體驗(yàn)設(shè)計(jì) isux.tencent.com
- AAC規(guī)格(LC,HE,HEv2)及性能對(duì)比 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