Eliah John
Eliah John

Reputation: 25

Show webcam stream with delay

I've been trying to find a way to show the stream of my webcam with a 30 second delay. I found out that VLC is able to do this, but the problem is that the framerate is much too low and it's not smooth or viewable at all. I have to run this on a fairly old laptop with a better webcam that I own now, so I guess it's not an option.

I am able somewhat familiar with c#/c++ and python so I thought that I might make a solution of my own as the task seems fairly easy. Though, the problem is, I don't know where to start and any nudges in the right direction would be much appreciated.

My initial idea was to record first 30 seconds of the stream to the disk, then use VLC to view partial file (AFAIK it's able to do that). Is it an idea worth working on or should I scratch it and use some sort of a buffer for the video frames in the last 30 seconds?

Again, any nudges in the right direction will be much appreciated, thanks!

Upvotes: 0

Views: 1653

Answers (2)

Prakhar Agarwal
Prakhar Agarwal

Reputation: 2842

Miguel Grinberg has written an excellent video streaming tutorial in Python which sends JPEG frames successively. Check his blog post here:

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

Each of these JPEG can be quickly reviewed and then broadcasted. [To take the required Delay in consideration]

As far as getting the input video feed is concerned, you can interface a webcam using OPENCV. OpenCV uses VideoCapture which returns raw images as bytes. These bytes needs to be encoded to JPEG and interfaced with Miguel's code.

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

This approach will help you cater all the required features:

  • No internet required
  • Adjustable delay - Easily control the delay and the processing you want to perform on each frame
  • Good Quality
  • Record on Demand - Store the captured frames as per need
  • Have a record back feature, by just saving the previous 24*x frames (24fps stream)

Upvotes: 0

Robert Caspary
Robert Caspary

Reputation: 1624

Take a look at OpenCV. It can retrieve and show images from a webcam.

A lot a of tutorials are also available; e.g. http://opencv.willowgarage.com/wiki/CameraCapture

So simply create an array (or whatever) to hold the amount of pictures to be expected in 30 sec (FPS*30).

Start to retrieve images and as soon as the array is filled start to play from position 0. Newly retrieved images can than be stored at the position from the "just" shown image.

Upvotes: 2

Related Questions