美文网首页Android开发Android知识
Android - 视频提取图片方法

Android - 视频提取图片方法

作者: fish_leong | 来源:发表于2017-06-07 16:01 被阅读174次

    Android 提取视频图片

    • android.media.MediaMetadataRetriever 提供了一个统一的接口用于从一个媒体文件中取得帧和元数据

    • API 10 之前没有开放,但能通过反射实现

    • 完整Demo地址:Video2Image(https://github.com/fish-leong/Video2Image)

    • 下面看使用方法

           MediaMetadataRetriever mediaMetadataRetriever = new MediaMetadataRetriever();
            mediaMetadataRetriever.setDataSource(filePath);
            final String duration = mediaMetadataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);//Unit ms 获取到视频的时长,单位毫秒
            final String mime = mediaMetadataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_MIMETYPE);//mime 视频类型 video/mp4 等...
            publishProgress(new Runnable() {
                @Override
                public void run() {
                    tv_file_duration.setText((duration + " ms"));
                    tv_file_mime.setText(mime);
                }
            });
            final int seconds = Integer.valueOf(duration) / 1000;// getFrameAtTime by custom second 这里按秒为单位提取
            publishProgress(new Runnable() {
                @Override
                public void run() {
                    progressBar.setMax(seconds - 1);
                }
            });
            File directory = new File(outputPath);
            if (!directory.mkdirs()) {
                publishProgress(new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(MainActivity.this, "can not create folder:" + outputPath, Toast.LENGTH_LONG).show();
                    }
                });
            } else {
                ProgressRunnable progressRunnable = new ProgressRunnable();
                //开始提取
                for (int i = 0; i < seconds; i++) {
                    progressRunnable.run(i);
                    //注意,第一个参数单位是微秒
                    //第二个参数
                    //OPTION_PREVIOUS_SYNC  检索出的同步帧(可能)在该时间戳之前,也可能就是该时间戳的同步帧
                    //OPTION_NEXT_SYNC  检索出的同步帧可能(可能)在该时间戳之后,也可能就是该时间戳的同步帧
                    //OPTION_CLOSEST_SYNC 检索最接近该时间戳的同步帧
                    //OPTION_CLOSEST   检索出的同步帧可能是最接近该时间戳的帧,也肯就是该时间戳的帧,如果在该时间戳段上没有找到同步帧,则会与其他OPTION相比,但这样会性能开销会很大(这里不太明白)
                    Bitmap bitmap = mediaMetadataRetriever.getFrameAtTime(i * 1000 * 1000, MediaMetadataRetriever.OPTION_CLOSEST_SYNC);
                    String newPath = outputPath + i + extensionName;
                    File file = new File(newPath);
                    file.deleteOnExit();
                    try {
                        if (file.createNewFile()) {
                            //保存到文件
                            FileOutputStream fileOutputStream = new FileOutputStream(file);
                            bitmap.compress(CompressFormatType, 100, fileOutputStream);
                            bitmap.recycle();
                            fileOutputStream.close();
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
                //update view
                final File[] files = directory.listFiles(imageExtensionNameFilter);
                publishProgress(new Runnable() {
                    @Override
                    public void run() {
                        //load images
                        gridView.setAdapter(new GridViewAdapter(files));
                    }
                });
                //finish
                publishProgress(new Runnable() {
                    @Override
                    public void run() {
                        //finish tip
                        btn_choose.setEnabled(true);
                        Toast.makeText(MainActivity.this, "finish", Toast.LENGTH_LONG).show();
                    }
                });
            }
      


    相关文章

      网友评论

        本文标题:Android - 视频提取图片方法

        本文链接:https://www.haomeiwen.com/subject/iizofxtx.html