延迟显示网络摄像头流

本文关键字:摄像头 网络 显示 延迟 | 更新日期: 2023-09-27 18:28:17

我一直在试图找到一种延迟30秒显示网络摄像头流的方法。我发现VLC可以做到这一点,但问题是帧速率太低,而且它根本不平滑或不可见。我必须在一台相当旧的笔记本电脑上运行这个,我现在拥有一个更好的网络摄像头,所以我想这不是一个选择。

我对c#/c++和python有点熟悉,所以我想我可能会制定自己的解决方案,因为这项任务看起来相当容易。不过,问题是,我不知道从哪里开始,任何朝着正确方向的推动都将不胜感激。

我最初的想法是将流的前30秒记录到磁盘上,然后使用VLC查看部分文件(AFAIK可以做到这一点)。这是一个值得研究的想法吗?还是我应该把它擦掉,并为最后30秒的视频帧使用某种缓冲区?

再次强调,任何朝着正确方向的推动都将不胜感激,谢谢!

延迟显示网络摄像头流

看看OpenCV。它可以从网络摄像头中检索和显示图像。

还有很多教程可供选择;例如。http://opencv.willowgarage.com/wiki/CameraCapture

因此,只需创建一个数组(或其他任何数组),即可容纳30秒内预期的图片数量(FPS*30)。

开始检索图像,阵列填充后立即从位置0开始播放。新检索到的图像可以存储在"刚刚"显示的图像的位置。

Miguel Grinberg用Python编写了一个出色的视频流教程,可以连续发送JPEG帧。点击此处查看他的博客文章:

http://blog.miguelgrinberg.com/post/video-streaming-with-flask1

这些JPEG中的每一个都可以快速查看,然后进行广播。【考虑所需的延迟】

就获得输入视频馈送而言,您可以使用OPENCV连接网络摄像头。OpenCV使用VideoCapture,它以字节形式返回原始图像。这些字节需要编码为JPEG,并与Miguel的代码接口。

import cv2
class VideoCamera(object):
    def __init__(self):
    # Using OpenCV to capture from device
    self.video = cv2.VideoCapture(0)
    def __del__(self):
    self.video.release()
    def get_frame(self):
    success, image = self.video.read()
    # We are using Motion JPEG, but OpenCV defaults to capture raw images,
    # so we must encode it into JPEG in order to correctly display the
    # video stream.
    ret, jpeg = cv2.imencode('.jpg', image)
    return jpeg.tobytes()

这种方法将帮助您满足所有要求的功能:

  • 无需互联网
  • 可调延迟-轻松控制延迟和您想在每帧上执行的处理
  • 质量好
  • 按需录制-根据需要存储捕获的帧
  • 只需保存之前的24*x帧(24fps流),即可实现回录功能