将视频从 RTP 流保存到文件
Saving video from an RTP stream to a file
我正在尝试从 IP 摄像机获取和存储数据,我希望能就最佳方法提供一些高级建议。
到目前为止,我已成功启动与摄像头的 RTSP 对话,并让它向我发送带有 RTP 负载的 UDP 数据包。但我不确定从这里去哪里。
我很高兴做这项工作,我非常感谢一些指示/步骤的高级概述,以便我可以解构项目!
这里没有直接回答 OP 的问题,因为他的问题有点宽泛,而且如果没有进一步的信息说明 OP 打算如何处理这些信息,就很难给出准确的答案。我在这里能做的就是向OP建议可能采取的步骤以及需要考虑的问题。
OP 指出:
So far I've successfully initiated an RTSP conversation with the camera and have it sending me UDP packets with RTP payloads. But I'm unsure where to go from here.
现在您已经与摄像头建立了通信并且能够通过视频流接收数据包,现在需要了解 RTP 有效负载是什么,或者如何解释该数据。所以在这一点上你将不得不对 RTP 协议进行研究,在我看来它是一种网络协议。一旦您编写了结构和函数以成功使用该协议,接下来就是将 UPD 数据包分解为有用的信息字节。通常在许多情况下,当涉及到直接从文件或流 object 处理图形、视频或音频数据时,它们通常伴随着某种类型的 header 信息。接下来,理解这个 Header 信息是正常的,它以一种结构形式提供有关此文件或流所包含的内容类型的信息,以便您知道要从中提取多少字节的信息它。
I know it's not going to just be a case of saving the RTP payload directly to a file, but what other steps are involved?
所涉及的步骤可能会有所不同,具体取决于您的需要以及您打算如何处理信息:您是否正在尝试将有关视频内容的属性或一般信息写入文件,例如:其压缩类型、其音频 - 视频编解码器类型、分辨率和帧速率信息、字节速率等?或者您是否正在尝试将实际的视频内容本身写入您的应用程序将用于播放或编辑目的的文件?这完全取决于您的意图。
Is the data compressed, in which case I have to decompress it?
此时,一旦您成功解释 RTP 协议并通过理解其 header 信息解析数据包并将其保存为适当的结构,接下来就是使用 header 信息以确定流中实际包含的内容 object。例如,根据您提供的关于摄像机属性的 PDF,视频压缩可以保存为 2 种类型,H.264 或 MJPEG,您必须根据 [=] 中提供的信息来确定141=],从这里您必须分支您的代码并能够读取和解析每种类型的压缩,或者接受您愿意使用的一种并忽略另一种。接下来是音频压缩,如果您关心音频并且可用的类型是 AAC(仅编码)、G.711 A-Law 和 G.711 U-Law,相同的机制适用于此处。一旦您能够通过音频和视频压缩,您将需要有关视频信息本身的重要信息,例如从 header 信息中存储的分辨率和帧速率(缓冲区大小),以便您知道有多少要从流中读取的字节以及将指针在流中移动多远。如果您注意到分辨率和帧速率,则可以从正在使用的每种压缩类型中获得不同的可接受格式:
- H.26
- 1920 x 180 (2.1MP) @ 30 fps (1080p)
- 1280 x 720 @ 60 帧/秒 (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)
现在这是针对分辨率和帧率的,但接下来要考虑的是
您正在处理视频流,因此以上内容可能不适用于您的情况,并且根据摄像机的 Video-Stream 功能的属性,这些是您必须考虑的可用类型:
- Single-stream H.264 高达 1080p (1920 x 1080) @ 30 fps
- Dual-stream H.264 和 MJPEG
- H.264:主码流可编程至 1280 x 720 @ 25/20 fps
- MJPEG:辅助流可编程高达 720 x 576 @ 25/20 fps
有了这些可供您的摄像机使用的不同类型,您必须将所有这些都考虑在内。现在,这还取决于您的申请意图以及您打算如何处理这些信息。您可以编写您的程序来接受所有这些类型,或者您可以对其进行编程以仅接受具有该类型特定格式的一种类型。这取决于你。
Do I have to do any other modifications?
我认为您不需要做任何修改,除非您在实际应用程序中的意图是修改视频 - 音频信息本身。如果您在应用程序中的意图只是为了简单播放而读取文件那么答案是否定的,只要正确保存了所有适当的信息,并且用于读取自定义文件结构的文件解析器能够读取文件的内容并能够适当地解析数据以进行一般播放。
Where can I learn about what I'll need to do specific to this camera?
我认为您不需要了解有关相机本身的更多信息,因为您在问题 link 中提供的 PDF 已经为您提供了足够的信息供您继续使用。您从这里需要的是有关特定协议、数据包类型、压缩和流类型的信息和文档,对这些进行一般搜索就足够了。
UDP
- Google 搜索 Linux 或 Winsock 的 c++ 编程 UDP 套接字。
RTP
- Google 搜索 c++ programming RTP Packets
视频压缩
- 使用 Goggle 搜索流 object 上的 H.26 和 MJPEG 压缩和结构信息。
音频压缩
- 如果您也对音频感兴趣,请Google 搜索 AAC(仅编码)、G.711 A-Law、G.711 U-Law。
一旦您拥有这些数据结构的有效规范作为流 object 并且需要适当的 header 信息来确定此视频内容的保存类型和格式,那么您应该能够轻松地适当地解析数据包。现在至于如何保存它们或将它们写入文件完全取决于您的意图。
我提供此作为要遵循的指南,以帮助您以类似于化学家、物理学家、科学家或工程师处理任何典型问题的方式朝着正确的方向前进。
一般步骤是遵循关于当前问题的科学方法。这些通常是:
- 审时度势
- 创建关于情况的假设或论文。
- 收集已知事实
- 确定未知物
- 起草一个显示已知和未知之间关系的模型。
- 进行研究和实验
- 记录或记录事件和数据
- 分析数据
- 得出结论
现在,在编写软件应用程序的情况下,概念是相似的,但方法可能不同或有所不同,因为可能不需要上述所有步骤,或者可能需要一些额外的步骤。在科学方法中找不到的应用程序开发周期中的一个这样的步骤是调试应用程序的过程。但一般准则仍然适用。如果你能坚持这种类型的策略,我相信你将能够有信心收集你需要的东西,并一步一步地使用它来实现你的目标。
I'm trying to get and store the data from a Cisco IPC camera, and I'd appreciate some high level advice as to the best way to do this.
您或许可以使用 openRTSP to do this, which can also output to file. For this approach you would have to write NO code. Implementing RTP, RTSP and RTCP correctly is complex and a lot of work. Should you have requirements that openRTSP doesn't meet, you can use the live555 库来 RTSP/RTP/RTCP 并编写一些最少的代码来处理接收到的视频。如果您提出“好的”问题,并确保您首先阅读常见问题解答,邮件列表会非常敏感。
I know it's not going to just be a case of saving the RTP payload directly to a file, but what other steps are involved?
如果你使用openRTSP,你不需要知道这些。如果您直接使用 live555 库,您将获得整个视频帧,然后您必须自行解码并写入文件,具体取决于您想要实现的目标。如果您 DO need/want 了解 RTP 和 RTP 负载格式,请阅读相应的 RFC,例如RFC2326, RFC3550, RFC6184.
Is the data compressed, in which case I have to decompress it?
通常您希望将压缩媒体存储在一个文件中,并在播放时使用媒体播放器软件对其进行解码(否则您最终会得到巨大的文件)。
Where can I learn about what I'll need to do specific to this camera?
如果您只想保存视频,理想情况下您不需要了解相机的任何信息,除了它执行的标准(您已经执行)。
我正在尝试从 IP 摄像机获取和存储数据,我希望能就最佳方法提供一些高级建议。
到目前为止,我已成功启动与摄像头的 RTSP 对话,并让它向我发送带有 RTP 负载的 UDP 数据包。但我不确定从这里去哪里。
我很高兴做这项工作,我非常感谢一些指示/步骤的高级概述,以便我可以解构项目!
这里没有直接回答 OP 的问题,因为他的问题有点宽泛,而且如果没有进一步的信息说明 OP 打算如何处理这些信息,就很难给出准确的答案。我在这里能做的就是向OP建议可能采取的步骤以及需要考虑的问题。
OP 指出:
So far I've successfully initiated an RTSP conversation with the camera and have it sending me UDP packets with RTP payloads. But I'm unsure where to go from here.
现在您已经与摄像头建立了通信并且能够通过视频流接收数据包,现在需要了解 RTP 有效负载是什么,或者如何解释该数据。所以在这一点上你将不得不对 RTP 协议进行研究,在我看来它是一种网络协议。一旦您编写了结构和函数以成功使用该协议,接下来就是将 UPD 数据包分解为有用的信息字节。通常在许多情况下,当涉及到直接从文件或流 object 处理图形、视频或音频数据时,它们通常伴随着某种类型的 header 信息。接下来,理解这个 Header 信息是正常的,它以一种结构形式提供有关此文件或流所包含的内容类型的信息,以便您知道要从中提取多少字节的信息它。
I know it's not going to just be a case of saving the RTP payload directly to a file, but what other steps are involved?
所涉及的步骤可能会有所不同,具体取决于您的需要以及您打算如何处理信息:您是否正在尝试将有关视频内容的属性或一般信息写入文件,例如:其压缩类型、其音频 - 视频编解码器类型、分辨率和帧速率信息、字节速率等?或者您是否正在尝试将实际的视频内容本身写入您的应用程序将用于播放或编辑目的的文件?这完全取决于您的意图。
Is the data compressed, in which case I have to decompress it?
此时,一旦您成功解释 RTP 协议并通过理解其 header 信息解析数据包并将其保存为适当的结构,接下来就是使用 header 信息以确定流中实际包含的内容 object。例如,根据您提供的关于摄像机属性的 PDF,视频压缩可以保存为 2 种类型,H.264 或 MJPEG,您必须根据 [=] 中提供的信息来确定141=],从这里您必须分支您的代码并能够读取和解析每种类型的压缩,或者接受您愿意使用的一种并忽略另一种。接下来是音频压缩,如果您关心音频并且可用的类型是 AAC(仅编码)、G.711 A-Law 和 G.711 U-Law,相同的机制适用于此处。一旦您能够通过音频和视频压缩,您将需要有关视频信息本身的重要信息,例如从 header 信息中存储的分辨率和帧速率(缓冲区大小),以便您知道有多少要从流中读取的字节以及将指针在流中移动多远。如果您注意到分辨率和帧速率,则可以从正在使用的每种压缩类型中获得不同的可接受格式:
- H.26
- 1920 x 180 (2.1MP) @ 30 fps (1080p)
- 1280 x 720 @ 60 帧/秒 (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)
现在这是针对分辨率和帧率的,但接下来要考虑的是 您正在处理视频流,因此以上内容可能不适用于您的情况,并且根据摄像机的 Video-Stream 功能的属性,这些是您必须考虑的可用类型:
- Single-stream H.264 高达 1080p (1920 x 1080) @ 30 fps
- Dual-stream H.264 和 MJPEG
- H.264:主码流可编程至 1280 x 720 @ 25/20 fps
- MJPEG:辅助流可编程高达 720 x 576 @ 25/20 fps
有了这些可供您的摄像机使用的不同类型,您必须将所有这些都考虑在内。现在,这还取决于您的申请意图以及您打算如何处理这些信息。您可以编写您的程序来接受所有这些类型,或者您可以对其进行编程以仅接受具有该类型特定格式的一种类型。这取决于你。
Do I have to do any other modifications?
我认为您不需要做任何修改,除非您在实际应用程序中的意图是修改视频 - 音频信息本身。如果您在应用程序中的意图只是为了简单播放而读取文件那么答案是否定的,只要正确保存了所有适当的信息,并且用于读取自定义文件结构的文件解析器能够读取文件的内容并能够适当地解析数据以进行一般播放。
Where can I learn about what I'll need to do specific to this camera?
我认为您不需要了解有关相机本身的更多信息,因为您在问题 link 中提供的 PDF 已经为您提供了足够的信息供您继续使用。您从这里需要的是有关特定协议、数据包类型、压缩和流类型的信息和文档,对这些进行一般搜索就足够了。
UDP
- Google 搜索 Linux 或 Winsock 的 c++ 编程 UDP 套接字。
RTP
- Google 搜索 c++ programming RTP Packets
视频压缩
- 使用 Goggle 搜索流 object 上的 H.26 和 MJPEG 压缩和结构信息。
音频压缩
- 如果您也对音频感兴趣,请Google 搜索 AAC(仅编码)、G.711 A-Law、G.711 U-Law。
一旦您拥有这些数据结构的有效规范作为流 object 并且需要适当的 header 信息来确定此视频内容的保存类型和格式,那么您应该能够轻松地适当地解析数据包。现在至于如何保存它们或将它们写入文件完全取决于您的意图。
我提供此作为要遵循的指南,以帮助您以类似于化学家、物理学家、科学家或工程师处理任何典型问题的方式朝着正确的方向前进。
一般步骤是遵循关于当前问题的科学方法。这些通常是:
- 审时度势
- 创建关于情况的假设或论文。
- 收集已知事实
- 确定未知物
- 起草一个显示已知和未知之间关系的模型。
- 进行研究和实验
- 记录或记录事件和数据
- 分析数据
- 得出结论
现在,在编写软件应用程序的情况下,概念是相似的,但方法可能不同或有所不同,因为可能不需要上述所有步骤,或者可能需要一些额外的步骤。在科学方法中找不到的应用程序开发周期中的一个这样的步骤是调试应用程序的过程。但一般准则仍然适用。如果你能坚持这种类型的策略,我相信你将能够有信心收集你需要的东西,并一步一步地使用它来实现你的目标。
I'm trying to get and store the data from a Cisco IPC camera, and I'd appreciate some high level advice as to the best way to do this.
您或许可以使用 openRTSP to do this, which can also output to file. For this approach you would have to write NO code. Implementing RTP, RTSP and RTCP correctly is complex and a lot of work. Should you have requirements that openRTSP doesn't meet, you can use the live555 库来 RTSP/RTP/RTCP 并编写一些最少的代码来处理接收到的视频。如果您提出“好的”问题,并确保您首先阅读常见问题解答,邮件列表会非常敏感。
I know it's not going to just be a case of saving the RTP payload directly to a file, but what other steps are involved?
如果你使用openRTSP,你不需要知道这些。如果您直接使用 live555 库,您将获得整个视频帧,然后您必须自行解码并写入文件,具体取决于您想要实现的目标。如果您 DO need/want 了解 RTP 和 RTP 负载格式,请阅读相应的 RFC,例如RFC2326, RFC3550, RFC6184.
Is the data compressed, in which case I have to decompress it?
通常您希望将压缩媒体存储在一个文件中,并在播放时使用媒体播放器软件对其进行解码(否则您最终会得到巨大的文件)。
Where can I learn about what I'll need to do specific to this camera?
如果您只想保存视频,理想情况下您不需要了解相机的任何信息,除了它执行的标准(您已经执行)。