0

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

我对 c#/c++ 和 python 有点熟悉,所以我想我可以自己解决,因为这个任务看起来很简单。虽然,问题是,我不知道从哪里开始,任何朝着正确方向的轻推将不胜感激。

我最初的想法是将流的前 30 秒记录到磁盘,然后使用 VLC 查看部分文件(AFAIK 它能够做到这一点)。这是一个值得研究的想法还是我应该从头开始并在最后 30 秒内为视频帧使用某种缓冲区?

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

4

2 回答 2

2

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

还有很多教程可用;例如http://opencv.willowgarage.com/wiki/CameraCapture

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

开始检索图像,一旦阵列被填满,就从位置 0 开始播放。新检索到的图像可以存储在“刚刚”显示的图像的位置。

于 2013-08-20T12:50:42.093 回答
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 流)
于 2017-07-15T14:56:45.933 回答