延迟显示网络摄像头流
本文关键字:摄像头 网络 显示 延迟 | 更新日期: 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流),即可实现回录功能