Video streaming &引用;“现场采样”;(非流媒体)来自IP摄像机 我写了一个C++计算机视觉应用程序,需要强 IP摄像机的视频,不播放流>。为了澄清这一点,来自IP摄像机的流传输提供了一个临时压缩的视频流,该视频流定义为时间的起点和终点,通常表示为h264。相比之下,对摄像机进行采样要求“立即”拍摄一张图像。如果映像请求发生得足够快,以致h264或类似文件更高效,则使用该压缩,但决不要在当前映像请求之前将“旧映像”及时交付到库客户端

Video streaming &引用;“现场采样”;(非流媒体)来自IP摄像机 我写了一个C++计算机视觉应用程序,需要强 IP摄像机的视频,不播放流>。为了澄清这一点,来自IP摄像机的流传输提供了一个临时压缩的视频流,该视频流定义为时间的起点和终点,通常表示为h264。相比之下,对摄像机进行采样要求“立即”拍摄一张图像。如果映像请求发生得足够快,以致h264或类似文件更高效,则使用该压缩,但决不要在当前映像请求之前将“旧映像”及时交付到库客户端,video-streaming,video-capture,live-streaming,libavcodec,Video Streaming,Video Capture,Live Streaming,Libavcodec,基本上,视频库需要提供视频采样接口,而不是视频流接口。如果两次请求视频样本之间的时间间隔为5分钟,则返回的视频图像是最近生成的图像 根据我几年来对h264、IP视频流和使用libavcodec编写应用程序的了解,满足这些要求的最有效方法是双线程体系结构。一个线程的任务是持续使用来自IP摄像头的帧,而第二个线程的任务是接受 来自第一个线程的帧,并且当库客户端请求从相机获取图像时,仅将最新的视频帧提供给库客户端。满足库要求的关键是独立于库客户端应用程序运行的视频消费线程。第一个线程需要旋转使用帧,以

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

根据我几年来对h264、IP视频流和使用libavcodec编写应用程序的了解,满足这些要求的最有效方法是双线程体系结构。一个线程的任务是持续使用来自IP摄像头的帧,而第二个线程的任务是接受 来自第一个线程的帧,并且当库客户端请求从相机获取图像时,仅将最新的视频帧提供给库客户端。满足库要求的关键是独立于库客户端应用程序运行的视频消费线程。第一个线程需要旋转使用帧,以维护相机通信健康状态和库客户端的最新帧

如果使用一个线程尝试这些要求,并且视频采样之间的时间间隔为5分钟(甚至5秒),则视频流可能已从IP摄像机中消失,因为该流未被消耗,但如果该流仍然存在,则接收软件将不得不“流过去并丢弃”相机可能已积压的任何帧


基本上,这种“采样”行为不是IP摄像机或一般视频流的正常预期行为。除了使用图片捕获接口之外,为了支持这种行为,软件需要一个“旋转线程”来消耗帧,以便在库客户端请求时可以使用最近生成的帧。不存在支持视频采样接口的视频流的“模式”或“实时配置文件”。我们需要在软件中创建一个独立于主应用程序运行的“视频帧消费线程”。这是正确的想法,还是我错了

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

事情要简单得多-大多数IP摄像头可以返回静止图像,通常是jpeg图像。我的Axis相机示例:192.121.228.226/Axis cgi/jpg/image.cgi?分辨率=640x480,压缩=25。因此,您可以简单地在代码中创建http请求来检索当前图像。如果应用程序只是偶尔对相机进行采样,那么这将起作用,但典型情况是每秒有20到30个采样的多个流。在典型情况下,可变帧速率mjpeg是理想的,但更常见的是h264,因为许多相机不提供mjpeg流,很少有相机提供可变帧速率。该应用程序需要与普通的IP摄像机配合使用,而且它们往往没有快速的静态捕获。