1. 程式人生 > >Android 播放視訊並獲取指定時間的幀畫面

Android 播放視訊並獲取指定時間的幀畫面

轉載:https://blog.csdn.net/u011506413/article/details/51704445

 

Android 播放視訊並獲取指定時間的幀畫面

 

六.VideoView播放視訊,MediaMetadataRetriever獲取幀畫面(就是你了!)

能夠正常獲取幀畫面,並且畫面之間不重複,即不是隻取關鍵幀,而是去取相應時間點的幀畫面。若不儲存為圖片(.png/.jpg),耗時最多為0.4s,基本達到要求。

參考:http://yashirocc.blog.sohu.com/175636801.html

public class MoviePlayerActivity extends Activity implements OnTouchListener, OnClickListener, Runnable {

    private static final String TAG = "ImageLight";
    private String file_path;
    private VideoView videoView;
    private Button movie_play;
    private boolean playButtonVisible;
    private boolean playPause;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);    // full screen
        requestWindowFeature(Window.FEATURE_NO_TITLE);                            // no title
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);        // landscape or horizontal screen

        super.onCreate(savedInstanceState);
        setContentView(R.layout.movie_player_activity);
        movie_play = (Button) findViewById(R.id.movie_videoview_play);
        movie_play.setOnClickListener(this);
        movie_play.setText("Play");

        Intent intent = getIntent();
        file_path = intent.getStringExtra("file_path");

        videoView = (VideoView) findViewById(R.id.movie_palyer_videoview);
        videoView.setMediaController(null);
        // videoView.setMediaController(new MediaController(this));
        videoView.setVideoPath(file_path);
        videoView.start();
        videoView.requestFocus();

        Thread screenShootThread = new Thread(this);
        screenShootThread.start();
        videoView.setOnTouchListener(this);
    }

    @Override
    public void run() {
        MediaMetadataRetriever metadataRetriever = new MediaMetadataRetriever();
        metadataRetriever.setDataSource(file_path);
        
        for (int i = 40000 * 1000; i < 50 * 1000 * 1000; i += 500 * 1000) {
//            try {
//                Thread.sleep(500);
//            } catch (InterruptedException e) {
//                e.printStackTrace();
//            }            
            Bitmap bitmap = metadataRetriever.
                    getFrameAtTime(videoView.getCurrentPosition()*1000, MediaMetadataRetriever.OPTION_CLOSEST);
            Log.i(TAG, "bitmap---i: " + i/1000);
            
            String path = Environment.getExternalStorageDirectory() + "/bitmap/" + i + ".png";
            FileOutputStream fileOutputStream = null;
            try {
                fileOutputStream = new FileOutputStream(path);
                bitmap.compress(Bitmap.CompressFormat.PNG, 90, fileOutputStream);
                Log.i(TAG, "i: " + i/1000);
            } catch (Exception e) {
                Log.i(TAG, "Error: " + i/1000);
                e.printStackTrace();
            } finally {
                if (fileOutputStream != null) {
                    try {
                        fileOutputStream.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }          
            bitmap.recycle();
        }
    }

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        if (!playButtonVisible) {
            movie_play.setVisibility(View.VISIBLE);
            movie_play.setEnabled(true);
        } else {
            movie_play.setVisibility(View.INVISIBLE);
        }
        playButtonVisible = !playButtonVisible;
        return false;
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()) {
        case R.id.movie_videoview_play:
            if (!playPause) {
                movie_play.setText("Pause");
            } else {
                movie_play.setText("Play");
            }
            playPause = !playPause;
            break;
        default:
            break;
        }
    }
}