【问题标题】:Working Directory: null Environment: null工作目录:空环境:空
【发布时间】:2014-05-21 22:08:37
【问题描述】:

我正在尝试在 Android 上使用 ffmpeg.so 我得到 Working Directory: null Environment: null error。

try {
    Process p = Runtime.getRuntime().exec("/data/data/com.example.foo/files/ffmpeg -f image2 -i "
+ Environment.getExternalStorageDirectory().getAbsolutePath() + "/img/b%d.jpg " 
+ Environment.getExternalStorageDirectory().getAbsolutePath() + "/DCIM/Camera/a444.mp4");   
} catch (IOException e) {
    e.printStackTrace();
}

错误日志

04-09 01:50:45.683: I/Adreno-EGL(18393): <qeglDrvAPI_eglInitialize:320>: EGL 1.4 QUALCOMM Build: I0404c4692afb8623f95c43aeb6d5e13ed4b30ddbDate: 11/06/13
04-09 01:50:45.713: D/OpenGLRenderer(18393): Enabling debug mode 0
04-09 01:53:56.487: D/dalvikvm(18551): Trying to load lib /data/app-lib/com.example.sodeneme-1/libffmpeg.so 0x423d7d00
04-09 01:53:56.487: D/dalvikvm(18551): Added shared lib /data/app-lib/com.example.sodeneme-1/libffmpeg.so 0x423d7d00
04-09 01:53:56.487: D/dalvikvm(18551): No JNI_OnLoad found in /data/app-lib/com.example.sodeneme-1/libffmpeg.so 0x423d7d00, skipping init
04-09 01:53:56.537: W/System.err(18551): java.io.IOException: Error running exec(). Command: [/data/data/com.example.sodeneme/files/ffmpeg, -f, image2, -i, /storage/emulated/0/img/b%d.jpg, /storage/emulated/0/DCIM/Camera/a444.mp4] Working Directory: null Environment: null
04-09 01:53:56.537: W/System.err(18551):    at java.lang.ProcessManager.exec(ProcessManager.java:211)
04-09 01:53:56.537: W/System.err(18551):    at java.lang.Runtime.exec(Runtime.java:173)
04-09 01:53:56.537: W/System.err(18551):    at java.lang.Runtime.exec(Runtime.java:246)
04-09 01:53:56.537: W/System.err(18551):    at java.lang.Runtime.exec(Runtime.java:189)
04-09 01:53:56.537: W/System.err(18551):    at com.example.sodeneme.MainActivity.onCreate(MainActivity.java:40)
04-09 01:53:56.537: W/System.err(18551):    at android.app.Activity.performCreate(Activity.java:5231)
04-09 01:53:56.537: W/System.err(18551):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
04-09 01:53:56.537: W/System.err(18551):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159)
04-09 01:53:56.537: W/System.err(18551):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
04-09 01:53:56.537: W/System.err(18551):    at android.app.ActivityThread.access$800(ActivityThread.java:135)
04-09 01:53:56.537: W/System.err(18551):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
04-09 01:53:56.537: W/System.err(18551):    at android.os.Handler.dispatchMessage(Handler.java:102)
04-09 01:53:56.537: W/System.err(18551):    at android.os.Looper.loop(Looper.java:136)
04-09 01:53:56.537: W/System.err(18551):    at android.app.ActivityThread.main(ActivityThread.java:5017)
04-09 01:53:56.537: W/System.err(18551):    at java.lang.reflect.Method.invokeNative(Native Method)
04-09 01:53:56.537: W/System.err(18551):    at java.lang.reflect.Method.invoke(Method.java:515)
04-09 01:53:56.537: W/System.err(18551):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
04-09 01:53:56.537: W/System.err(18551):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
04-09 01:53:56.537: W/System.err(18551):    at dalvik.system.NativeStart.main(Native Method)
04-09 01:53:56.547: W/System.err(18551): Caused by: java.io.IOException: No such file or directory
04-09 01:53:56.547: W/System.err(18551):    at java.lang.ProcessManager.exec(Native Method)
04-09 01:53:56.547: W/System.err(18551):    at java.lang.ProcessManager.exec(ProcessManager.java:209)
04-09 01:53:56.547: W/System.err(18551):    ... 18 more
04-09 01:53:56.577: I/Adreno-EGL(18551): <qeglDrvAPI_eglInitialize:320>: EGL 1.4 QUALCOMM Build: I0404c4692afb8623f95c43aeb6d5e13ed4b30ddbDate: 11/06/13
04-09 01:53:56.607: D/OpenGLRenderer(18551): Enabling debug mode 0

权限

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_INTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_INTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />

【问题讨论】:

    标签: android ffmpeg


    【解决方案1】:

    也许您需要将此权限添加到您的 AndroidManifest.xml 文件

    android.permission.WRITE_EXTERNAL_STORAGE
    

    【讨论】:

    • 我在顶部添加了权限列表
    • 我看到您刚刚添加了有关您的 AndroidManifest.xml 的信息。你能调试看看Process返回了什么吗?然后,在继续之前检查文件是否存在于“/data/data/com.example.foo/files/”。
    • 我在 DDMS 的数据中看不到可能是因为它没有 root。
    • 啊,是的,/data/data/ 目录仅适用于系统应用程序或根植的设备。因此,也许您可​​以写入应用程序自己的私有目录或内部或外部 SD 卡,而不是写入此目录。
    • 我使用 getBaseContext().getApplicationInfo().nativeLibraryDir 解决了这个问题
    【解决方案2】:

    您需要确保/data/data/com.example.foo/files/ffmpeg 文件具有正确的文件权限。

    您可以使用以下命令检查文件权限:

    String[] command = new String[]{"/system/bin/ls", "-l",
                                    "/data/data/com.example.foo/files/ffmpeg" };
    Process process = Runtime.getRuntime().exec(command);
    BufferedReader reader = new BufferedReader(
                        new InputStreamReader(process.getInputStream()));
    int read;
    
    String output = "";
    
    String line;
    while ((line = reader.readLine()) != null) {
        output.concat(line + "\n");
        Log.w("myApp", "[[output]]:" + line);
    }  
    reader.close();
    process.waitFor(); 
    

    输出将是这样的(取决于实际权限,在这种情况下权限为 777):

    [[output]]:-rwxrwxrwx u0_a67   u0_a67     254460 2015-03-02 17:12 ffmpeg
    

    您可以使用以下命令将权限设置为 744 :

    String[] command = new String[]{"/system/bin/chmod", "744",
                                    "/data/data/com.example.foo/files/ffmpeg" };
    

    如果您是从外部活动(比如说从服务)执行此命令,您的权限必须是 777(而不是 744)

    【讨论】:

      【解决方案3】:

      我在使用 ffmpeg-android 项目时自发地遇到了同样的问题。我已经拥有了其他人提到的所有权限集,而且我过去没有遇到过这个问题。

      我恢复到旧版本,它运行良好,然后重建最新版本,它再次正常 - 所以在我的情况下,解决方案是一个简单的 清理和重建..

      如果你感到绝望,试试吧!

      【讨论】:

        【解决方案4】:

        在我的情况下,您需要添加“sh -c”,如下例所示:

        sh -c shellcommand  
        

        希望对你有帮助。

        大卫

        【讨论】:

          【解决方案5】:

          你在执行命令之前缺少这个:

          try {
                      ffmpeg.loadBinary(new LoadBinaryResponseHandler() {
          
                          @Override
                          public void onStart() {}
          
                          @Override
                          public void onFailure() {}
          
                          @Override
                          public void onSuccess() {}
          
                          @Override
                          public void onFinish() {}
                      });
                  } catch (FFmpegNotSupportedException e) {
                      // Handle if FFmpeg is not supported by device
                  }
          

          参考:http://writingminds.github.io/ffmpeg-android-java/

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-10-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-12-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多