【问题标题】:android ffmpeg halfninja av_open_input_file returns -2 (no such file or directory)android ffmpeg halfninja av_open_input_file 返回-2(没有这样的文件或目录)
【发布时间】:2011-12-13 15:34:18
【问题描述】:

我已经使用描述的代码和方法为 Android 构建了 ffmpeg

https://github.com/halfninja/android-ffmpeg-x264

在 Windows 上使用在 VirtualBox 中运行的 Ubuntu。然后我将 libvideokit.so 复制到所提供项目的 Windows 副本的 Project\libs\armeabi 文件夹中。从那里我可以在我的 Android 设备上从 Eclipse 运行 ProjectTest。我可以看到正在执行的 ffmpeg 代码,但是当它到达打开输入文件的地步时,它给了我指示的错误。我注意到在

上对此问题进行了一些讨论

FFMpeg on Android, undefined references to libavcodec functions, although it is listed on command line

但解决方案没有帮助,因为在此构建中启用了文件协议,我还尝试将“文件:”放在文件路径前面无济于事。为了完整起见,我尝试设置 minimum_featureset=0 以启用所有默认值,但这给了我同样的错误。下面是来自 Eclipse 的 logcat 的快照,显示了 Videokit 的输出,并额外调用了 LOGE 以显示来自 av_open_input_file 的结果。任何尝试的事情建议将不胜感激。

10-23 11:57:33.888: DEBUG/Videokit(4830): run() called
10-23 11:57:33.888: DEBUG/Videokit(4830): run passing off to main()
10-23 11:57:33.904: DEBUG/Videokit(4830): main(): registering all modules
10-23 11:57:33.927: DEBUG/Videokit(4830): main(): registered everything
10-23 11:57:33.927: DEBUG/Videokit(4830): main(): initting opts
10-23 11:57:33.943: DEBUG/Videokit(4830): main(): initted opts.
10-23 11:57:33.943: ERROR/Videokit(4830): ffmpeg version N-30996-gf925b24, Copyright (c) 2000-2011 the FFmpeg developers
10-23 11:57:33.943: ERROR/Videokit(4830):   built on Oct 21 2011 13:54:03 with gcc 4.4.3
10-23 11:57:33.943: ERROR/Videokit(4830):   configuration: --enable-cross-compile --arch=arm5te --enable-armv5te --target-os=linux --disable-stripping --prefix=../output --disable-neon --enable-version3 --disable-shared --enable-static --enable-gpl --enable-memalign-hack --cc=arm-linux-androideabi-gcc --ld=arm-linux-androideabi-ld --extra-cflags='-fPIC -DANDROID -D__thumb__ -mthumb -Wfatal-errors -Wno-deprecated' --disable-everything --enable-decoder=mjpeg --enable-demuxer=mjpeg --enable-parser=mjpeg --enable-demuxer=image2 --enable-muxer=mp4 --enable-encoder=libx264 --enable-libx264 --enable-decoder=rawvideo --enable-protocol=file --enable-hwaccels --disable-ffmpeg --disable-ffplay --disable-ffprobe --disable-ffserver --disable-network --enable-filter=buffer --enable-filter=buffersink --disable-demuxer=v4l --disable-demuxer=v4l2 --disable-indev=v4l --disable-indev=v4l2 --extra-cflags='-I../x264 -Ivideokit' --extra-ldflags=-L../x264
10-23 11:57:33.943: DEBUG/Videokit(4830): main(): parsing options
10-23 11:57:33.943: DEBUG/Videokit(4830): parse_options has 4 options to parse
10-23 11:57:33.951: ERROR/Videokit(4830): opt_input_file av_open_input_file /mnt/sdcard/fun/snap0000.jpg -2 
10-23 11:57:33.951: ERROR/Videokit(4830): /mnt/sdcard/fun/snap0000.jpg: No such file or directory
10-23 11:57:33.951: ERROR/Videokit(4830): ffmpeg_exit(1) called!

【问题讨论】:

    标签: android ffmpeg


    【解决方案1】:

    实际上,我在使用此版本编译 FFMpeg 时遇到了同样的问题: http://www.roman10.net/?p=389

    并启用所有可以启用的功能(去掉 --disable-everything 选项)。

    如果你有什么想法,我很感兴趣 :)

    编辑: 在 HalfNinja 网站上,写的是以下内容:
    “...目前我在输入文件方面遇到了一些问题(我认为大多数输入都很好,但它无法识别 JPEG 序列)。”
    :(

    【讨论】:

    • 如果我弄明白了,我会告诉你的。您提供的信息很值得了解。
    【解决方案2】:

    问题在于权限。在android上,我们以系统所有者身份安装了sdcard,但没有rwx。但 ffmpeg 会检查:

    avformat/file.c:

    static int file_check(URLContext *h, int mask)
    {
        struct stat st;
        int ret = stat(h->filename, &st);
        if (ret < 0)
            return AVERROR(errno);
    
        ret |= st.st_mode&S_IRUSR ? mask&AVIO_FLAG_READ  : 0;
        ret |= st.st_mode&S_IWUSR ? mask&AVIO_FLAG_WRITE : 0;
    
        return ret;
    }
    

    像这样改变这个函数:

    static int file_check(URLContext *h, int mask)
    {
        struct stat st;
        int ret = stat(h->filename, &st);
        if (ret < 0)
            return AVERROR(errno);
    
        ret |= st.st_mode&S_IRUSR ? mask&AVIO_FLAG_READ  : 0;
        ret |= st.st_mode&S_IRGRP ? mask&AVIO_FLAG_READ  : 0;
        ret |= st.st_mode&S_IROTH ? mask&AVIO_FLAG_READ  : 0;
        ret |= st.st_mode&S_IWUSR ? mask&AVIO_FLAG_WRITE : 0;
        ret |= st.st_mode&S_IWGRP ? mask&AVIO_FLAG_WRITE  : 0;
        ret |= st.st_mode&S_IWOTH ? mask&AVIO_FLAG_WRITE  : 0;
    
    
        return ret;
    }
    

    然后重建你的 ffmpeg。就是这样!

    【讨论】:

    • 谢谢!我试试看。
    • 这并不能解决我的问题 - 还有其他问题吗?
    • 实际上,这个和从 ndk-r5c 切换到 ndk-r8 解决了它。
    • 不知道你自己有没有发现这个问题,不过还是谢谢你的分享。你终于把我从噩梦中解救出来了!
    猜你喜欢
    • 2015-06-09
    • 2013-03-13
    • 2021-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-10
    相关资源
    最近更新 更多