安卓获取视频某一帧报错:getFrameAtTime: videoFrame is a NULL pointer的解决办法
前段时间项目中使用MediaMetadataRetriever库从视频中获取图片用于分析,用到了以下函数进行某个时间点处附近帧的提取。
media.getFrameAtTime(timeUS,MediaMetadataRetriever.OPTION_CLOSEST_SYNC);
使用时发现无论怎样修改第一个参数timeUS(毫秒为单位)都返回的是第一帧,同时只能获取一定量的图片,超过这个数量就会报videoFrame is a NULL pointer的错误。
参考一些博客的办法进行修改并不起作用,也以为是内存泄漏这样的问题然而并不是。
搞了一天后最终换成FFmpegMediaMetadataRetriever的库github链接
由于这个包是对原来的里面的MediaMetadataRetriever包的更新,所以函数方法基本上没有改动,但是问题却全部解决了,感觉就很迷…
附上最终的代码
public void getVideofromFile() throws IOException, InterruptedException {
//MediaMetadataRetriever media = new MediaMetadataRetriever();
FFmpegMediaMetadataRetriever media = new FFmpegMediaMetadataRetriever();
try {
File file=new File(getDir().getPath() + "/Note/" + "1.mp4");
media.setDataSource(file.getAbsolutePath());
Log.i(TAG,getDir().getPath() + "/Note/" + "1.mp4");
} catch (Exception e) {
Log.e( TAG, "文件读取错误");
e.printStackTrace();
}finally {
Log.i(TAG,"文件已经读取");
}
//Bitmap bitmap = BitmapFactory.decodeStream(fis);
String duration = media.extractMetadata(FFmpegMediaMetadataRetriever.METADATA_KEY_DURATION);
Log.i(TAG,"视频时长"+duration);
Bitmap bitmap;
for(long i=1*1000*1000; i<13
*1000*1000; i+=1000*1000) {
bitmap = media.getFrameAtTime(i+1L,FFmpegMediaMetadataRetriever.OPTION_CLOSEST_SYNC);
try {
bitmaps.offer(bitmap);
saveMyBitmap(String.valueOf(i),bitmap);
} catch (Exception e) {
e.printStackTrace();
}
}
}