Thursday, December 26, 2013

Capture a Video from Webcam with JavaCV

Last post I told how crazy I was and why did I wanted put my hands on image processing. If you haven't read it yet try that first Getting Started with Opencv via Javacv. It is time to get start with some advanced stuffs. Don't get too much curious because I'm just getting started with this. Though we have used Webcam to capture a photos, main purpose of that is to get on video chat. So It means that we can record video from that. As I mentioned in my early post I have some experience with JMF to do that. But since now JMF is dead and we are dealing with my crazy idea it is better to try with JavaCV.
It is time that "You are being watched. The government has a secret system: a machine that spies on you every hour of every day" - Person of Interest
So I'm gonna tell you how to capture some videos from Webcam with JavaCV.
Lets get started. In-order to capture videos you must include appropriate ffmpeg...jar file to your class path. This can be found in the JavaCPP bundle that you already downloaded. Make sure you only include the suitable library version. That means if you are using x64 verison then used x64 version otherwise go with x86 version.

So all together we need following 4 libraries (Since I'm experiment using x64 here I mentioned latest x64 versions that I used)

  1. javacv.jar
  2. javacpp.jar
  3. opencv-2.4.6.0-windows-x86_64.jar
  4. ffmpeg-20130915-git-7ac6c63-windows-x86_64.jar

Create a new java class and have following code on that.

 import com.googlecode.javacv.CanvasFrame;  
 import com.googlecode.javacv.FFmpegFrameRecorder;  
 import com.googlecode.javacv.FrameGrabber;  
 import com.googlecode.javacv.FrameRecorder;  
 import com.googlecode.javacv.OpenCVFrameGrabber;  
 import com.googlecode.javacv.cpp.avutil;  
 import com.googlecode.javacv.cpp.opencv_core;  
 import java.util.logging.Level;  
 import java.util.logging.Logger;  

 class VideoTest {  
   public static void main(String[] args) {  
     try {  
       OpenCVFrameGrabber grabber = new OpenCVFrameGrabber(0);  
       grabber.start();  
       opencv_core.IplImage grabbedImage = grabber.grab();  
       CanvasFrame canvasFrame = new CanvasFrame("Video with JavaCV");  
       canvasFrame.setCanvasSize(grabbedImage.width(), grabbedImage.height());  
       grabber.setFrameRate(grabber.getFrameRate());  

       FFmpegFrameRecorder recorder = new FFmpegFrameRecorder("D:/Video/mytestvideo.mp4", grabber.getImageWidth(), grabber.getImageHeight());  // specify your path
       recorder.setFormat("mp4");  
       recorder.setFrameRate(30);  
       recorder.setVideoBitrate(10 * 1024 * 1024);  

       recorder.start();  
       while (canvasFrame.isVisible() && (grabbedImage = grabber.grab()) != null) {  
         canvasFrame.showImage(grabbedImage);  
         recorder.record(grabbedImage);  
       }  
       recorder.stop();  
       grabber.stop();  
       canvasFrame.dispose();  

     } catch (FrameGrabber.Exception ex) {  
       Logger.getLogger(VideoTest.class.getName()).log(Level.SEVERE, null, ex);  
     } catch (FrameRecorder.Exception ex) {  
       Logger.getLogger(VideoTest.class.getName()).log(Level.SEVERE, null, ex);  
     }  
   }  
 }  
Now compile and run this file. You can see that your camera get open and your beautiful face appearing on a window. Just wait for few seconds and close it. Then go to the file path that you specified. If you did everything as I mentioned you can see a video there. Run that from your favorite player.

you can see that I have set frame rate, bit rate and format as well. Try with different values and check what is get change. There are also some other parameters as well.

 recorder.setVideoQuality(videoQuality);  
 recorder.setVideoCodec(videoCodec);  
 recorder.setPixelFormat(pixelFormat);  

Try them as well. I'm didn't discuss how to detect face in this post. But don't get upset. It will be surely on next post.


7 comments:

  1. thank you sir.. your code is 100% working.. but i cant record the audio..i need to record video and audio both..can you help me sir? in advance thanks

    ReplyDelete
  2. but sir one doubt..while playing video.. video runs very fast.... what to do sir?

    ReplyDelete
  3. sir the video is recorded in fast forward moode...can you please tell sir why is it so???

    ReplyDelete
  4. Anyone who ever wanna know about,How to play the grabbed audio frame from FrameGrabber.

    One may look at my blog,Clearly posted what you want,

    http://revealedtricks4u.blogspot.in/2015/03/play-audio-sample-grabbed-using-javacv.html

    Regards,
    Shihab

    ReplyDelete
  5. I’m going to read this. I’ll be sure to come back. thanks for sharing. and also This article gives the light in which we can observe the reality. this is very nice one and gives indepth information. thanks for this nice article... porn

    ReplyDelete
  6. I’m going to read this. I’ll be sure to come back. thanks for sharing. and also This article gives the light in which we can observe the reality. this is very nice one and gives indepth information. thanks for this nice article... www.sexliga.pl

    ReplyDelete
  7. This site is really a walk-through for all of the data you wanted about it and didn’t know who to ask. Glimpse here, and you’ll undoubtedly discover it. best asian cams

    ReplyDelete