欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Android MediaMetadataRetriever 从视频中截取某一帧图片

程序员文章站 2022-06-26 08:46:50
...

从视频中截取某一帧图片保存到本地

最近遇到一个问题,拍摄完视频后需要在视频中选择一帧当作视频封面

在Android中有这样一个类MediaMetadataRetriever

**官方API解释:MediaMetadataRetriever class provides a unified interface for retrieving frame and meta data from an input media file.
大概意思就是说:mediametadataretriever类提供了一个统一的接口用于从一个输入媒体文件中取得帧和元数据。**

对于官方的解释,这个类的用途我们大概已经知道了就是获取一个媒体文件的一些基本信息,比如视频文件或者音乐文件的总时长,或者视频文件的宽度和高度等基本信息

本文中使用的就是这个类MediaMetadataRetriever去从视频中获取某一帧

下面是效果图

Android MediaMetadataRetriever 从视频中截取某一帧图片

下面是具体的代码实现

        mMetadataRetriever = new MediaMetadataRetriever();
        //mPath本地视频地址
        mMetadataRetriever.setDataSource(mPath);
        //这个时候就可以通过mMetadataRetriever来获取这个视频的一些视频信息了
        String duration = mMetadataRetriever.extractMetadata(android.media.MediaMetadataRetriever.METADATA_KEY_DURATION);//时长(毫秒)
        String width = mMetadataRetriever.extractMetadata(android.media.MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH);//宽
        String height = mMetadataRetriever.extractMetadata(android.media.MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT);//高
        //上面三行代码可以获取这个视频的宽高和播放总时长
        //下面这行代码才是关键,用来获取当前视频某一时刻(毫秒*1000)的一帧
        Bitmap bitmap = mMetadataRetriever.getFrameAtTime(mCovervideoview.getCurrentPosition()*1000, MediaMetadataRetriever.OPTION_CLOSEST);
        //这时就可以获取这个视频的某一帧的bitmap了

虽然效果出来了,但是还有一个不小的问题
在下面的seekbar拖动的时候上面的VideoView并不是平滑滑动的,而是从一个画面突然蹦到另一个画面
于是就查了一下VideoView的seekto方法,最后找到原因了。

在使用Android中的VideoView或者是MediaPlayer的seekto的时候,它定位的不是具体时刻的某一帧,而是离当前时刻最近的关键帧
所以在滑动的时候就会造成画面的不连续。要怎么使滑动的时候视频连续呢,是不是把视频的每一帧都变成关键帧,具体的思路和实现方法还在思考中……

相关标签: android 视频