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;
        }
    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值