显示延迟的网络摄像头流

时间:2013-08-20 12:29:01

标签: c# python video-streaming delay video-capture

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

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

我最初的想法是将流的前30秒记录到磁盘,然后使用VLC查看部分文件(AFAIK能够执行此操作)。这是一个值得继续工作的想法,还是我应该在过去30秒内对它进行划分并为视频帧使用某种缓冲区?

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

2 个答案:

答案 0 :(得分:2)

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

还提供了很多教程;例如http://opencv.willowgarage.com/wiki/CameraCapture

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

开始检索图像,阵列一填充,就从位置0开始播放。 新检索的图像可以存储在“正好”显示图像的位置。

答案 1 :(得分:0)

Miguel Grinberg用Python编写了一个优秀的视频流教程,连续发送JPEG帧。在这里查看他的博客文章:

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

可以快速查看这些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流)