【问题标题】:Saving video from an RTP stream to a file将视频从 RTP 流保存到文件
【发布时间】:2016-08-09 17:56:19
【问题描述】:

我正在尝试从 IP 摄像头获取和存储数据,我希望能得到一些关于最佳方式的高级建议。

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

我很高兴能完成这项工作,我希望得到一些指导/对步骤的高级概述,这样我就可以解构项目了!

【问题讨论】:

  • 这是一个非常广泛的问题。你真的已经在使用像 ffmpeg 这样的框架了吗?
  • 抱歉说得这么宽泛。我想我知道的不够多,无法提出更具体的问题。我没有使用任何框架。我只是通过以太网连接了我的相机,并且我正在使用一个简单的伪造 C/C++ 程序启动 RTP 流。
  • 我必须同意 πάντα ῥεῖ;有太多方法可以回答这个问题。您是否使用第三方 API 或库?您是否使用自己的框架作品?一般来说,一旦您从服务器端接收到数据包,接下来就是解析数据或将数据包解释为他们的标准或您自己的设计所需的某种类型的数据结构,将它们保存到无论是结构还是类实例,然后从那里保存或写入哪些位对您的应用程序将使用的文件结构很重要。
  • @SuddenMoustache:您需要获取相机的数据表(规格)以了解数据格式、压缩算法(如果有)。
  • @SuddenMoustache:为了回答您的一些问题,我们需要知道您打算如何处理数据以及传入数据的速率。例如,如果数据快速进入,您可能希望使用双缓冲并保存数据以供以后分析。如果数据来得很慢,您可能有时间执行一些图像处理(甚至显示为电影)。同样,您对数据有什么计划?

标签: c++ video rtsp rtp


【解决方案1】:

这里没有直接回答 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

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

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

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

我在哪里可以了解我需要针对此相机执行哪些操作?

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

UDP

  • 在 Google 上搜索适用于 Linux 或 Winsock 的 c++ 编程 UDP 套接字。

RTP

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

视频压缩

  • 使用 Goggle 搜索 H.26 和 MJPEG 压缩以及流对象的结构信息。

音频压缩

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

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

我提供此指南作为遵循的指南,以帮助您以与化学家、物理学家、科学家或工程师处理任何典型问题类似的方式引导您朝着正确的方向前进。

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

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

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

【讨论】:

  • 这是一个很棒的回复,我非常感谢您花时间写它。非常感谢,弗朗西斯。
  • @SuddenMoustache 我会尽我所能提供帮助;我从经验中知道,因为我是自学 C++,我的编程重点是 3D 图形开发和 3D 游戏引擎设计。我真的没有人教我这门语言,我必须自己学习,当我在 90 年代末 2000 年代初开始学习时,大多数用于教程的互联网网站都是文本视图,大多数示例都会甚至在没有解释或涉及其他库等的情况下编译。就好像他们假设你已经知道一样。随着时间的推移,互联网得到了改善,...
  • @SuddenMoustache(...继续)流媒体视频出来了,并找到了更好的教程来学习。语言本身是我通过反复试验、大量搜索和阅读而用非常少的帮助来学习的。至于学习不同的方法、最佳实践和创建开发模型,这些模型随着时间的推移和社区的改进而出现,比如我在MarekKnows.com 学习 OpenGL 的地方@ 我学习了一些 Direct X,但我找到的最好的网站是 http ::www.rastertek.com 一些来自 youtube 视频搜索。
【解决方案2】:

我正在尝试从 Cisco IPC 摄像头获取和存储数据,我希望能得到一些关于最佳方式的高级建议。

您可能可以使用openRTSP 来执行此操作,也可以使用output to file。对于这种方法,您必须编写 NO 代码。正确实现 RTP、RTSP 和 RTCP 很复杂,需要大量工作。如果您有 openRTSP 不满足的要求,您可以使用live555 库来实现 RTSP/RTP/RTCP,并编写一些最少的代码来处理接收到的视频。如果您提出“好”的问题,邮件列表的响应速度非常快,并确保您首先阅读了常见问题解答。

我知道这不仅仅是将 RTP 有效负载直接保存到文件的情况,还涉及哪些其他步骤?

如果您使用 openRTSP,则无需知道这一点。如果您直接使用 live555 库,您将收到整个视频帧,然后您必须自己解码并写入文件,具体取决于您想要实现的目标。如果您确实需要/想了解 RTP 和 RTP 有效负载格式,请阅读相应的 RFC,例如RFC2326, RFC3550, RFC6184.

数据是否压缩了,需要解压吗?

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

我在哪里可以了解我需要针对此相机执行哪些操作?

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-01
    • 2019-12-31
    • 2011-08-26
    • 1970-01-01
    • 2012-11-21
    • 1970-01-01
    • 2019-05-24
    • 2011-11-07
    相关资源
    最近更新 更多