【问题标题】:Android: Get all the frames of a video (any video file)Android:获取视频的所有帧(任何视频文件)
【发布时间】:2023-03-27 10:24:01
【问题描述】:

朋友们好,

我正在开发一个用于编辑视频的简单应用程序。

我需要的是获取视频的所有帧(据我所知,帧可以被视为位图)

得到所有这些后,我需要编辑帧(位图) 然后将其显示在图像视图中(尽管我要做的是循环所有图像,就像它们是视频一样。

我尝试使用

mediaMetadataRetriever.getFrameAtTime(0);

但问题是,在给定时间内捕获的帧不正确。

示例代码:

bm[1] = mediaMetadataRetriever.getFrameAtTime(0);
bm[2] = mediaMetadataRetriever.getFrameAtTime(50000);
bm[3] = mediaMetadataRetriever.getFrameAtTime(100000);
bm[4] = mediaMetadataRetriever.getFrameAtTime(150000);
bm[5] = mediaMetadataRetriever.getFrameAtTime(200000);

然后在图像视图中循环位图。

我听说过 ffmpeg 并试图研究它。

问题是,我使用的是 windows 而不是 ubuntu 或 linux。

我现在真的很难过。

请帮助我,或者只是指引我正确的道路。

非常感谢:)

【问题讨论】:

    标签: android video bitmap frames


    【解决方案1】:

    注意MediaMetadataRetriever.getFrameAtTime 方法使用的参数表示时间偏移值,单位为微秒(1/1000000 秒)而不是毫秒(1/1000 部分)。

    这至少可以解决您使用MediaMetadataRetriever 捕获帧时遇到的问题。

    无论如何,检查一些替代品可能会很有趣,例如JavaCV,它代表 OpenCV、FFmpeg 和其他一些流行的图像和视频处理库的包装器。 Windows、Linux、Mac OS 和 Android 支持 JavaCV。

    JavaCV 确实缺乏更好的文档,但在其主页上有一些示例可能是很好的起点。 更多高级示例可以在Cookbook Examples 找到,用 Scala 编写。对这种语言有一些基本的了解,即使对于纯 Java 开发人员来说,它也可能是有价值的资源。

    【讨论】:

      【解决方案2】:

      试试FFmpegMediaMetadataRetriever,它使用FFmpeg作为后端:

      FFmpegMediaMetadataRetriever fmmr = new FFmpegMediaMetadataRetriever();
      bm[1] = fmmr.getFrameAtTime(0);
      bm[2] = fmmr.getFrameAtTime(50000);
      bm[3] = fmmr.getFrameAtTime(100000);
      bm[4] = fmmr.getFrameAtTime(150000);
      bm[5] = fmmr.getFrameAtTime(200000);
      fmmr.release();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-07-20
        • 2014-05-06
        • 2020-06-07
        • 2014-02-19
        • 1970-01-01
        • 1970-01-01
        • 2013-11-14
        • 1970-01-01
        相关资源
        最近更新 更多