一.问题:基于海思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封装,所以不是封装的问题。依然需要回归到程序中进行追查问题。
④.再次查看"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 参数,
查看程序的mp4模块,发现自己在用此函数时,没有考虑的到isSyncSample 参数,所以写入mp4文件里的视频帧都标记成了关键帧。不清楚是否和hls不能播放本地录制的文件有关系。
尝试修改了下,将每帧是否关键帧的判断加上。生成的mp4文件替换到Wowza中,hls可以正常播放。
四.备注
本次在网上搜,发现mp4v2库包含封装和获取音视频两种功能,当获取时,会用到MP4ReadSample、MP4GetTrackNumberOfSamples等这些函数。
“MP4V2 判断帧是否为关键帧 IsSyncSample 异常. - CSDN博客 https://blog.csdn.net/w839687571/article/details/44946571”