5

我有一台 IP 摄像头 (VisionTech VN6xSM3Ti),它返回 H.264 原始数据的视频流,我如何使用该流创建可通过 HTML5 浏览器访问的实时流?

要访问摄像头流,我必须遵循制造商指定的协议,所以不像只使用IP地址访问它那么容易。

我已经有 C# 和 C 中的代码,将相机流作为字节数组读取,但我不知道如何继续。

我一直在考虑用 Node.JS 和我的代码来解决它,如下所示:

  1. 使用我的代码访问相机流并通过本地套接字将其公开
  2. 在 Node.JS 中访问创建的套接字并将其内容流式传输到所有客户端

IP 摄像机原始数据 ---> 我的代码 --- 本地套接字 --> Node.js --- ?? ---> 客户

有谁知道这是否可以做到?还是有更好的选择?

4

1 回答 1

2

假设:
我假设如下:H264流是AnnexB类型的,可以分块读取,前提是分块(流式)写入数据。输出数据可在浏览器中播放,无需任何扩展或特殊播放器。

建议:
您需要读取一块数据,将原始 h264 数据重新混合到碎片化的 mp4 并将该文件的块发送到客户端。为了做到这一点,最简单的解决方案可能是使用FFMpeg和管道。

FFMpeg:
FFMpeg 可以使用管道输入和输出(answer ref)。要接收原始 h264 流,请将流重新混合到分段的 mp4 (答案 ref)并写入输出,执行以下操作(未测试):

ffmpeg -f h264 -i pipe: -c copy -f mp4 -movflags frag_keyframe+empty_moov pipe:

该命令将从标准输入读取原始 h264 数据,复制流(不重新编码)并将其复用到分段的 mp4 到标准输出。

在 C# 中,您可以启动外部进程Process.Start,将接收到的字节写入其Process.StandardInput并读取Process.StandardOutput。输出应该是可以在浏览器中播放的分段 mp4 。

备注
1. 一个缺点是无法搜索视频,但如果我理解正确的话,它是一个直播,所以应该没问题。
2.输入流没有重新编码,只是重新混合。这是最快的处理,但如果您想要更多控制:例如输出 h265 或指定片段大小,则必须在处理期间重新编码流(高 CPU 使用率)。

于 2019-11-23T03:01:00.277 回答