前言
项目中需求:拖动进度条时,或是在进度条上方或是在屏幕中间,显示拖动进度条位置时刻的某一帧画面
下面是参考文章一中提到(摘抄于)
下面我想到的4个方案:
1、在拖动过程中,可以通过TextureView来显示预览图,拖动进度条到某个position后,通过textureView.getBitmap()拿到对应的截图,用于展示。
2、通过MediaMetadataRetriever 只能获取你指定时间的附近的关键帧(Key frame)
MediaMetadataRetriever mmr = new MediaMetadataRetriever();
mmr.setDataSource(renderOutputFilePath);
mmr.getFrameAtTime(1x1000x1000,OPTION_CLOSEST_SYNC );//获取1秒附近的关键帧,注意,只是附近,获取不到精确位置的图片。但是用于预览也够了
3、通过GLSurfaceView,拖到到某个事件点后,来onDrawFrame,这种方式比较高效。
4、FFmpeg实现,获取某个位置的picture,github上有封装好的实现此功能的库,类似和MediaMetadataRetriever一样的用法,可以更精准,高效。
链接:https://github.com/wseemann/FFmpegMediaMetadataRetriever,原理就是取某个timebase的关键帧。然后回调出去展示。
下面记录一下自己会用FFmpegMediaMetadataRetriever的简单记录。
好记性不如烂笔头
正文
上面大佬说了四种方式,第一种和第三种
导入配置
implementation 'com.github.wseemann:FFmpegMediaMetadataRetriever-arm64-v8a:1.0.14'
部分代码
private Bitmap getVideoFrame(int duration) {
try {
Bitmap bitmap = mFFmpegMediaMetadataRetriever.getFrameAtTime(((long) duration * 1000 * 1000), FFmpegMediaMetadataRetriever.OPTION_NEXT_SYNC);
if (null != bitmap) {
return ThumbnailUtils.extractThumbnail(bitmap, 625, 272, ThumbnailUtils.OPTIONS_RECYCLE_INPUT);
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
参考文章
© 版权声明