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

解决方案 »

  1.   

    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;
        }
      

  2.   

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

  3.   

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

  4.   

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

  5.   

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

  6.   

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

  7.   

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

  8.   

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

  9.   

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