video不能播放mp4的問題(一)

最近項目中遇到了video標簽無法播放mp4的問題,表現(xiàn)如下:
  1. IE可正常播放
  2. safari需要點擊兩次可播放
  3. chrome內(nèi)核系列都不能播放
原因排除
  1. 首先,排除掉代碼錯誤:替換其它可播放的mp4文件
  2. 其次,排除路徑錯誤 :F12控制臺查看網(wǎng)絡(luò)請求
  3. 最后,瀏覽器是否支持:網(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)碼(正常播放聲音)

為了排除音頻、視頻組合干擾
需要用到控制變量法:

  1. 音頻不變,視頻轉(zhuǎn)碼
ffmpeg -i input.mp4 -c:a copy output.mp4 //音頻拷貝,視頻轉(zhuǎn)碼
音頻拷貝,視頻轉(zhuǎn)碼(不能播放)
  1. 視頻不變,音頻轉(zhuǎn)碼
ffmpeg -i input.mp4 -c:v copy output.mp4  //音頻轉(zhuǎn)碼,視頻拷貝
音頻轉(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
音頻聲道切換stereo(正常播放聲音)

即使只是重新設(shè)置channel 為1(mono)

ffmpeg -i audio.mp4 -ac 1 audio1.mp4 //音頻聲道重新設(shè)置為mono
音頻聲道切換mono(正常播放聲音)
ffmpeg -i input.mp4 -vcodec h264 output.mp4 //h264默認轉(zhuǎn)碼

h264默認轉(zhuǎn)碼(正常播放)

結(jié)論:這鍋monostereo不背

六、比特率

經(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)驗,不太了解:

  1. 為什么采樣率只能用某些固定的值;
  2. 為什么修改比特率效果不盡理想,只能改成特定的值,
  3. 本例中,采用默認h264轉(zhuǎn)碼后比特率為70,修改比特率后變成14,修改聲道后變成128,這些是否有特定規(guī)律

若有專業(yè)人士看見此文,
望不吝賜教,不勝感激。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容