【问题标题】:Command works on terminal but not with Kotlin命令适用于终端,但不适用于 Kotlin
【发布时间】:2020-01-13 14:39:59
【问题描述】:

我正在尝试使用 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 也能完美运行。

【问题讨论】:

  • 您可以打印cmd 的值并查看该命令是否与您打算运行的不同。

标签: java kotlin cmd ffmpeg


【解决方案1】:

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

由于部分原生平台只为标准输入输出流提供有限的缓冲区大小,未能及时写入子进程的输入流或读取输出流可能会导致子进程阻塞,甚至死锁。

这段代码运行良好:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-21
    • 1970-01-01
    • 1970-01-01
    • 2016-02-09
    • 2020-08-03
    • 1970-01-01
    相关资源
    最近更新 更多