从原始H.264帧流创建视频流服务器

时间:2013-10-09 23:46:02

标签: c# c video-streaming h.264

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

要访问摄像机流,我必须遵循制造商的指定协议,因此只需使用IP地址访问它就不那么容易了。

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

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

  1. 使用我的代码访问摄像机流并通过本地套接字公开
  2. 在Node.JS中访问创建的套接字并将其内容流式传输到所有客户端
  3. IP Camera raw Data --->我的代码---本地套接字 - > Node.js --- ?? --->客户端

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

1 个答案:

答案 0 :(得分:1)

假设:
我假设以下内容:H264流是AnnexB类型,您可以分块读取它,前提是将数据分块写入(流化)。输出数据可以在没有任何扩展名或特殊播放器的浏览器中播放。

提案:
您需要读取数据块,将原始的h264数据重新混合为碎片化的mp4,然后将该文件的块发送给客户端。为此,最简单的解决方案可能是使用FFMpeg和管道。

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

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

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

在C#中,您可以启动一个外部进程Process.Start,将收到的字节写到Process.StandardInput并读取Process.StandardOutput。输出应为fragmented mp4,应可在浏览器中播放。

备注
   1.缺点是无法搜索视频,但如果我理解正确,它是实时流,所以应该没问题。
   2.输入流不重新编码,仅重新复用。这是最快的处理过程,但是如果您需要更多控制权,例如要输出h265或指定片段大小,则必须在此过程中对流进行重新编码(CPU使用率很高)。