解決使用mp4v2封裝的mp4文件在Wowza的hls上無法播放問題


一.問題:基於海思35xx的嵌入式設備使用mp4v2封裝的mp4文件,放在Wowza的點播中,用hls推流出去,無法播放。

二.準備:由於需要使用了wowza作爲推流服務器。所以嵌入式設備錄製的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,蘋果設備播放所用大都帶m3u8索引)

在測試間的服務器(服務器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

在頁面上點擊 Test Players

會顯示出:



關於Apple Hls,在很多電腦的瀏覽器上是不能播放的,因爲不支持html5:“HTML5 or HLS is notsupported in this browser”

但可以在手機上驗證這個mp4文件的hls和rtsp播放效果。點擊Mobile,會看到生成的兩個地址。

在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),

如果都都能正常播放,說明這個視頻沒問題。



這裏面的sample.mp4文件所在的服務器位置是Wowza的安裝位置:

C:\Program Files (x86)\Wowza Media Systems\WowzaStreaming Engine 4.3.0\content



如果需要驗證本地生成的文件是否正確,只需要替換這個sample.mp4即可。

三.分析及解決

將本地的視頻替換sample.mp4後,發現rtmp、rtsp播放正常,但hls有聲音無視頻,

查看Wowza的log日誌發現:



提示:

MediaReaderH264Cupertino.indexFile[vod/_definst_/sample.mp4]:MP4 video sync table [stss] is empty, will not be able to play video track.

①.說文件stss是空的,查看生成mp4的mp4v2庫源碼,沒找到stss的啓動的方法。

查看了(MP4的幾個概念 https://blog.csdn.net/charleslei/article/details/51084046)。沒有頭緒。

②.網上搜,看到一篇“[html5]解決html5中video標籤無法播放mp4問題的辦法_極酷播放器官方網站 http://www.cuplayer.com/player/PlayerCode/Html5/2017/1030/3228.html

       因爲將本地錄製的mp4用格式工廠轉碼後(輸出mp4,輸出的配置選擇AVC高質量和大小),hls能播放了。所以以爲是編碼問題。

       後同事說是封裝問題,因爲他用vlc對比了hls能播放的mp4文件和不能播放的mp4文件,發現兩者的視頻都是h.264編碼,音頻都是aac編碼。所以他猜測是封裝的格式不一致導致的。

     因爲本地錄製的文件使用mp4v2庫是mpeg封裝,而參看“[html5]解決html5中video標籤無法播放mp4問題的辦法”說的html5能播放的是H264封裝的文件。原來是我理解錯了,mp4v2庫只是負責封裝的一個工具。

③.對比了Wowza的sample.mp4文件和本地錄製的文件(也對比了格式轉換前後的mp4文件),兩者都是mpeg封裝,所以不是封裝的問題。依然需要回歸到iec6000的程序中進行追查問題。


④.再次查看"MP4的幾個概念 - CSDN博客"知道,其實stss是mp4v2庫形成mp4文件必選的一個box。不可能是因爲少了stss,但絕對和sync table [stss]有關係。

       再次回到mp4v2庫的使用上,看到一個文章使用mp4v2將aac音頻h264視頻數據封裝成mp4開發心得https://blog.csdn.net/lh2016rocky/article/details/70882301”。

裏面提到MP4WriteSample的isSyncSample 參數,


      查看iec6000程序的stroage模塊,發現自己在用此函數時,沒有考慮的到isSyncSample 參數,所以寫入mp4文件裏的視頻幀都標記成了關鍵幀。不清楚是否和hls不能播放本地錄製的文件有關係。

       嘗試修改了下,將每幀是否關鍵幀的判斷加上。生成的mp4文件替換到Wowza中,hls可以正常播放。

 

四.備註

本次在網上搜,發現mp4v2庫包含封裝和獲取音視頻兩種功能,當獲取時,會用到MP4ReadSample、MP4GetTrackNumberOfSamples等這些函數。

“MP4V2 判斷幀是否爲關鍵幀 IsSyncSample 異常. - CSDN博客 https://blog.csdn.net/w839687571/article/details/44946571”


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章