【问题标题】:FFMPEG "no such file or directory" on AndroidAndroid上的FFMPEG“没有这样的文件或目录”
【发布时间】:2026-02-04 10:10:01
【问题描述】:

我正在尝试使用 ffmpeg 二进制文件并通过 android 中的本机 linux 命令调用它。大多数命令都可以正常工作,但问题是当我需要将 http url 作为输入传递给 -i 选项时,我得到的 url 为“没有这样的文件或目录”。但是,该 url 是存在的,并且在 mac 上运行 SAME 命令可以按预期完成工作。

这是我的 ffmpeg 编译配置:

./configure \
$DEBUG_FLAG \
--arch=arm \
--cpu=cortex-a8 \
--target-os=linux \
--enable-runtime-cpudetect \
--prefix=$prefix \
--enable-pic \
--disable-shared \
--enable-static \
--cross-prefix=$NDK_TOOLCHAIN_BASE/bin/$NDK_ABI-linux-androideabi- \
--sysroot="$NDK_SYSROOT" \
--extra-cflags="-I../x264 -mfloat-abi=softfp -mfpu=neon" \
--extra-ldflags="-L../x264" \
\
--enable-version3 \
--enable-gpl \
\
--disable-doc \
--enable-yasm \
\
--enable-decoders \
--enable-nonfree \
--enable-encoders \
--enable-muxers \
--enable-demuxers \
--enable-parsers \
--enable-protocols \
--enable-protocol=http \
--enable-filters \
--enable-avresample \
\
--disable-indevs \
--enable-indev=lavfi \
\
--enable-hwaccels \
\
--enable-ffmpeg \
--enable-ffplay \
--enable-libmp3lame \
--enable-network \
\
--enable-libx264 \
--enable-libfaac \
--enable-zlib

它基于这个项目:https://github.com/guardianproject/android-ffmpeg-java

命令是这样的:

ffmpeg -i "http://someurl" -f mp3 -ab 192000 -vn demoo.mp3

这个想法是从视频中下载音轨并将其编码为 mp3。我明确添加了多个启用协议选项,但似乎没有任何效果。我也尝试了另一种配置,删除enable-gpl 下的所有内容以确保没有任何冲突,但它会引发相同的错误。如果我给它一个正常的文件系统路径它工作正常。

这里的cmets后面是命令的准确输出和输出:

03-25 00:22:08.806: VERBOSE/FFMPEG(16491): /data/data/org.ffmpeg.android/app_bin/ffmpeg -i "http://r6---sn-gvbxgn-tt1d.c.youtube.com/videoplayback?ipbits=8&cp=U0hVSVJLV19KUUNONV9KRUFJOnQ0STMtb0JXc0py&sparams=cp%2Cid%2Cip%2Cipbits%2Citag%2Cratebypass%2Csource%2Cupn%2Cexpire&id=c0045acebe0c3341&upn=IVAGxSD1hE0&source=youtube&ratebypass=yes&mv=m&key=yt1&expire=1364209857&itag=18&ms=au&ip=99.234.119.90&mt=1364185033&fexp=923418%2C901802%2C906383%2C902000%2C919512%2C913605%2C931202%2C900821%2C900823%2C931203%2C931401%2C908529%2C919373%2C930803%2C920201%2C929602%2C930101%2C930603%2C926403%2C900824%2C910223&sver=3&newshard=yes&signature=838AEB4650D8353B70DBC49341E0C40706DC6153.297639FD70A7F9710F29AE9E278A4FC4A32E0C67" -f mp3 -ab 192000 -vn /data/data/org.ffmpeg.android/files/demoooo.mp3 -loglevel debug
03-25 00:22:08.956: DEBUG/ffmpeg(16491): Process exited with code:1
03-25 00:22:08.966: DEBUG/ffmpeg(16491): Shell output:ffmpeg version 0.11.1 Copyright (c) 2000-2012 the FFmpeg developers
03-25 00:22:08.976: DEBUG/ffmpeg(16491): Shell output:  built on Mar 24 2013 02:24:38 with gcc 4.6 20120106 (prerelease)
03-25 00:22:08.976: DEBUG/ffmpeg(16491): Shell output:  configuration: --arch=arm --cpu=cortex-a8 --target-os=linux --enable-runtime-cpudetect --prefix=/data/data/info.guardianproject.ffmpeg/app_opt --enable-pic --disable-shared --enable-static --cross-prefix=/Users/feribg/Dev/android-ndk-r8d/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86/bin/arm-linux-androideabi- --sysroot=/Users/feribg/Dev/android-ndk-r8d/platforms/android-3/arch-arm --extra-cflags='-I../x264 -mfloat-abi=softfp -mfpu=neon' --extra-ldflags=-L../x264 --enable-version3 --enable-gpl
03-25 00:22:08.976: DEBUG/ffmpeg(16491): Shell output:  libavutil      51. 54.100 / 51. 54.100
03-25 00:22:08.976: DEBUG/ffmpeg(16491): Shell output:  libavcodec     54. 23.100 / 54. 23.100
03-25 00:22:08.976: DEBUG/ffmpeg(16491): Shell output:  libavformat    54.  6.100 / 54.  6.100
03-25 00:22:08.986: DEBUG/ffmpeg(16491): Shell output:  libavdevice    54.  0.100 / 54.  0.100
03-25 00:22:08.996: DEBUG/ffmpeg(16491): Shell output:  libavfilter     2. 77.100 /  2. 77.100
03-25 00:22:08.996: DEBUG/ffmpeg(16491): Shell output:  libswscale      2.  1.100 /  2.  1.100
03-25 00:22:08.996: DEBUG/ffmpeg(16491): Shell output:  libswresample   0. 15.100 /  0. 15.100
03-25 00:22:08.996: DEBUG/ffmpeg(16491): Shell output:  libpostproc    52.  0.100 / 52.  0.100
03-25 00:22:08.996: DEBUG/ffmpeg(16491): Shell output:"http://r6---sn-gvbxgn-tt1d.c.youtube.com/videoplayback?ipbits=8&cp=U0hVSVJLV19KUUNONV9KRUFJOnQ0STMtb0JXc0py&sparams=cp%2Cid%2Cip%2Cipbits%2Citag%2Cratebypass%2Csource%2Cupn%2Cexpire&id=c0045acebe0c3341&upn=IVAGxSD1hE0&source=youtube&ratebypass=yes&mv=m&key=yt1&expire=1364209857&itag=18&ms=au&ip=99.234.119.90&mt=1364185033&fexp=923418%2C901802%2C906383%2C902000%2C919512%2C913605%2C931202%2C900821%2C900823%2C931203%2C931401%2C908529%2C919373%2C930803%2C920201%2C929602%2C930101%2C930603%2C926403%2C900824%2C910223&sver=3&newshard=yes&signature=838AEB4650D8353B70DBC49341E0C40706DC6153.297639FD70A7F9710F29AE9E278A4FC4A32E0C67": No such file or directory

【问题讨论】:

  • 很可能是 ffmpeg 二进制文件太旧了。你能发布完整的错误输出吗?
  • 将您的流程分为两个步骤。 Http 获取输入文件并将其存储在设备上。然后使用本地输入文件正常ffmpeg。
  • 如果你打算分发应用程序,IMO - 你应该使用普通的 JNI 接口,就像 git 的 Guardian 一样。 CLI 很脆弱。如果你需要走 CLI 路线,你可以看看使用 Busybox/WGET 来获取文件,然后是普通的 CLI ffmpeg。您可以将其放在 bash 脚本中,然后在设备上的 CLI 上运行该脚本。
  • @RobertRowntree 我同意这可行,但这里的想法是只下载音频流。这就是上面的命令所做的,因此它的动态转换和使用的带宽仅用于音频流(没有下载视频),这是概念的重点。
  • @slhck 你知道吗,因为 FFMPEG 中的哪个版本支持 http 流媒体,当我传递选项 --enable-protocols 和 --enable-protocol=http 时,它不会在编译期间引发错误,说没有这样的选择?因为目前它构建得很好。

标签: android http url ffmpeg


【解决方案1】:

顺便说一句,如果你想翻录它的 youtube,请参阅 youtube audio

RTSP java 客户端库here

你是从对 ffmpeg 的调用中读取 stderr 吗?我敢打赌,如果您查看 ffmpeg stdout OR stderr 将包含有关尝试通过 http 连接到远程输入文件的网络接口出现问题的消息....

以下是获取 stderr 的 android 包装器示例:

System.out.println("Starting process " +command.toString());
            ProcessBuilder builder = new ProcessBuilder(command);
            Map<String, String> environ = builder.environment();
//          for(Entry<String, String> entry : environ.entrySet()){
    //          System.out.println("ENV " +entry.getKey() + " " +entry.getValue());
      //      }
//          builder.redirectErrorStream(true);
            Process process = null;
            try {
                process = builder.start();

            InputStream is = process.getInputStream();

            InputStreamReader isr = new InputStreamReader(is);
            BufferedReader br = new BufferedReader(isr);
            String line;
            while ((line = br.readLine()) != null) {  
              //System.out.println(line);
                outfil=line;
            }

【讨论】:

  • 是的,它继续显示库版本、配置选项、执行的命令等,并停在:“blabal”没有这样的文件或目录。这是输出的最后一行。
  • 你只想翻录音频?容器类型是什么?您可能想看看使用 VLC 而不是 ffmpeg?
  • 'ffmpeg -loglevel debug' 可能会提供更多关于 http 输入出现问题的信息。
  • 不幸的是,loglevel 指令根本没有更改日志,但我更新了我的问题以包含整个日志输出。不知道你用 VLC 代替是什么意思,它不是一个应用程序,我需要的是一个库,或者他们提供了某种开源工具,可以做我正在尝试的事情?
  • vlc 通常用于翻录媒体轨道。它在 android 上运行。我认为它是开源的。我建议是因为它可能是更好的翻录曲目的工具。
最近更新 更多