一.問題:基於海思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),安裝及使用方法參見下面鏈接下載後的附件:
https://pan.baidu.com/s/1h2js29Onbtce8gmqXlHx8Q
安裝好後,在瀏覽器輸入http://192.168.45.200:8088/ 可以訪問Wowza。
會顯示出:
關於Apple Hls,在很多電腦的瀏覽器上是不能播放的,因爲不支持html5:“HTML5 or HLS is notsupported in this browser”
但可以在手機上驗證這個mp4文件的hls和rtsp播放效果。點擊Mobile,會看到生成的兩個地址。
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”