"Live Sampling"(不是流式传输)来自网络摄像机

"Live Sampling" (not streaming) from an IP Video Camera

我正在编写一个 C++ 计算机视觉应用程序,其要求的行为是 采样 IP 摄像机的视频, 不播放他们的流。澄清一下,来自 IP 摄像机的 streaming 提供时间压缩的视频流,定义为开始和结束时间点,通常表示为 h264。相比之下,采样 摄像机请求单个图像 "now"。如果图像请求发生得足够快以至于 h264 或类似的更有效,则使用该压缩,但永远不要在当前图像请求之前及时将 "old image" 传递给库客户端。

基本上,视频库需要提供视频采样接口,而不是视频流接口。如果两次视频样本请求之间的时间间隔为 5 分钟,则返回的视频图像是最近生成的图像。

根据我对 h264、IP 视频流和使用 libavcodec 编写应用程序的理解几年,满足这些要求的最有效方法是双线程架构。第一个线程的工作是不断地从网络摄像机中获取帧,而第二个线程的工作是接受 从第一个线程中获取帧,并且仅在库客户端从相机请求图像时才将最新的视频帧提供给库客户端。满足图书馆要求的关键是将视频消费线程 运行 与图书馆客户端的应用程序分开。第一个线程需要旋转消耗帧,以保持相机通信健康并为库客户端维护最新帧。

如果这些要求是用一个线程尝试的,并且视频样本之间的时间是 5 分钟(甚至 5 秒),视频流可能已经从 IP 摄像机中消失,因为流没有被消耗,但是如果流仍然存在,接收软件必须 "stream past and throw away" 相机可能积压的任何帧。

基本上,这种 "sampling" 行为不是 IP 摄像机或一般视频流的正常预期行为。如果不使用图片捕获界面,为了支持此行为,软件需要一个 "spin thread" 消耗帧,以便在库客户端请求时可以使用最近生成的帧。对于支持视频采样接口的视频流,没有 "mode" 或 "live profile"。人们需要在软件中创建它,并使用与主应用程序分开运行的 "video frame consuming thread"。这是正确的想法,还是我在某个地方错了?

假设大多数网络摄像机都支持 RTP。我会使用像 Live555 这样的库来接收您相机的 H.264 流。然后我会轻轻地解析 H.264 流以识别流中的帧类型和帧边界。我会缓冲一组帧 (GOP) - 从 I 帧开始。一旦你得到下一个 I 帧 - 首先清除你的缓冲区。 如果您收到样本请求 - 将您的 H.264 缓冲区发送到 H.264 解码器,然后将来自解码器的最后一帧作为样本请求发送到视频库。 我可能 运行 一个线程上的 RTP 接收器和缓冲区生成器以及另一个线程上的库请求接收器。您必须对缓冲区进行某种锁定。解码正在进行时无法清除缓冲区。