2013-08-20 60 views
0

我一直在试图找到一种方式来显示我的摄像头流30秒的延迟。 我发现VLC能够做到这一点,但问题是,帧率太低,并且不流畅或可见。我必须在一台相当旧的笔记本电脑上运行这个更好的摄像头,因此我认为这不是一个选项。显示摄像头流延迟

我有点熟悉c#/ C++和python,所以我认为我可以为自己做一个解决方案,因为任务看起来相当简单。虽然,问题是,我不知道从哪里开始,并且正确方向的任何推动都会受到高度赞赏。

我最初的想法是记录流的前30秒到磁盘,然后使用VLC查看部分文件(AFAIK它能够做到这一点)。这是一个值得处理的想法吗?还是应该在最近30秒内使用某种缓冲器来处理视频帧?

再次,任何在正确的方向轻推将非常感谢,谢谢!

回答

2

看一看OpenCV。 它可以检索并显示来自网络摄像头的图像。

许多教程也可用;例如http://opencv.willowgarage.com/wiki/CameraCapture

因此,只需创建一个数组(或其他)来保存30秒内预期的图片数量(FPS * 30)。

开始检索图像,并且一旦数组被填充,就从位置0开始播放。 新检索的图像可以存储在“刚”显示的图像的位置。

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流)