app直播源代码需要通过网页观看直播,无插件方案就是移动端使用HLS
方法为FFMPEG推流到带Nginx-RTMP-Module的Nginx上,转出RTMP流和HLS流
所用命令为:
ffmpeg.exe -ss 0 -rtsp_transport tcp -i rtsp://192.168.1.1/stream/0 -vcodec copy -acodec copy -f flv rtmp://127.0.0.1:1935/hls/hlstest
结果发现,HLS流在iOS上观看正常,在Android的微信、QQ浏览器、UC浏览器上观看正常。
其他浏览器上无法观看,点击播放后,只能显示一帧画面,播放按钮灰色。点击全屏按钮则提示“抱歉,此视频无法播放”。
而视频点播我们也使用的Nginx,却能正常观看,遂认为是app直播源代码的rtsp流有问题(之前还研究过是否配置问题,MIME问题,等等)
而后测试使用ffmpeg分别推视频文件和rtsp流到nginx,然后在nginx的temp/hls文件夹获取切片文件(.ts)
分析之后发现了区别:
左边是推视频文件的切片文件的信息,右边是流的
可以看到,音频都是AAC,但是视频的是LC-AAC,流的是Main-AAC
Apple关于HLS的资料
查阅资料后发现HLS支持的音频编码为:
HE-AAC or AAC-LC, stereo
MP3 (MPEG-1 Audio Layer 3), stereo
所以应该是AAC编码导致的问题,至于iOS能看,应该是因为iOS上播放都是使用了自带播放器,而Android上的微信、QQ浏览器、UC浏览器能看则应该是因为内嵌了一个播放器用于播放视频及流媒体,播放器能掩盖很多小问题。
app直播源代码的推流命令换成这个,问题解决:
ffmpeg.exe -ss 0 -rtsp_transport tcp -i rtsp://192.168.1.1/stream/0 -vcodec copy -acodec aac -f flv rtmp://127.0.0.1:1935/hls/hlstest
但是由于重编码可能耗费一点服务器性能,所以我们还是决定处理app直播源代码的rtsp流
网上查了很多资料,包括国外的,也没见提到这点,没认真看文档,或者说没留意到这个问题,app直播源代码开发时可能就走了很多弯路,所以写上来,提醒遇到同样问题的人