最近因为项目需要,要实现对网络视频任意帧进行截屏的功能,本着“拿来主义”的精神,开始在网上进行搜索,并进行测试,然而事实再一次告诉我,度娘不是万能的,
下面给出一个真实有效的方法,话不多说,直接上代码:
new Thread(new Runnable() {
@Override
public void run() {
MediaMetadataRetriever mediaMetadataRetriever = new MediaMetadataRetriever();
Bitmap bitmap = null;
try {
HashMapparams = new HashMap<>();
params.put("Accept-Encoding", "gzip, deflate, sdch");
params.put("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
mediaMetadataRetriever.setDataSource(mediaPlayer.getCurrentURI().toString(), params);
// 获取图片
bitmap = mediaMetadataRetriever.getFrameAtTime(currentPlayPosition, MediaMetadataRetriever.OPTION_NEXT_SYNC);
//将图片保持到相册中
saveBitmapToGallery(bitmap);
} catch (Exception e) {
e.printStackTrace();
} finally {
mediaMetadataRetriever.release();
if (bitmap != null) {
bitmap.recycle();
}
}
}
}).start();
PS: params 参数的由来,是一个血泪史,前面一直不知道该传什么,总是报:java.lang.RuntimeException: setDataSource failed: status = 0x80000000 这个坑爹的错误,后来想到的是抓取视频流,看看流的头是什么,将之设置进来,果断的就OK了。