Android MediaMetadataRetriever.getFrameAtTime会跳过帧

时间:2012-12-16 17:53:17

标签: android media video-processing

我写了一个简单的Android应用程序,它使用MediaMetadataRetriver类来获取帧。它工作正常,除了我意识到它跳过框架。

我试图解码的视频片段是用手机摄像头拍摄的。请遵循相关的代码段:

MediaMetadataRetriever mediaDataRet = new MediaMetadataRetriever();
            mediaDataRet.setDataSource(path);

            String lengthMsStr = mediaDataRet
                    .extractMetadata(mediaDataRet.METADATA_KEY_DURATION);
            final long lenMs = Long.parseLong(lengthMsStr);

            String widthStr = mediaDataRet
                    .extractMetadata(mediaDataRet.METADATA_KEY_VIDEO_WIDTH);
            int width = Integer.parseInt(widthStr);
            String heightStr = mediaDataRet
                    .extractMetadata(mediaDataRet.METADATA_KEY_VIDEO_HEIGHT);
            int height = Integer.parseInt(heightStr);

注意变量lenMs,它保持clid持续时间(以毫秒为单位)。然后对于我做的每一帧:

                int pace = 30; // 30 fps ms spacing 


                for (long i = 0; i < lenMs; i += pace) {

                    if (is_abort())
                        return;

                    Bitmap bitmap = mediaDataRet.getFrameAtTime(i * 1000); // I tried the other version of this method with OPTION_CLOSEST, with no luck.

                    if (bc == null)
                        bc = bitmap.getConfig();

                    bitmap.getPixels(pixBuffer, 0, width, 0, 0, width, height);
[...]
}

在视觉上检查 后,我注意到有些帧被跳过(如短序列)。为什么?我可以避免这种情况吗?

1 个答案:

答案 0 :(得分:3)

使用:

mediaDataRet.getFrameAtTime(i * 1000, MediaMetadataRetriever.OPTION_CLOSEST);

getFrameAtTime(n)使用OPTION_CLOSEST_SYNC,只会为您提供关键帧。