解决使用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

会显示出:

解决使用mp4v2封装的mp4文件在Wowza的hls上无法播放问题


关于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),

如果都都能正常播放,说明这个视频没问题。

解决使用mp4v2封装的mp4文件在Wowza的hls上无法播放问题


这里面的sample.mp4文件所在的服务器位置是Wowza的安装位置:

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


解决使用mp4v2封装的mp4文件在Wowza的hls上无法播放问题

如果需要验证本地生成的文件是否正确,只需要替换这个sample.mp4即可。

三.分析及解决

将本地的视频替换sample.mp4后,发现rtmp、rtsp播放正常,但hls有声音无视频,

查看Wowza的log日志发现:

解决使用mp4v2封装的mp4文件在Wowza的hls上无法播放问题


提示:

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的程序中进行追查问题。

解决使用mp4v2封装的mp4文件在Wowza的hls上无法播放问题

④.再次查看"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 参数,

解决使用mp4v2封装的mp4文件在Wowza的hls上无法播放问题

      查看iec6000程序的stroage模块,发现自己在用此函数时,没有考虑的到isSyncSample 参数,所以写入mp4文件里的视频帧都标记成了关键帧。不清楚是否和hls不能播放本地录制的文件有关系。

       尝试修改了下,将每帧是否关键帧的判断加上。生成的mp4文件替换到Wowza中,hls可以正常播放。

 

四.备注

本次在网上搜,发现mp4v2库包含封装和获取音视频两种功能,当获取时,会用到MP4ReadSample、MP4GetTrackNumberOfSamples等这些函数。

“MP4V2 判断帧是否为关键帧 IsSyncSample 异常. - CSDN博客 https://blog.csdn.net/w839687571/article/details/44946571”