Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

extract all video frames in Android

I recorded a Video for limited time. Now i want to fetch all frames of video. I am using the below code and by using it i am able to get frames but i am not getting all video frames. 3 to 4 frames are repeated then i got a different frame. But as we all know we can get 25- 30 frames in a second to display smooth video. How to get all frames.

 for (int i = 0; i < 30; i++) {

                    Bitmap bArray = mediaMetadataRetriever.getFrameAtTime(
                            1000000 * i,
                            MediaMetadataRetriever.OPTION_CLOSEST);

                    savebitmap(bArray, 33333 * i);

                }

I don't want to use NDK. I got this link don't know what should be the value for "argb8888". I am getting error here. Can anyone explain how to do it. Getting frames from Video Image in Android

like image 758
Akanksha Rathore Avatar asked Mar 27 '14 10:03

Akanksha Rathore


People also ask

How do I extract still frames from a video?

Take a screenshot when the video is playing simply by pressing the Snapshot icon or pressing CTRL+ALT+S. You can use the Left or Right arrow button on the keyboard to playback the video frame by frame and save the frame in image format.


2 Answers

I faced the same problem before and the Android's MediaMetadataRetriever seems not appropriated for this task since it doesn't have a good precision. I used a library called "FFmpegMediaMetadataRetriever" in android studio:

  1. Add this line in your build.graddle under module app:

    compile 'com.github.wseemann:FFmpegMediaMetadataRetriever:1.0.14'

  2. Rebuild your project.

  3. Use the FFmpegMediaMetadataRetriever class to grab frames with higher precision:

    FFmpegMediaMetadataRetriever med = new FFmpegMediaMetadataRetriever();
    
    med.setDataSource("your data source");
    
  4. and in your loop you can grab frame using:

     Bitmap bmp = med.getFrameAtTime(i*1000000, FFmpegMediaMetadataRetriever.OPTION_CLOSEST);
    
like image 96
Milorenus Lomaliza Avatar answered Sep 27 '22 21:09

Milorenus Lomaliza


To get image frames from video we can use ffmpeg.For integrating FFmpeg in android we can use precompiled libraries like ffmpeg-android.

To extract image frames from a video we can use below command

String[] complexCommand = {"-y", "-i", inputFileAbsolutePath, "-an", "-r", "1/2", "-ss", "" + startMs / 1000, "-t", "" + (endMs - startMs) / 1000, outputFileAbsolutePath};

Here,

-y

Overwrite output files

-i

ffmpeg reads from an arbitrary number of input “files” specified by the -i option

-an

Disable audio recording.

-r

Set frame rate

-ss

seeks to position

-t

limit the duration of data read from the input file

Here in place of inputFileAbsolutePath you have to specify the absolute path of video file from which you want to extract images.

For complete code check out this on my repository .Inside extractImagesVideo() method I am running command for extracting images from video.

For complete tutorial regarding integration of ffmpeg library and using ffmpeg commands to edit videos, check out this post which I have written on my blog.

like image 39
Android Developer Avatar answered Sep 27 '22 19:09

Android Developer