android how to capture a frame bitmap from video

时间:2022-09-02 00:22:04
我想对快要暂停或者是快要停止的video的当前画面的图片进行提取。该通过什么方法去实现呢。我去看了关于cpp下面的android_media_MediaPlayer_getFrameAt(JNIEnv *env, jobject thiz, jint msec)可它没实现,只是返回个NULL,我想根据它以前的版本,来实现这个方法。之后通过JNI来绑定,有哪个做过这块的,希望能一起分享下。i need help?

17 个解决方案

#1


没人顶几贴?

#2


占个位置,坐等高人解答

#3


nobody reply post?

#4


JAVA实现
 /**
     * Create a video thumbnail for a video. May return null if the video is
     * corrupt.
     *
     * @param filePath
     */
    public static Bitmap createVideoThumbnail(String filePath) {
        Bitmap bitmap = null;
        MediaMetadataRetriever retriever = new MediaMetadataRetriever();
        try {
            retriever.setMode(MediaMetadataRetriever.MODE_CAPTURE_FRAME_ONLY);
            retriever.setDataSource(filePath);
            bitmap = retriever.captureFrame();
        } 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.
            }
        }
        return bitmap;
    }

#5


这个方法我在网上找到过,可captureFrame()这个方法不知道是得到第一针的图片还是当前一针的图片?,我想根据指定的某个时间点上面的视频截图。

#6


不一定是第一帧,看了下opencore里的代码,应该是按照某种算法选取了一帧。具体应该是在编码的时候决定的(C++不熟,看起来很费劲,呵呵)。记得以前源码里有直接截取第一秒的,后来的版本这个实现都被去掉了。

#7


我的那个视频是在surfaceView 里面播放的,所以我希望不用在video里面去得到图片,想在surface里面去得到一张图片,又可以不是thumbnail 了。

#8


没看到好的解决方案

#9


看android自带Camera源码

#10


 看了他上面用的是captureframe截取片头的。

#11


不一定是第一帧,看了下opencore里的代码,应该是按照某种算法选取了一帧。具体应该是在编码的时候决定的(C++不熟,看起来很费劲,呵呵)。记得以前源码里有直接截取第一秒的,后来的版本这个实现都被去掉了。

#12


说一样的话,有没有截取的是当前播放的帧图片

#13


似乎默认没有,需要自己去实现!

#14


再次来到这,跟踪研究ThumbnailUtils里面的createVideoThumbnail方法。
不论它用的什么算法取得哪一帧,只要找到在哪是实现的,改称我们想要的就ok阿!

#15


回调用OPENCORE去取一个关键帧出来,代码产考/external/opencore/engines/adapters/player/framemetadatautility/src/pv_frame_metadata_utility.cpp

#16


Bitmap bitmap = ThumbnailUtils.createVideoThumbnail(VIDEO_FILE_PATH+files.getName(), Video.Thumbnails.MINI_KIND);

#17


虽然结贴了. 还是想知道楼主最后解决了吗?

#1


没人顶几贴?

#2


占个位置,坐等高人解答

#3


nobody reply post?

#4


JAVA实现
 /**
     * Create a video thumbnail for a video. May return null if the video is
     * corrupt.
     *
     * @param filePath
     */
    public static Bitmap createVideoThumbnail(String filePath) {
        Bitmap bitmap = null;
        MediaMetadataRetriever retriever = new MediaMetadataRetriever();
        try {
            retriever.setMode(MediaMetadataRetriever.MODE_CAPTURE_FRAME_ONLY);
            retriever.setDataSource(filePath);
            bitmap = retriever.captureFrame();
        } 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.
            }
        }
        return bitmap;
    }

#5


这个方法我在网上找到过,可captureFrame()这个方法不知道是得到第一针的图片还是当前一针的图片?,我想根据指定的某个时间点上面的视频截图。

#6


不一定是第一帧,看了下opencore里的代码,应该是按照某种算法选取了一帧。具体应该是在编码的时候决定的(C++不熟,看起来很费劲,呵呵)。记得以前源码里有直接截取第一秒的,后来的版本这个实现都被去掉了。

#7


我的那个视频是在surfaceView 里面播放的,所以我希望不用在video里面去得到图片,想在surface里面去得到一张图片,又可以不是thumbnail 了。

#8


没看到好的解决方案

#9


看android自带Camera源码

#10


 看了他上面用的是captureframe截取片头的。

#11


不一定是第一帧,看了下opencore里的代码,应该是按照某种算法选取了一帧。具体应该是在编码的时候决定的(C++不熟,看起来很费劲,呵呵)。记得以前源码里有直接截取第一秒的,后来的版本这个实现都被去掉了。

#12


说一样的话,有没有截取的是当前播放的帧图片

#13


似乎默认没有,需要自己去实现!

#14


再次来到这,跟踪研究ThumbnailUtils里面的createVideoThumbnail方法。
不论它用的什么算法取得哪一帧,只要找到在哪是实现的,改称我们想要的就ok阿!

#15


回调用OPENCORE去取一个关键帧出来,代码产考/external/opencore/engines/adapters/player/framemetadatautility/src/pv_frame_metadata_utility.cpp

#16


Bitmap bitmap = ThumbnailUtils.createVideoThumbnail(VIDEO_FILE_PATH+files.getName(), Video.Thumbnails.MINI_KIND);

#17


虽然结贴了. 还是想知道楼主最后解决了吗?