java - 命令适用于终端,但不适用于 Kotlin

标签 java kotlin cmd ffmpeg

我正在尝试使用 FFMPEG 命令来连接不同的视频。命令是

ffmpeg -i video.mp4 -i video-2.mp4 -filter_complex "[0:v:0] [0:a:0] [1:v:0] [1:a:0] concat=n=2:v=1:a=1 [v] [a]" -map "[v]" -map "[a]" output.mp4

当我在 Windows PowerShell 上运行时,此命令运行良好。但是当我尝试使用 Kotlin 代码运行时,它不起作用。
val firstVideo = "D:\\Videos\\ffmpeg\\video.mp4"
val secondVideo = "D:\\Videos\\ffmpeg\\video-2.mp4"
val resultPath = "D:\\Videos\\ffmpeg\\result-2.mp4"

val cmd = "ffmpeg -i $firstVideo -i $secondVideo -filter_complex \"[0:v:0] [0:a:0] [1:v:0] [1:a:0] concat=n=2:v=1:a=1 [v] [a]\" -map \"[v]\" -map \"[a]\" $resultPath"
.split(" ").toTypedArray()

Runtime.getRuntime().exec(cmd)

因为我使用的是 FFMPEG cli,所以我没有收到任何错误消息。

此外,当我尝试运行其他 FFMPEG 操作时,这部分 Kotlin 非常有效。

最佳答案

事实证明,实际问题出在 Runtime.getRuntime().exec() 函数中。我试图调用 waitFor() 方法,但它卡住了。我一直在等待。我做了一些研究并阅读了文档。

Because some native platforms only provide limited buffer size for standard input and output streams, failure to promptly write the input stream or read the output stream of the subprocess may cause the subprocess to block, or even deadlock.



这段代码工作得很好:
fun main(){

   val path1 = "video-1.mp4"
   val path2 = "video-2.mp4"
   val resultPath = "output.mp4"

   val cmd = arrayOf("ffmpeg",
    "-i", path1, "-i", path2,
    "-filter_complex", "[0:v:0][0:a:0][1:v:0][1:a:0]concat=n=2:v=1:a=1[v][a]",
    "-map", "[v]", "-map", "[a]", resultPath)

    executeCommand(cmd)
}

fun executeCommand(cmd: Array<String>){
    try {
       val runtime = Runtime.getRuntime()
       val process = runtime.exec(cmd)
       val errorStream = process.errorStream
       val input = InputStreamReader(errorStream)
       val reader = BufferedReader(input)
       reader.forEachLine {
          println(it);
       }
       process.waitFor()
   } catch (e: Exception) {
       e.printStackTrace();
   }
}

https://www.javaworld.com/article/2071275/when-runtime-exec---won-t.html

https://docs.oracle.com/javase/8/docs/api/java/lang/Process.html

关于java - 命令适用于终端,但不适用于 Kotlin,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57894508/

相关文章:

kotlin - 如何将自动生成的ID添加到Cloud Firestore数据库

android - 如何比较多个时间范围并在 Android Compose 中并排显示它们

powershell - Cmdkey 密码为空

java - NullPointerException 但没有传递给函数的 null 参数

java - Gson在反序列化对象时忽略null

java - 如何在 JAVA_OPTIONS 上设置 -xnohup 选项

java - 用于容器化 postgresql 的 Spring boot 的正确 jdbc 是什么

android - NavController 在设备旋转后没有当前导航节点

windows - 如何在 Jenkins-ci 中归档参数化构建的工件

windows - 使用 pnputil.exe 安装驱动程序