【问题标题】:Problems with ffmpeg command line on androidandroid上的ffmpeg命令行问题
【发布时间】:2013-03-28 04:13:07
【问题描述】:

我设法编译了 ffmpeg 静态版本。但是当我尝试调用 ffmpeg 命令行时,我得到一个 Java IOException: No such file or Directory。

我的代码如下:

public void merge_video(View view){

    if(ffmpeg_file.exists()){
          Log.d(null, "ffmpeg exists");
      }else{
          Log.d(null, "Could not locate ffmpeg in the folder");
      }

      File file1 = new File("/mnt/sdcard/com.ffmpeg_test/VID_3_25_2013_12_22.mp4");
      if(file1.exists()){
          Log.d(null,"File 1 exists");
      }
      File file2 = new File("/mnt/sdcard/com.ffmpeg_test/VID_3_25_2013_12_28.mp4");
      if(file2.exists()){
          Log.d(null,"File 2 exists");
      }

      String[] ffmpegCommand = new String[5];
      ffmpegCommand[0] = "/mnt/sdcard/com.ffmpeg_test/ffmpeg";
      ffmpegCommand[1] = "-i";
      ffmpegCommand[2] = "concat:/mnt/sdcard/com.ffmpeg_test/VID_3_25_2013_12_22.mp4|/mnt/sdcard/com.ffmpeg_test/VID_3_25_2013_12_28.mp4";
      ffmpegCommand[3] = "copy";
      ffmpegCommand[4] = "/mnt/sdcard/com.ffmpeg_test/output.mp4";  

      try {
          Process ffmpegProcess = new ProcessBuilder(ffmpegCommand).redirectErrorStream(true).start();

          String line;
          BufferedReader reader = new BufferedReader(new InputStreamReader(ffmpegProcess.getInputStream()));
          Log.d(null, "*******Starting FFMPEG");

          while((line = reader.readLine())!=null){

              Log.d(null, "***"+line+"***"); 
          }
          Log.d(null,"****ending FFMPEG****");

    } catch (IOException e) {
        e.printStackTrace();
    }
  }

LogCat 打印如下:

03-27 20:41:10.522: W/System.err(24709): java.io.IOException: Error running exec(). Command: [/mnt/sdcard/com.ffmpeg_test/ffmpeg, -i, concat:/mnt/sdcard/com.ffmpeg_test/VID_3_25_2013_12_22.mp4|/mnt/sdcard/com.ffmpeg_test/VID_3_25_2013_12_28.mp4, copy, /mnt/sdcard/com.ffmpeg_test/output.mp4] Working Directory: null Environment: [ANDROID_SOCKET_zygote=13, TMPDIR=/data/local/tmp, ANDROID_BOOTLOGO=1, EXTERNAL_STORAGE=/mnt/sdcard, ANDROID_ASSETS=/system/app, PATH=/sbin:/vendor/bin:/system/sbin:/system/bin:/system/xbin, ASEC_MOUNTPOINT=/mnt/asec, LOOP_MOUNTPOINT=/mnt/obb, BOOTCLASSPATH=/system/framework/core.jar:/system/framework/bouncycastle.jar:/system/framework/ext.jar:/system/framework/framework.jar:/system/framework/android.policy.jar:/system/framework/services.jar:/system/framework/core-junit.jar, USBHOST_STORAGE=/mnt/sdcard/usbStorage, ANDROID_DATA=/data, LD_LIBRARY_PATH=/vendor/lib:/system/lib, ANDROID_ROOT=/system, ANDROID_PROPERTY_WORKSPACE=12,32768, EXTERNAL_STORAGE2=/mnt/sdcard/external_sd]
03-27 20:41:10.522: W/System.err(24709):    at java.lang.ProcessManager.exec(ProcessManager.java:224)
03-27 20:41:10.522: W/System.err(24709):    at java.lang.ProcessBuilder.start(ProcessBuilder.java:202)
03-27 20:41:10.522: W/System.err(24709):    at com.example.ffmpeg_test.MainActivity.merge_video(MainActivity.java:106)
03-27 20:41:10.522: W/System.err(24709):    at java.lang.reflect.Method.invokeNative(Native Method)
03-27 20:41:10.522: W/System.err(24709):    at java.lang.reflect.Method.invoke(Method.java:507)
03-27 20:41:10.527: W/System.err(24709):    at android.view.View$1.onClick(View.java:2149)
03-27 20:41:10.527: W/System.err(24709):    at android.view.View.performClick(View.java:2538)
03-27 20:41:10.527: W/System.err(24709):    at android.view.View$PerformClick.run(View.java:9152)
03-27 20:41:10.527: W/System.err(24709):    at android.os.Handler.handleCallback(Handler.java:587)
03-27 20:41:10.527: W/System.err(24709):    at android.os.Handler.dispatchMessage(Handler.java:92)
03-27 20:41:10.527: W/System.err(24709):    at android.os.Looper.loop(Looper.java:123)
03-27 20:41:10.527: W/System.err(24709):    at android.app.ActivityThread.main(ActivityThread.java:3691)
03-27 20:41:10.527: W/System.err(24709):    at java.lang.reflect.Method.invokeNative(Native Method)
03-27 20:41:10.527: W/System.err(24709):    at java.lang.reflect.Method.invoke(Method.java:507)
03-27 20:41:10.532: W/System.err(24709):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:847)
03-27 20:41:10.532: W/System.err(24709):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:605)
03-27 20:41:10.537: W/System.err(24709):    at dalvik.system.NativeStart.main(Native Method)
03-27 20:41:10.537: W/System.err(24709): Caused by: java.io.IOException: No such file or directory
03-27 20:41:10.537: W/System.err(24709):    at java.lang.ProcessManager.exec(Native Method)
03-27 20:41:10.537: W/System.err(24709):    at java.lang.ProcessManager.exec(ProcessManager.java:222)
03-27 20:41:10.537: W/System.err(24709):    ... 16 more
03-27 20:41:36.057: W/KeyCharacterMap(24709): No keyboard for id 0
03-27 20:41:36.057: W/KeyCharacterMap(24709): Using default keymap: /system/usr/keychars/qwerty.kcm.bin

【问题讨论】:

  • 尝试从 /data/local 的子文件夹运行它

标签: android ffmpeg


【解决方案1】:

Android 有一个特殊的安全功能:/mnt/sdcard 文件系统是受执行保护的。您无法运行位于外部存储(也称为 USB 存储)上的可执行文件。如果要在设备上运行 ffmpeg 二进制文件,则必须将其加载到内部目录之一。例如,您可以将其打包到您的 Java 项目的 libs/armeabi 中,这样安装程序会自动将其解压到 /data/data//lib > 设备上的目录。或者您可以找到另一个目录,例如 /data/local,您可以在其中使用 adb push

放置可执行二进制文件

【讨论】:

  • 同样的问题!!我正在合并两个位于内部存储的视频并将生成的视频存储在同一位置,但它给出了 this-java.io.IOException: No such file or directory
  • 我认为这个答案可能会解决我的问题,但我不知道该怎么做
  • @AkashDubey:要检查这是否是相同的问题,请在没有文件参数的情况下运行 ffmpeg,例如fffmpeg -?。如果您仍然得到相同的 java 异常,就是这样。如果不是,那么您的问题就不同了,并且与您指定输入或输出文件路径的方式有关。在后一种情况下,请随意打开一个单独的问题并披露有关您如何尝试从您的应用运行 ffmpeg 的更多详细信息。
  • 我是直接执行的,首先我需要加载二进制文件然后执行,现在合并视频需要很长时间!!
  • @AlexCohn 别担心,我不是问我只是告诉我在加载 ffmpeg 之前正在执行 ffmpeg 命令,这是问题所在,现在已经解决了
猜你喜欢
  • 1970-01-01
  • 2011-12-01
  • 1970-01-01
  • 2020-10-11
  • 2015-02-10
  • 1970-01-01
  • 1970-01-01
  • 2015-03-13
  • 2015-01-04
相关资源
最近更新 更多