我的IP Camera推送流仅在有人请求时。因此,当客户端请求流时,没有ts段或m3u8文件。有没有办法让客户端在一秒钟之后重试相同的请求,以便服务器有时间发送命令,等待流视频并生成m3u8文件。
我不想在等待第一个m3u8文件时保持与客户端的连接,因为它可能导致服务器无法处理的连接太多。
修改
运行Nginx的服务器(实际上是OpenResty)从IP Camera接收音频/视频数据,然后使用ffmpeg库进行转码,最后通过HLS协议发布。
问题:
IP摄像机不会一直推送流。它仅在客户端请求时才会推送。服务器接收媒体流并在客户端(HLS播放器,如ffplay或带有videojs-contrib-hls插件的video.js)请求后生成第一个m3u8文件需要几秒钟。因此客户端将获得404并且无法打开HLS流。
我尝试了什么:
我不想在等待第一个m3u8文件时保持与客户端的连接,因为它可能导致服务器无法处理的连接太多。
客户端可以通过添加自定义代码来检查流是否准备就绪。但我想先知道是否有更好的方法。
问题:
服务器如何初始化HLS流并避免问题?
有没有办法生成一个假m3u8文件告诉标准HLS播放器自动重试?
或者有没有办法配置HLS播放器,以便它从服务器获得404时自动重试。任何可以在浏览器中运行的玩家都可以接受,例如flowplayer with flashls,video.js with videojs-contrib-hls。
编辑2:
相机如何开始:
我的系统有一个控制模块与相机通信。它将控制相机开始或停止推动媒体。我确定相机只会在客户要求后启动。所以摄像机的启动方式无关紧要
关于我系统中的Nginx:
相机POST原始媒体(alaw音频和h264视频)到OpenResty服务器(基于Nginx),自定义HTTP标头中有时间戳。每个请求发布两秒钟的媒体。服务器获取原始媒体并将其转码为mpeg-ts格式,并将m3u8文件转码为HLS协议的播放列表。转码是使用ffmpeg库完成的。
播放器:
<!DOCTYPE html>
<meta name="robots" content="noindex">
<html>
<head>
<meta charset=utf-8 />
<title>videojs-contrib-hls embed</title>
<link href="https://cdnjs.cloudflare.com/ajax/libs/video.js/5.10.2/alt/video-js-cdn.css" rel="stylesheet">
<script src="https://cdnjs.cloudflare.com/ajax/libs/video.js/5.10.2/video.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/videojs-contrib-hls/3.0.2/videojs-contrib-hls.js"></script>
</head>
<body>
<video id="my_video_1" class="video-js vjs-default-skin" controls preload="auto" width="640" height="268"
data-setup='{}'>
<source src="http://xxx.xxx.xxx.xxx/camera.m3u8" type="application/x-mpegURL">
</video>
</body>
</html>