解決使用mp4v2封裝的mp4文件在Wowza的hls上無法播放問題
一.問題:基于海思35xx的嵌入式設(shè)備使用mp4v2封裝的mp4文件,放在Wowza的點(diǎn)播中,用hls推流出去,無法播放。
二.準(zhǔn)備:由于需要使用了wowza作為推流服務(wù)器。所以嵌入式設(shè)備錄制的mp4文件需要兼容wowza的
rtmp(rtmp://192.168.45.200:1935/vod/sample.mp4)、
rtsp(rtsp://192.168.45.200:1935/vod/sample.mp4)、
hls(http://192.168.45.200:1935/vod/mp4:sample.mp4/playlist.m3u8,蘋果設(shè)備播放所用大都帶m3u8索引)
在測(cè)試間的服務(wù)器(服務(wù)器IP:192.168.45.200)上搭建了wowza(WowzaStreamingEngine-4.3.0-windows),安裝及使用方法參見下面鏈接下載后的附件:
wowza軟件及使用文檔
https://pan.baidu.com/s/1h2js29Onbtce8gmqXlHx8Q
安裝好后,在瀏覽器輸入http://192.168.45.200:8088/? 可以訪問Wowza。
在頁面上點(diǎn)擊 Test Players
會(huì)顯示出:
關(guān)于Apple Hls,在很多電腦的瀏覽器上是不能播放的,因?yàn)椴恢С謍tml5:“HTML5 or HLS is notsupported in this browser”
但可以在手機(jī)上驗(yàn)證這個(gè)mp4文件的hls和rtsp播放效果。點(diǎn)擊Mobile,會(huì)看到生成的兩個(gè)地址。
在Wowza網(wǎng)頁上驗(yàn)證:
rtmp(rtmp://192.168.45.200:1935/vod/sample.mp4)、
在手機(jī)瀏覽器驗(yàn)證:
rtsp(rtsp://192.168.45.200:1935/vod/sample.mp4)、
hls(http://192.168.45.200:1935/vod/mp4:sample.mp4/playlist.m3u8),
如果都都能正常播放,說明這個(gè)視頻沒問題。
這里面的sample.mp4文件所在的服務(wù)器位置是Wowza的安裝位置:
C:Program Files (x86)Wowza Media SystemsWowzaStreaming Engine 4.3.0content
如果需要驗(yàn)證本地生成的文件是否正確,只需要替換這個(gè)sample.mp4即可。
三.分析及解決
將本地的視頻替換sample.mp4后,發(fā)現(xiàn)rtmp、rtsp播放正常,但hls有聲音無視頻,
查看Wowza的log日志發(fā)現(xiàn):
提示:
MediaReaderH264Cupertino.indexFile[vod/_definst_/sample.mp4]:MP4 video sync table [stss] is empty, will not be able to play video track.
①.說文件stss是空的,查看生成mp4的mp4v2庫(kù)源碼,沒找到stss的啟動(dòng)的方法。
查看了(MP4的幾個(gè)概念 https://blog.csdn.net/charleslei/article/details/51084046)。沒有頭緒。
②.網(wǎng)上搜,看到一篇“[html5]解決html5中video標(biāo)簽無法播放mp4問題的辦法_極酷播放器官方網(wǎng)站?http://www.cuplayer.com/player/PlayerCode/Html5/2017/1030/3228.html”
?????? 因?yàn)閷⒈镜劁浿频膍p4用格式工廠轉(zhuǎn)碼后(輸出mp4,輸出的配置選擇AVC高質(zhì)量和大?。琱ls能播放了。所以以為是編碼問題。
?????? 后同事說是封裝問題,因?yàn)樗胿lc對(duì)比了hls能播放的mp4文件和不能播放的mp4文件,發(fā)現(xiàn)兩者的視頻都是h.264編碼,音頻都是aac編碼。所以他猜測(cè)是封裝的格式不一致導(dǎo)致的。
???? 因?yàn)楸镜劁浿频奈募褂胢p4v2庫(kù)是mpeg封裝,而參看“[html5]解決html5中video標(biāo)簽無法播放mp4問題的辦法”說的html5能播放的是H264封裝的文件。原來是我理解錯(cuò)了,mp4v2庫(kù)只是負(fù)責(zé)封裝的一個(gè)工具。
③.后對(duì)比了Wowza的sample.mp4文件和本地錄制的文件(也對(duì)比了格式轉(zhuǎn)換前后的mp4文件),兩者都是mpeg封裝,所以不是封裝的問題。依然需要回歸到iec6000的程序中進(jìn)行追查問題。
④.再次查看"MP4的幾個(gè)概念 - CSDN博客",知道,其實(shí)stss是mp4v2庫(kù)形成mp4文件必選的一個(gè)box。不可能是因?yàn)樯倭藄tss,但絕對(duì)和sync table [stss]有關(guān)系。
?????? 再次回到mp4v2庫(kù)的使用上,看到一個(gè)文章“使用mp4v2將aac音頻h264視頻數(shù)據(jù)封裝成mp4開發(fā)心得https://blog.csdn.net/lh2016rocky/article/details/70882301”。
里面提到MP4WriteSample的isSyncSample?參數(shù),
? ? ??查看iec6000程序的stroage模塊,發(fā)現(xiàn)自己在用此函數(shù)時(shí),沒有考慮的到isSyncSample?參數(shù),所以寫入mp4文件里的視頻幀都標(biāo)記成了關(guān)鍵幀。不清楚是否和hls不能播放本地錄制的文件有關(guān)系。
?????? 嘗試修改了下,將每幀是否關(guān)鍵幀的判斷加上。生成的mp4文件替換到Wowza中,hls可以正常播放。
?
四.備注
本次在網(wǎng)上搜,發(fā)現(xiàn)mp4v2庫(kù)包含封裝和獲取音視頻兩種功能,當(dāng)獲取時(shí),會(huì)用到MP4ReadSample、MP4GetTrackNumberOfSamples等這些函數(shù)。
“MP4V2 判斷幀是否為關(guān)鍵幀 IsSyncSample 異常. - CSDN博客?https://blog.csdn.net/w839687571/article/details/44946571”