android捕获视频帧

标签 android video frame capture

我需要获取视频文件的帧(它可能在 sdcard、缓存目录或应用程序目录中)。我的应用程序中有 android.media 包,里面有 MediaMetadataRetriever 类。要将第一帧放入位图中,我使用代码:

public static Bitmap getVideoFrame(Context context, Uri videoUri) {
    MediaMetadataRetriever retriever = new MediaMetadataRetriever();
    try {
        retriever.setMode(MediaMetadataRetriever.MODE_CAPTURE_FRAME_ONLY);
        retriever.setDataSource(context, videoUri);
        return retriever.captureFrame();
    } catch (IllegalArgumentException ex) {
        throw new RuntimeException();
    } catch (RuntimeException ex) {
        throw new RuntimeException();
    } finally {
        retriever.release();
    }
}

但这行不通。当我设置数据源时,它抛出一个异常(java.lang.RuntimeException:setDataSource failed:status = 0x80000000)。你知道如何使这段代码工作吗?或者您是否有任何类似(简单)的解决方案而不使用 ffmpeg 或其他外部库? videoUri 是一个有效的 uri(媒体播放器可以播放来自该 URI 的视频)

最佳答案

以下对我有用:

public static Bitmap getVideoFrame(FileDescriptor FD) {
        MediaMetadataRetriever retriever = new MediaMetadataRetriever();
        try {
            retriever.setDataSource(FD);
            return retriever.getFrameAtTime();
        } catch (IllegalArgumentException ex) {
            ex.printStackTrace();
        } catch (RuntimeException ex) {
            ex.printStackTrace();
        } finally {
            try {
                retriever.release();
            } catch (RuntimeException ex) {
            }
        }
        return null;
    }

如果您使用路径而不是文件描述符,也适用。

关于android捕获视频帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5337505/

相关文章:

video - FFMPEG 水印视频无需重新编码或质量下降

python - youtube.videos()。insert AttributeError: 'NoneType'对象没有属性 'videos'

ios - 使 UIView 大于其父 View

loops - 如何用ffmpeg循环一帧?所有其他框架都应该指向第一个没有变化,也许就像一个回避

android - 在自定义 ListView 中保存编辑框值

android - 当应用程序在后台时将用户位置更新到服务器

java - 访问 HashMap Java Android 中对象的属性

android - Android上的youtube视频

python - 按钮位于框架后面

Android:Spinner 没有正确获得焦点