最近項目中遇到了video標簽無法播放mp4的問題,表現(xiàn)如下:
- IE可正常播放
- safari需要點擊兩次可播放
- chrome內(nèi)核系列都不能播放
原因排除
-
首先,排除掉代碼錯誤:替換其它可播放的mp4文件 -
其次,排除路徑錯誤:F12控制臺查看網(wǎng)絡(luò)請求 -
最后,瀏覽器是否支持:網(wǎng)上查找支持范圍,或在較新版的chrome測試
一、視頻格式
video標簽只支持MPEG4,Ogg,WebM三種視頻格式,各瀏覽器支持如下:
| 格式 | IE | Firefox | Opera | Chrome | Safari |
|---|---|---|---|---|---|
| Ogg | - | 3.5+ | 10.5+ | 5.0+ | - |
| MPEG 4 | 9.0+ | - | - | 5.0+ | 3.0+ |
| WebM | - | 4.0+ | 10.6+ | 6.0+ | - |
二、視頻編碼
其實,上面的三種格式只是封裝格式,并非編碼,而video標簽對編碼也是有要求的:
| 格式 | 視頻編碼 | 音頻編碼 |
|---|---|---|
| Ogg | Theora | Vorbis |
| MPEG 4 | H.264 | AAC |
| WebM | VP8 | Vorbis |
是不是以為找到了問題: 問題mp4肯定不是h264編碼
too naive ?。?! 這么明顯的編碼方式,視頻生成人員怎能不知
三、工具ffmpeg
不知道ffmpeg是什么?
自行搜索
mac下可用homebrew快速安裝:
brew install ffmpeg
ffmpeg也可在node中使用:
npm install ffmpeg //安裝
var ffmpeg = require('ffmpeg');
地址:https://www.npmjs.com/package/ffmpeg
三、查看編碼
ffmpeg -i input.mp4
ffmpeg -i input2.mp4


h264后括號內(nèi)的內(nèi)容不同,是不是覺得已經(jīng)接近真相了
四、AVC編碼
AVC其實就是H.264標準,是由ITU-T和ISO/IEC組成的聯(lián)合視頻組(JVT,Joint Video Team)一起開發(fā)的,ITU-T給這個標準命名為H.264(以前叫做H.26L),而ISO/IEC稱它為MPEG-4 高級視頻編碼(Advanced Video Coding,AVC),它定位于覆蓋整個視頻應(yīng)用領(lǐng)域,包括:低碼率的無線應(yīng)用、標準清晰度和高清晰度的電視廣播應(yīng)用、Internet上的視頻流應(yīng)用,傳輸高清晰度的DVD視頻以及應(yīng)用于數(shù)碼相機的高質(zhì)量視頻應(yīng)用等等。
AVC規(guī)格分為三等,從低到高分別為:Baseline、Main、High。
| 規(guī)格 | 說明 | 用途 |
|---|---|---|
| Baseline(最低Profile) | 級別支持I/P 幀,只支持無交錯(Progressive)和CAVLC | 低階或需要額外容錯的應(yīng)用,比如視頻通話、手機視頻等; |
| Main(主要Profile) | 級別提供I/P/B 幀,支持無交錯(Progressive)和交錯(Interlaced),同樣提供對于CAVLC 和CABAC 的支持 | 主流消費類電子產(chǎn)品規(guī)格如低解碼(相對而言)的mp4、便攜的視頻播放器、PSP和Ipod等 |
| High(高端Profile,也叫FRExt) | 級別在Main的基礎(chǔ)上增加了8x8 內(nèi)部預(yù)測、自定義量化、無損視頻編碼和更多的YUV 格式(如4:4:4) | 用于廣播及視頻碟片存儲(藍光影片),高清電視的應(yīng)用。 |
五、音頻、視頻分離
ffmpeg -i input.mp4 -vcodec copy -an video.mp4 //提取視頻

ffmpeg -i input.mp4 -acodec copy -vn audio.mp4 //提取音頻

ffmpeg -i audio.mp4 -acodec aac audio1.mp4 //音頻轉(zhuǎn)碼

為了排除音頻、視頻組合干擾
需要用到控制變量法:
- 音頻不變,視頻轉(zhuǎn)碼
ffmpeg -i input.mp4 -c:a copy output.mp4 //音頻拷貝,視頻轉(zhuǎn)碼

- 視頻不變,音頻轉(zhuǎn)碼
ffmpeg -i input.mp4 -c:v copy output.mp4 //音頻轉(zhuǎn)碼,視頻拷貝

結(jié)論:音頻才是問題所在
五、mono、stereo
音頻channel(聲道數(shù)):1就是單聲道mono,2就是立體聲stereo,其中單聲道的容量是立體聲的一半。在ffmpeg中可以通過參數(shù)-ac進行設(shè)置
ffmpeg -i input.mp4 -ac 2 -vcodec copy output.mp4 //音頻聲道切換,視頻拷貝

ffmpeg -i audio.mp4 -ac 2 audio1.mp4 //音頻聲道切換stereo

即使只是重新設(shè)置channel 為1(mono)
ffmpeg -i audio.mp4 -ac 1 audio1.mp4 //音頻聲道重新設(shè)置為mono

ffmpeg -i input.mp4 -vcodec h264 output.mp4 //h264默認轉(zhuǎn)碼

結(jié)論:這鍋
mono和stereo不背
六、比特率
經(jīng)過觀察:在所有不可播放的文件中,最后一個紅色標記比特率都是 62 kb/s ,
比特率是指每秒傳送的比特(bit)數(shù)。單位為 bps(Bit Per Second),比特率越高,傳送數(shù)據(jù)速度越快。
聲音中的比特率: 是指將模擬聲音信號轉(zhuǎn)換成數(shù)字聲音信號后,單位時間內(nèi)的二進制數(shù)據(jù)量,是間接衡量音頻質(zhì)量的一個指標。
視頻中的比特率(碼率):原理與聲音中的相同,都是指由模擬信號轉(zhuǎn)換為數(shù)字信號后,單位時間內(nèi)的二進制數(shù)據(jù)量。
ffmpeg -i audio.mp4 -ab 64 audio1.mp4 //修改比特率,無論任何值,最終都是14kb/s

ffmpeg -i audio.mp4 -ar 44100 audio1.mp4 //重置采樣率,只能為某些固定值,最后都是70kb/s

結(jié)論:比特率才是罪魁禍首
七、小結(jié)
實際過程中遇到的mp4文件參數(shù)可能不盡相同,但應(yīng)該都可以通過本文測試方法定位到問題。
由于作者沒有專業(yè)編碼經(jīng)驗,不太了解:
- 為什么采樣率只能用某些固定的值;
- 為什么修改比特率效果不盡理想,只能改成特定的值,
- 本例中,采用默認h264轉(zhuǎn)碼后比特率為70,修改比特率后變成14,修改聲道后變成128,這些是否有特定規(guī)律
若有專業(yè)人士看見此文,
望不吝賜教,不勝感激。