【问题标题】:how to read video file and split it into frames如何读取视频文件并将其拆分为帧
【发布时间】:2013-09-12 07:23:23
【问题描述】:

我有一个问题:如何在 Android 中加载存储在设备中的视频文件,以及如何将其拆分为帧? 我正在使用 IntelliJ,我想将视频分割成帧,以便使用一些图像处理技术(使用 OpenCv for Android 库)来处理它们。

【问题讨论】:

    标签: android opencv


    【解决方案1】:

    您不需要为此使用 OpenCV。您可以使用 SDK 提供的MediaMetaDataRetreiver 类。它提供了从各种媒体文件中提取元数据的方法。您可以尝试以下方法:

    MediaMetadataRetriever retriever = new MediaMetadataRetriever();
    
    retriever.setDataSource(file.getAbsolutePath());
    
    imgView.setImageBitmap(retriever.getFrameAtTime(TIME_OFFSET,MediaMetadataRetriever.OPTION_CLOSEST));
    

    TIME_OFFSET 以微秒为单位。

    【讨论】:

    • 我也会尝试这个解决方案。谢谢!
    • 太慢了,每次提取帧大约需要 200-300 毫秒
    【解决方案2】:

    在 OpenCV 中抓取视频帧非常简单。 OpenCV 网站上有很多示例。然而关键是在安卓上设置opencv。您可以按照此链接在 Android 上开始使用 Opencv。

    http://opencv.org/android

    一旦你在安卓上安装了opencv。您可以轻松地在 Mat 结构中加载视频文件和抓取帧,然后对其进行一些处理。

    这是示例之一。它需要一些修改才能在安卓上运行。我认为您需要为此在 andriod 上使用 NDK。

    int main(int argc, char*argv[])
    {
    
        char *my_file = "C:\\vid_an2\\desp_me.avi";
        std::cout<<"Video File "<<my_file<<std::endl;
        cv::VideoCapture input_video;
    
        if(input_video.open(my_file))
        {
             std::cout<<"Video file open "<<std::endl;
        }
        else
        {
            std::cout<<"Not able to Video file open "<<std::endl;
    
        }
        namedWindow("My_Win",1);
        namedWindow("Segemented", 1);
        Mat cap_img;
        for(;;)
        {
             input_video >> cap_img;
             imshow("My_Win", cap_img);
              waitKey(0);
        }
       return 0;
     }
    

    【讨论】:

    • 我已经阅读了一些关于 ndk 的内容,并且已经了解了如何使用它。但我不清楚 cpp 函数(在 cpp 文件中声明和定义)如何将值返回给 java 类,该类是该本地方法的所有者。
    • 我不认为 VideoCapture 将在 Android 中工作,因为 Android 的 OpenCV 没有后端 FFMpeg
    猜你喜欢
    • 2016-04-11
    • 1970-01-01
    • 1970-01-01
    • 2013-07-23
    • 1970-01-01
    • 1970-01-01
    • 2010-10-17
    • 2014-08-24
    • 1970-01-01
    相关资源
    最近更新 更多