获取视频的帧

原创
2015/07/01 09:26
阅读数 5.6K

1 本地文件

    MediaMetadataRetriever  ---android API 10 之前有 不对外开放 -可以反射

    http://developer.android.com/reference/android/media/MediaMetadataRetriever.html

private void initView() {
    imgPic = (ImageView) findViewById(R.id.img_pic);
    seekbar = (SeekBar) findViewById(R.id.seekbar);
    mmr = new MediaMetadataRetriever();
    mmr.setDataSource("/sdcard/3.mp4");
    // 取得视频的长度(单位为毫秒)
    String time = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);
    seekbar.setMax(Integer.parseInt(time) * 1000);
    bt = (Button) findViewById(R.id.bt);
    bt.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
	    Toast.makeText(MainActivity.this, " " + seekbar.getProgress(), 1).show();

	    Bitmap bitmap = mmr.getFrameAtTime(seekbar.getProgress(),
						MediaMetadataRetriever.OPTION_CLOSEST_SYNC);
	    // Bitmap bitmap = mmr.getFrameAtTime(seekbar.getProgress());
	    imgPic.setImageBitmap(bitmap);
	System.out.println(mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DATE)+ "");
	System.out.println(mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_MIMETYPE)+ "");
//	mmr.release();
	}
    });
}

 

另外得说下

ThumbnailUtils.createVideoThumbnail(filePath, kind);  获取视频的缩略图  - 也可以获取图片 

源码 如下 --- 其实用的还是 MediaMetadataRetriever 

    public static Bitmap createVideoThumbnail(String filePath, int kind) {
        Bitmap bitmap = null;
        MediaMetadataRetriever retriever = new MediaMetadataRetriever();
        try {
            retriever.setDataSource(filePath);
            bitmap = retriever.getFrameAtTime(-1);
        } catch (IllegalArgumentException ex) {
            // Assume this is a corrupt video file
        } catch (RuntimeException ex) {
            // Assume this is a corrupt video file.
        } finally {
            try {
                retriever.release();
            } catch (RuntimeException ex) {
                // Ignore failures while cleaning up.
            }
        }

        if (bitmap == null) return null;

        if (kind == Images.Thumbnails.MINI_KIND) {
            // Scale down the bitmap if it's too large.
            int width = bitmap.getWidth();
            int height = bitmap.getHeight();
            int max = Math.max(width, height);
            if (max > 512) {
                float scale = 512f / max;
                int w = Math.round(scale * width);
                int h = Math.round(scale * height);
                bitmap = Bitmap.createScaledBitmap(bitmap, w, h, true);
            }
        } else if (kind == Images.Thumbnails.MICRO_KIND) {
            bitmap = extractThumbnail(bitmap,
                    TARGET_SIZE_MICRO_THUMBNAIL,
                    TARGET_SIZE_MICRO_THUMBNAIL,
                    OPTIONS_RECYCLE_INPUT);
        }
        return bitmap;
    }

 

2 网络视频流

http://www.tuicool.com/articles/uqmUFfY  中接受两种方法 

方法一 

MediaMetadataRetriever.setDataSource(String uri,  Map<String, String> headers)  

---算法异常 ---问题更近 ---

方法二   --- 可以获取 

在github上找到了另一个扩展版的FFMPEG MediaMetadataRetriever ,提供了一个可以获取视频详细信息和缩略图的统一接口,支持API 7+,(android 自带MediaMetadataRetriever仅支持API 10+),同时支持Uri

,支持的文件类型 file, http, https, mms and mmsh 支持的编码格式(音频&视频): aac, acc+, avi, flac, mp2, mp3, mp4, ogg, 3gp and more! 扩展支持: ICY Metadata (SHOUTcast metadata) 使用方法异常简单,只需将下边的包下载到本地解压然后把libs中的文件拷贝到自己项目的libs目录下即可https://github.com/wseemann/FFmpegMediaMetadataRetriever/blob/master/fmmr-library/prebuilt-libs.tar.gz .

private Bitmap getBitMap() {
		Bitmap b = null;
		// Retrieve all metadata.
		List<Metadata> metadata = new ArrayList<Metadata>();

		if (mUri == null) return null;
		FFmpegMediaMetadataRetriever fmmr = new FFmpegMediaMetadataRetriever();
		try {
			fmmr.setDataSource(mUri);
			for (int i = 0; i < Constants.METADATA_KEYS.length; i++) { //注意
				String key = Constants.METADATA_KEYS[i];
				String value = fmmr.extractMetadata(key);

				if (value != null) {
					metadata.add(new Metadata(key, value));
					Log.i(MetadataLoader.class.getName(), "Key: " + key
							+ " Value: " + value);
				}
			}
			b = fmmr.getFrameAtTime();
			if (b != null) {
				Bitmap b2 = fmmr.getFrameAtTime(seekbar.getProgress(),
						FFmpegMediaMetadataRetriever.OPTION_CLOSEST_SYNC);
				if (b2 != null) {
					b = b2;
				}
			}

			if (b != null) {
				metadata.add(new Metadata("image", b));
				Log.i(MetadataLoader.class.getName(), "Extracted frame");
			} else {
				Log.e(MetadataLoader.class.getName(), "Failed to extract frame");
			}
		} catch (IllegalArgumentException ex) {
			ex.printStackTrace();
		} finally {
			fmmr.release();
		}
		return b;
	}

vitemio  在线测试流 http://devimages.apple.com/iphone/samples/bipbop/gear1/prog_index.m3u8

 

2013年未解决的问题 现在终于知道了 当年不了解ffmpeg

 

 

code 

地址 百度/android_code/获取视频的帧  --- https://pan.baidu.com/s/1slTb7zf

展开阅读全文
打赏
0
2 收藏
分享
加载中
更多评论
打赏
0 评论
2 收藏
0
分享
返回顶部
顶部