Android MediaMetadataRetriever.getFrameAtTime 跳过帧

Posted

技术标签:

【中文标题】Android MediaMetadataRetriever.getFrameAtTime 跳过帧【英文标题】:Android MediaMetadataRetriever.getFrameAtTime skips frames 【发布时间】:2012-12-16 17:53:17 【问题描述】:

我编写了一个简单的 android 应用程序,它使用 MediaMetadataRetriver 类来获取帧。它工作正常,只是我意识到它会跳过帧。

我尝试解码的视频片段是用手机摄像头拍摄的。关注相关代码sn-ps:

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);
[...]

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

【问题讨论】:

其实我试过你上面的代码从视频文件中获取所有帧,但我只得到第一帧重复。我的视频持续时间是 127040(2:07 秒)将视频分成 32 帧可以查看所有 32 张图像,但都是相同的图像,我尝试了很多方法来使用 getFrameAtTime(potions) 修复它,但完全没有用,我不知道哪里出了问题,所以你能通过完整的源代码帮助我吗?在 AndroidManifest 中包含任何内容 ***.com/a/24307619/3496570 可能会有所帮助 【参考方案1】:

用途:

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

getFrameAtTime(n) 使用 OPTION_CLOSEST_SYNC,它只会给你关键帧。

【讨论】:

以上是关于Android MediaMetadataRetriever.getFrameAtTime 跳过帧的主要内容,如果未能解决你的问题,请参考以下文章

Android 逆向Android 权限 ( Android 逆向中使用的 android.permission 权限 | Android 系统中的 Linux 用户权限 )

android 21 是啥版本

Android逆向-Android基础逆向(2-2)

【Android笔记】android Toast

图解Android - Android核心机制

Android游戏开发大全的目录