这里没有直接回答 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 中的每一个。
从那里,一旦您将这些数据结构的有效规范作为流对象,并且需要适当的标头信息来确定此视频内容保存的类型和格式,那么您应该能够轻松地适当地解析数据包.现在至于如何保存它们或将它们写入文件完全取决于您的意图。
我提供此指南作为遵循的指南,以帮助您以与化学家、物理学家、科学家或工程师处理任何典型问题类似的方式引导您朝着正确的方向前进。
一般步骤是遵循针对当前问题的科学方法。这些通常是:
- 评估情况
- 创建关于该情况的假设或论文。
- 收集已知事实
- 确定未知数
- 绘制一个模型,显示已知和未知之间的关系。
- 同时进行研究和实验
- 记录或记录事件和数据
- 分析数据
- 得出结论
现在,在编写软件应用程序的情况下,概念相似,但方法可能不同或有所不同,因为可能不需要上述所有步骤,或者可能需要一些额外的步骤。在科学方法中找不到的应用程序开发周期中的一个这样的步骤是调试应用程序的过程。但一般准则仍然适用。如果您能坚持这种类型的策略,我相信您将能够有信心收集您需要的东西以及如何使用它来逐步实现您的目标。