【问题标题】:Android FFMPEG - No output file being createdAndroid FFMPEG - 没有创建输出文件
【发布时间】:2017-08-10 06:26:04
【问题描述】:

每当我发出以下命令时,都不会创建“intermediate.ts”输出文件:

getRuntime.exec("ffmpeg -i input1.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts intermediate1.ts")

即使像这样使用String[]

String[] cmd = {
"sh",
"-c",
"./ffmpeg -i input1.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts intermediate1.ts"
}

但是当我打开终端模拟器并编写相同的东西时,我得到了我正在寻找的正确输出。通过Java我可以得到输出:

ffmpeg -help 

但无法使用 FFMpeg 和 Java 的 getRuntime.exec() 创建文件。我做错了什么?

【问题讨论】:

    标签: java android shell terminal ffmpeg


    【解决方案1】:

    当您在 Android 应用程序的上下文中运行 ffmpeg 时,它的工作目录是文件系统的根目录,并且以只读方式挂载。您可以指定输出文件的完整路径,或使用exec(cmd, null, dir)。输出文件必须转到您的应用程序具有写入权限的目录,例如myActivity.getFilesDir()myPackageInfo.applicationInfo.dataDir

    你不需要通过sh运行ffmpeg,但是你必须给出可执行文件的完整路径,或者通过Runtime的第二个参数指定PATH .exec()

    【讨论】:

    • 我一直在使用 Runtime.exec(string) 提供 ffmpeg 和输出文件的完整路径。我使用的输出目录是 getFilesDir()。我尝试使用 Runtime.exec(cmd, null, wrkdir) 其中 cmd 是 ffmpeg 的完整路径,而 wrkdir 是 getFilesDir() 但只是得到一个 io 异常。我不确定我做错了什么。有什么建议吗?
    • 让我们尝试一些其他命令行而不是 ffmpeg,例如/system/sh -c echo abc >def
    • /system/bin/echo abc >def 工作得很好。我也可以使用/system/bin/touch ../../storage/emulated/0/android/data/com.my_package/files/sampleJava.txt 创建一个空文件,没有任何问题。但是,在调用 ffmpeg 时使用上述路径会失败,除非在我的手机上使用 shell 终端仿真器。我的 ffmpeg 二进制文件位于data/data/com.my_package,如果这有什么不同的话。
    • 您写道您确实收到了来自ffmpeg --help 的输出。但也许您没有在您的应用程序的上下文中对此进行测试。我不知道您是如何在/data/data/com.my_package 中获得 ffmpeg 二进制文件的,但请确保权限正确:您需要由 Android 系统分配给您的应用程序的用户读取和执行。让一切顺利并自动化的最简单方法是take advantage of the standard JNI library packaging
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-05
    • 2013-12-10
    • 1970-01-01
    • 2019-05-28
    • 1970-01-01
    • 2021-05-10
    • 1970-01-01
    相关资源
    最近更新 更多