来自IP摄像机的“实时采样”(非流式传输)

问题描述 投票:1回答:1

我正在编写C ++计算机视觉应用程序,其要求的行为为采样 IP摄像机的视频,不播放其视频流。为了清楚起见,来自IP摄像机的提供了一个时间压缩的视频流,该视频流定义为时间的起点和终点,通常表示为h264。相反,采样摄像机正在请求单个图像“现在”。如果图像请求发生得足够快以至于h264或类似的文件更有效,则使用该压缩,但不要从当前图像请求之前及时向库客户端提供“旧图像”。 基本上,视频库需要提供视频采样接口,而不是视频流接口。如果两次视频采样请求之间的时间为5分钟,则返回的视频图像是最新生成的图像。

根据我对h264,IP视频流和使用libavcodec编写应用程序的了解,几年来,满足这些要求的最有效方法是两线程体系结构。一个线程的工作是不断消耗IP摄像机的帧,而第二个线程的工作是接受从第一个线程获取帧,并且仅当它们从摄像机请求图像时才将最新的视频帧提供给库客户端。满足库要求的关键是与库客户端应用程序分开运行的视频消耗线程。第一个线程需要旋转消耗帧,以维护相机通信的运行状况并维护库客户端的最新帧。

如果尝试通过一个线程尝试这些要求,并且两次视频采样之间的时间为5分钟(甚至5秒),则由于没有消耗该流,因此该视频流可能已从IP摄像机中消失,但是如果该流仍然有效的接收软件必须“流过去并丢弃”摄像机可能积压的任何帧。

基本上,这种“采样”行为不是IP摄像机通常的预期行为,也不是通常的视频流。缺少使用图片捕获界面的功能,为了支持此行为,软件需要使用“自旋线程”来消耗帧,因此,当库客户端请求时,可以使用最新生成的帧。没有支持视频采样接口的视频流的“模式”或“实时配置文件”。需要在软件中创建此程序,并带有一个“视频帧消耗线程”,该线程与主应用程序分开运行。这是正确的想法,还是我在某个地方错了?

我正在编写一个C ++计算机视觉应用程序,该应用程序具有采样IP摄像机视频而不播放其流的所需行为。为了明确起见,来自IP摄像机的流在时间上传递...

video-streaming video-capture live-streaming libavcodec
1个回答
0
投票
假定大多数IP摄像机都支持RTP。我会使用Live555之类的库来接收相机的H.264流。然后,我将轻松解析H.264流以标识流中的帧类型和帧边界。我将从I帧开始缓冲一组帧(GOP)。一旦获得下一个I帧,请先清除缓冲区。如果收到样本请求-将H.264缓冲区发送到H.264解码器,然后将从解码器出来的最后一帧作为样本请求发送到视频库。我可能在一个线程上运行RTP接收器和缓冲区生成器,而在另一个线程上运行库请求接收器。您必须对缓冲区进行某种锁定。解码进行时无法清除缓冲区。
© www.soinside.com 2019 - 2024. All rights reserved.