我们如何在Android中获取帧

时间:2014-05-21 07:04:05

标签: android video frame android-sdcard

实际上我需要从视频中获取所有帧,但我使用Mediametadatareteriver,缩略图,时间戳来获取帧时,反复获取第一帧然后是特定时间帧。

我通过更改所有GetFrameAtTime(选项)尝试了大量修复,但仍保持不变。

我的视频持续时间是127040(2:07秒)这里我分为32帧,SDCard中的保存帧可以查看所有32帧但是重复相同的帧。

我应该在没有FFMPEG和xuggler的帮助下得到这些。

是否有任何替代方法或任何其他库文件可供Android使用,如果有帮助我的朋友。

这是我的完整代码

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Random;

import android.graphics.Bitmap;
import android.media.MediaMetadataRetriever;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.app.Activity;
import android.view.Menu;
import android.widget.Toast;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        File videoFile=new File(Environment.getExternalStorageDirectory().getAbsolutePath()+"/Movies/MEMO.mp4";

        Uri videoFileUri=Uri.parse(videoFile.toString());

        MediaMetadataRetriever retriever = new MediaMetadataRetriever();
        retriever.setDataSource(videoFile.getAbsolutePath());
        ArrayList<Bitmap> rev=new ArrayList<Bitmap>();


        //Create a new Media Player
        MediaPlayer mp = MediaPlayer.create(getBaseContext(), videoFileUri);
        int millis = mp.getDuration();
        for(int i=0;i<millis;i+=100){
           Bitmap bitmap=retriever.getFrameAtTime(i,MediaMetadataRetriever.OPTION_CLOSEST);
           rev.add(bitmap);

          try {
              saveFrames(rev);
        } catch (IOException e) {

            e.printStackTrace();
        }
        }
    }



    public void saveFrames(ArrayList<Bitmap> saveBitmapList) throws IOException{

        String folder = Environment.getExternalStorageDirectory().toString();
        File saveFolder = new File(folder + "/Movies/new /";
        if(!saveFolder.exists()){
           saveFolder.mkdirs();
        }


        int i=1;
        for (Bitmap b : saveBitmapList){
           ByteArrayOutputStream bytes = new ByteArrayOutputStream();
            b.compress(Bitmap.CompressFormat.JPEG, 40, bytes);

            File f = new File(saveFolder,("frame"+i+".jpg");

            f.createNewFile();

            FileOutputStream fo = new FileOutputStream;
            fo.write(bytes.toByteArray());

               fo.flush();
               fo.close();

            i++;
        }

    }

1 个答案:

答案 0 :(得分:1)

FFmpegMediaMetadataRetriever应该可以解决您的问题。可以找到要测试的示例APK here。只需单击SD卡上的文件,系统就会提示您使用演示应用程序打开它。

要使用该库,只需将this文件的内容解压缩到项目“libs”文件夹中。并从以下位置更改现有的import语句:

import android.media.MetadataRetriever;

为:

import wseemann.media.FFmpegMediaMetadataRetriever;

并改变:

MediaMetadataRetriever retriever = new MediaMetadataRetriever();

为:

FFmpegMediaMetadataRetriever retriever = new FFmpegMediaMetadataRetriever();