http转换html5,最好的方法实时http流到HTML5视频客户端

我真的卡住了试图理解的最好的方式流ffmpeg到HTML5客户端使用node.js的实时输出,因为有一些变量在玩,我没有在这个空间很多的经验,花了很多时间尝试不同的组合。

我的用例是:

1)IP摄像机RTSP H.264流由FFMPEG拾取,并使用节点中的以下FFMPEG设置重新转换为mp4容器,输出到STDOUT。这仅在初始客户端连接上运行,因此部分内容请求不会尝试再次生成FFMPEG。

liveFFMPEG = child_process.spawn("ffmpeg", [

"-i", "rtsp://admin:12345@192.168.1.234:554" , "-vcodec", "copy", "-f",

"mp4", "-reset_timestamps", "1", "-movflags", "frag_keyframe+empty_moov",

"-" // output to stdout

], {detached: false});

2)我使用节点http服务器捕获STDOUT和流客户端请求时返回到客户端。当客户端首次连接时,我生成以上FFMPEG命令行,然后将STDOUT流传递到HTTP响应。

liveFFMPEG.stdout.pipe(resp);

我也使用流事件将FFMPEG数据写入HTTP响应,但没有什么区别

xliveFFMPEG.stdout.on("data",function(data) {

resp.write(data);

}

我使用以下HTTP头(这也是流和预录制文件时使用和工作)

var total = 999999999 // fake a large file

var partialstart = 0

var partialend = total - 1

if (range !== undefined) {

var parts = range.replace(/bytes=/, "").split("-");

var partialstart = parts[0];

var partialend = parts[1];

}

var start = parseInt(partialstart, 10);

var end = partialend ? parseInt(partialend, 10) : total; // fake a large file if no range reques

var chunksize = (end-start)+1;

resp.writeHead(206, {

'Transfer-Encoding': 'chunked'

, 'Content-Type': 'video/mp4'

, 'Content-Length': chunksize // large size to fake a file

, 'Accept-Ranges': 'bytes ' + start + "-" + end + "/" + total

});

3)客户必须使用HTML5视频标签。

我没有问题的流回放(使用fs.createReadStream与206 HTTP部分内容)到HTML5客户端以前用上述FFMPEG命令行记录的视频文件(但保存到一个文件,而不是STDOUT),所以我知道FFMPEG流是正确的,当连接到HTTP节点服务器时,我甚至可以正确地看到VLC中的视频实况流。

但是试图通过节点HTTP从FFMPEG流式传输似乎是很困难的,因为客户端将显示一帧,然后停止。我怀疑的问题是,我没有设置HTTP连接与HTML5视频客户端兼容。我尝试了各种各样的事情,如使用HTTP 206(部分内容)和200反应,将数据放入缓冲区,然后流没有运气,所以我需要回到第一个原则,以确保我设置这个权利办法。

这里是我的理解如何这应该工作,请纠正我,如果我错了:

1)应该设置FFMPEG以将输出分段,并使用空moov(FFMPEG frag_keyframe和empty_moov mov标志)。这意味着客户端不使用通常在文件末尾的moov原子,这在流(无文件结尾)时是不相关的,但是意味着没有寻找可能对我的用例是好的。

2)即使我使用MP4片段和空MOOV,我仍然必须使用HTTP部分内容,因为HTML5播放器将等待,直到整个流下载之前,播放,直播流从来没有结束,所以是不可行的。

3)我不明白为什么管道的STDOUT流到HTTP响应不工作时流式直播现在,如果我保存到一个文件,我可以流传输这个文件到HTML5客户端使用类似的代码。也许这是一个时间问题,因为它需要一秒钟FFMPEG产卵开始,连接到IP摄像头和发送块到节点,并且节点数据事件也是不规则的。但是,字节流应该与保存到文件完全相同,HTTP应该能够应对延迟。

4)当从照相机流式传输由FFMPEG创建的MP4文件时,从HTTP客户端检查网络日志时,我看到有3个客户端请求:视频的一般GET请求,HTTP服务器返回约40Kb,然后部分内容请求与文件的最后10K的字节范围,则最后请求中间的位未加载。也许HTML5客户端一旦收到第一个响应是要求文件的最后部分加载MP4 MOOV原子?如果是这种情况,它将无法流式传输,因为没有MOOV文件和没有结束的文件。

5)当试图流传输时检查网络日志,我得到一个中止的初始请求,只接收大约200个字节,然后重新请求再次中止与200字节和第三个请求只有2K长。我不明白为什么HTML5客户端会中止请求作为字节流是完全相同的,我可以成功使用从记录文件流时。它也似乎节点不是发送剩余的FFMPEG流到客户端,但我可以看到FFMPEG数据在.on事件例程,所以它正在到达FFMPEG节点HTTP服务器。

6)虽然我认为管道将STDOUT流到HTTP响应缓冲区应该工作,我必须构建一个中间缓冲区和流,将允许HTTP部分内容客户端请求正确工作,就像它(成功)读取文件?我认为这是我的问题的主要原因,但我不能确定在节点如何最好设置它。我不知道如何处理客户端对文件末尾的数据的请求,因为没有文件结束。

7)我在错误的轨道上,试图处理206部分内容请求,应该它与正常200 HTTP响应工作吗? HTTP 200响应适用于VLC,所以我怀疑HTML5视频客户端将只处理部分内容请求?

由于我仍然在学习这个东西,它很难通过这个问题(FFMPEG,节点,流,HTTP,HTML5视频)的各个层工作,所以任何指针将非常感谢。我花了几个小时研究这个网站和网,我没有遇到任何人谁能够做的实时流节点,但我不能是第一,我认为这应该能够工作(不知何故) !)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值