2015-12-18 25 views
0

我计划为学生开发基于Zynq Xilinx FPGA的开源大学项目,该项目将捕获CMOS视频,将其编码为传输流并通过以太网发送至远程PC。基本上我想设计另一台IP摄像机。我有很强的FPGA经验,但缺乏有关编码和传输视频数据的知识。这是我的计划:利用FPGA捕获CMOS视频,编码并通过以太网发送

  1. 连接的CMOS摄像头,以FPGA,收到的视频帧,并将它们保存到外部DDR内存,采用HDMI输出,用于监测验证。我没有问题。

  2. 我知道我必须将我的视频流压缩为H.264格式,并将其放入传输流中。我在这里几乎没有什么知识,需要一些提示。

  3. 当我形成传输流后,我可以使用UDP数据包通过网络发送它。我有工作的硬件解决方案,从FIFO中读取数据并将其作为UDP papckets发送到远程PC。

  4. 最后我打算使用ffmpeg库来接收和播放视频。

    ffplay udp://localhost:5678

我的问题是关于基本上2步。如何将像素帧转换为传输流?我的选择是:

  1. 使用商业IP,像

在这里,我怀疑他们是免费使用的,我们没有太多的资金。

  • 使用开放芯等

    • http://sourceforge.net/projects/hardh264/ - 这里芯仅生成H264输出,但如何将其封装到传输流?
    • 我已经搜索了opencores.org,但在这个主题上没有成功
    • 也许有人知道一些好的开源相关FPGA项目?
  • 使用Vivado HLS(C语言)开发自己的硬件编码器。但这里是我不知道算法的问题。也许我可以通过ffmpeg或Cisco openh264库进行演示,并找到将原始像素帧转换为H.264格式然后将其放入传输流的功能?任何帮助也将在这里appriciated。

  • 另外我担心格式兼容性可能会在FPGA内产生,也可能是由ffplay工具在主机上产生的格式兼容性。任何帮助,提示,链接和书籍appriciated!

    +1

    如果我理解正确,您已经很好地执行了计算密集型任务(视频捕获,H264编码器)。只有您需要帮助的部分是将enocder输出包装为可移动流。这个任务不是计算密集型的,我想你可以在Zynq的双Cortex-A9内核上完成这个任务。实际上,编码器是将原始像素帧转换为H.264格式的编码器。流式传输方法只是将一个头附加到编码器的输出。 – ARK

    +0

    此外,我想你知道H264编码器只接受YUV格式的输入。您可能需要使用YUV 4:2:0格式。所以,你需要一个视频捕获和编码器之间的颜色转换模块 – ARK

    +0

    我不知道你的项目有什么样的范围,但是我参与了一个在硬件上实现h.264解码器的项目,一个大项目。实际上,四位学生分别做了两个实现,一个在BSV中,一个在Verilog中,每个都需要几个月的时间。 –

    回答

    1

    我还没有看到任何开源硬件h。264编码器,但我正在给那些正在将软件编码器的一些重要计算部分移入FPGA的人提供建议。它可能是openh264。

    我不会为这个项目推荐ffmpeg,因为它实现了很多协议。 h.264中有足够的选项,而不必担心其他标准。

    至于容器格式,MPEG4盒子非常简单,所以添加传输封装应该非常简单。我正在考虑Quicktime 4cc封装。

    我会建议MPEG DASH,因为你可以将每个视频帧封装到一个单独的盒子(一个MOOF电影片段)。但是,将编码数据封装在容器中并不是计算密集型的。下面是一些软件,与容器格式的交易: https://gpac.wp.mines-telecom.fr/mp4box/dash/

    而不是用硬件实现整个编码器,你可以专注于计算密集型部分,您可以通过它运行剖析软件发现。去块滤波器就是这样一种功能,它用于编码和解码。

    祝您的项目顺利!