将视频从RTP流保存​​到文件

时间:2016-03-27 16:31:35

标签: c++ video rtsp rtp

我正在尝试从IP摄像机获取和存储数据,我很欣赏一些关于最佳方法的高级建议。

到目前为止,我已成功启动与相机的RTSP对话,并让它向我发送带有RTP有效负载的UDP数据包。但我不确定从哪里开始。

我很高兴能够完成这项工作,我只是欣赏一些指示/对这些步骤的高级概述,以便我可以解构该项目!

2 个答案:

答案 0 :(得分:2)

这里的OP问题没有直接的答案,因为他的问题有点宽泛,如果没有关于OP打算如何处理该信息的进一步信息,很难给出准确的答案。我在这里可以做的是建议可能采取的OP步骤以及需要考虑的问题。

OP已声明:

  

到目前为止,我已成功启动与相机的RTSP对话,并让它向我发送带有RTP有效负载的UDP数据包。但我不确定从哪里开始。

现在您已经与摄像机建立了通信并且能够通过视频流接收数据包,现在能够了解RTP有效负载是什么,或者如何解释该数据。所以在这一点上,你将不得不对我认为是一种网络协议的RTP协议进行研究。一旦你编写了你的​​结构和函数来成功地使用这个协议,就可以将UPD数据包分解为有用的信息字节。通常在许多情况下,当涉及直接从文件或流对象处理图形,视频或音频数据时,它们通常伴随有某种类型的头信息。接下来,理解这个Header信息是一个正常的结构形式,它提供有关此文件或流所拥有的内容类型的信息,以便您知道要从中提取多少字节的信息。

  

我知道它不会只是将RTP有效负载直接保存到文件中,但涉及的其他步骤是什么?

所涉及的步骤可能会有所不同,具体取决于您的需求以及您打算如何处理信息:您是否尝试将视频内容的属性或一般信息写入文件,例如:压缩类型,音频 - 视频编解码器类型,其分辨率和帧速率信息,其字节速率等?或者您是否尝试将实际视频内容本身写入您的应用程序将用于播放或编辑目的的文件?这一切都取决于你的意图。

  

数据是否已压缩,在这种情况下我必须解压缩?

此时,一旦您成功地解释了RTP协议并通过了解其头信息并将其保存到正确的结构来解析数据包,那么就是使用该头信息来确定实际的内容在该流对象中。例如,根据有关您提供的摄像机属性的PDF,视频压缩可以保存为2种类型,H.264或MJPEG,您必须根据标题中提供的信息确定,从这里你必须分支你的代码,并能够阅读和解析每种类型的压缩,或接受你愿意使用的那个,而忽略另一个。接下来是音频压缩,如果你关注音频和可用的类型是AAC(仅编码),G.711 A-Law,& G.711 U-Law和相同的机制适用于此。曾经你能够通过音频和视频压缩,然后你将需要关于视频信息本身的重要信息,例如从头信息中存储的分辨率和帧速率(缓冲区大小),以便你知道要读取的字节数流和指针在流中移动的距离。如果您注意到分辨率和帧速率,则使用的每种类型的压缩都有不同的可接受格式:

  • H.26
    • 1920 x 180(2.1MP)@ 30 fps(1080p)
    • 1280 x 720 @ 60 fps(720p)*
    • 720 x 480/576 @ 30/25 fps(D1)
    • 704 x 480/576 @ 30/20 fps(4CIF)
    • 352 x 240/288 @ 30/25 fps(CIF)
  • MJPEG
    • 720 x 480/576 @ 30/25 fps(D1)
    • 740 x 480/578 @ 30/25 fps(4CIF)
    • 352 x 240/288 @ 30/25 fps(CIF)

现在这是针对分辨率&帧速率,但接下来要考虑的是 您正在使用视频流,因此上述内容可能不适用于您的情况,并且根据视频摄像机的视频流功能的属性,这些是您需要考虑的类型:

  • 单流H.264高达1080p(1920 x 1080)@ 30 fps
  • 双流H.264和MJPEG
    • H.264:主​​流可编程最高1280 x 720 @ 25/20 fps
    • MJPEG:辅助流可编程高达720 x 576 @ 25/20 fps

使用这些不同的类型供您的摄像机使用时,您必须考虑所有这些。现在,这还取决于您对应用程序的意图以及您打算如何处理这些信息。您可以编写程序以接受所有这些类型,或者您可以将其编程为仅接受具有该类型的特定格式的一种类型。这取决于你。

  

我是否需要进行任何其他修改?

除非您在实际应用中的意图是修改视频 - 音频信息本身,否则我认为您无法进行任何修改。如果您的应用程序中的意图是只读取文件以进行简单回放,那么只要正确保存了所有适当的信息并且用于读取自定义文件结构的文件解析器能够读入您的文件,答案就不会有。 ; s内容,并能够适当地解析数据以进行一般播放。

  

我在哪里可以了解我需要针对此相机做些什么?

我认为您不需要了解有关相机本身的更多信息,因为您在问题中的链接中提供的PDF已经为您提供了足够的信息。您需要的是有关特定协议,数据包类型,压缩和扩展的信息和文档。通常搜索这些类型的流类型就足够了。

<强> UDP

  • Google搜索Linux或Winsock的c ++编程UDP套接字。

<强> RTP

  • Google搜索c ++编程RTP数据包

视频压缩

  • 进行Goggle搜索H.26&amp;关于流对象的MJPEG压缩和结构信息。

音频压缩

  • 如果您对音频感兴趣,请在Google上搜索每个AAC(仅编码),G.711 A-Law,G.711 U-Law。

一旦您将这些数据结构的有效规范作为流对象并且需要相应的标头信息来确定保存此视频内容的类型和格式,那么您应该能够轻松地轻松解析数据包。现在关于如何保存它们或将它们写入文件都取决于你的意图。

我已将此作为指导,以帮助您以正确的化学家,物理学家,科学家或工程师处理任何典型问题的方式引导您朝着正确的方向前进。

一般步骤是遵循关于当前问题的科学方法。这些通常是:

  • 评估情况
  • 创建关于情境的假设或论文。
  • 收集已知事实
  • 确定未知数
  • 草拟显示已知和未知之间关系的模型。
  • 同时进行研究和实验
  • 记录或记录事件和数据
  • 分析数据
  • 得出结论

现在在编写软件应用程序的情况下,概念是类似的,但是方法可能不同或变化,因为可能不需要上述所有步骤,或者可能需要一些额外的步骤。应用程序开发周期中的一个这样的步骤是科学方法中没有的,它将是调试应用程序的过程。但一般准则仍然适用。如果你能坚持这种策略,我相信你将有信心收集你需要的东西,以及如何从一步一步的过程中使用它来实现你的目标。

答案 1 :(得分:2)

  

我试图从思科IPC摄像机获取和存储数据,并且我非常欣赏一些关于最佳方法的高级建议。

您可以使用openRTSP执行此操作,也可以使用output to file。对于这种方法,您必须编写 NO 代码。正确实现RTP,RTSP和RTCP非常复杂且工作量很大。如果您有openRTSP无法满足的要求,您可以使用live555库来进行RTSP / RTP / RTCP,并编写一些最小代码来处理接收到的视频。邮件列表非常敏感,前提是您要求&#34; good&#34;问题,并确保您首先阅读常见问题。

  

我知道它不会只是将RTP有效负载直接保存到文件中,但还涉及其他步骤?

如果您使用openRTSP,则不需要知道这一点。如果您直接使用live555库,那么您将传递整个视频帧,然后您必须根据您想要实现的目标自行解码和写入文件。如果您 DO 需要/想要了解RTP和RTP有效载荷格式,请阅读相应的RFC,例如: RFC2326RFC3550RFC6184

  

数据是否已压缩,在这种情况下我必须解压缩?

通常,您希望将压缩媒体存储在文件中,并使用媒体播放器软件在播放时对其进行解码(否则您最终会收到大量文件)。

  

我在哪里可以了解我需要针对此相机做些什么?

如果你只想保存视频,理想情况下你不需要了解相机的任何信息,除了它实现的标准(你已经做过)。