初始化复杂过滤器时出错。从Kotlin运行ffmpeg时,参数错误无效

时间:2018-11-25 23:56:55

标签: java kotlin ffmpeg processbuilder

我正在为ffmpeg创建包装器,它具有以下方法:

fun executeCommand(args: Array<String>): AppRunner.AppResult {
    return appRunner.run(ffmpegPath, args)
}


class AppRunner {

    fun run(
        app: String,
        args: Array<String>,
        timeoutAmount: Long = 60000,
        timeoutUnit: TimeUnit = TimeUnit.SECONDS
    ): AppResult {
        val command = mutableListOf(app)
        command.addAll(args)

        val processResult = ProcessBuilder(command)
            .redirectOutput(ProcessBuilder.Redirect.PIPE)
            .redirectError(ProcessBuilder.Redirect.PIPE)
            .start()
            .apply {
                waitFor(timeoutAmount, timeoutUnit)
            }

        val exitCode = processResult.exitValue()
        val stdOut = processResult.inputStream.bufferedReader().readText()
        val stdErr = processResult.errorStream.bufferedReader().readText()

        return AppResult(exitCode, stdOut, stdErr)
    }

}

并且:

fun concatenateAudioFiles(files: Collection<File>, outFile: File) {
    val args = mutableListOf<String>()

    files.forEach { file ->
        args.add("-i")
        args.add(file.absolutePath)
    }

    // Create filter
    val filterStringBuilder = StringBuilder()
    filterStringBuilder.append("'")
    files.forEachIndexed { index, _ ->
        filterStringBuilder.append("[$index:0]")
    }
    filterStringBuilder.append("concat=n=")
    filterStringBuilder.append(files.size)
    filterStringBuilder.append(":v=0:a=1[out]")
    filterStringBuilder.append("'")

    args.add("-filter_complex")
    args.add(filterStringBuilder.toString())
    args.add("-map")
    args.add("'[out]'")
    args.add(outFile.absolutePath)
    logger.info { "Filter: ${args.joinToString(" ")}" }
    val result = executeCommand(args.toTypedArray())
    if (!result.isSuccessful()) {
        throw FfmpegException(result.toString())
    }
}

通过这种方法生成的精氨酸是可以的:

-i silence-0.5.mp3 -i vo_1543189276830.mp3 -i silence-0.5.mp3 -filter_complex '[0:0][1:0][2:0]concat=n=3:v=0:a=1[out]' -map '[out]' vo_final_1543189276833.mp3

如果我从命令行使用此args运行ffmpeg,它将正常工作。

但是在Kotlin应用程序中运行时,会出现以下错误:

[AVFilterGraph @ 0x7fd134071500] No such filter: '[0:0][1:0][2:0]concat=n=3:v=0:a=1[out]'
Error initializing complex filters.
Invalid argument

我已经尝试过:

  1. 检查类似问题
  2. '转义\
  3. '替换为"

结果相同。

FFMPEG 4.1,Kotlin 1.3,Java 1.8,macOS 10.13.6

2 个答案:

答案 0 :(得分:1)

好吧,解决方案是完全删除'

fun concatenateAudioFiles(files: Collection<File>, outFile: File) {
    val args = mutableListOf<String>()

    files.forEach { file ->
        args.add("-i")
        args.add(file.absolutePath)
    }

    // Create filter
    val filterStringBuilder = StringBuilder()
    files.forEachIndexed { index, _ ->
        filterStringBuilder.append("[$index:0]")
    }
    filterStringBuilder.append("concat=n=")
    filterStringBuilder.append(files.size)
    filterStringBuilder.append(":v=0:a=1[out]")

    args.add("-filter_complex")
    args.add(filterStringBuilder.toString())
    args.add("-map")
    args.add("[out]")
    args.add(outFile.absolutePath)
    logger.info { "Filter: ${args.joinToString(" ")}" }
    val result = executeCommand(args.toTypedArray())
    if (!result.isSuccessful()) {
        throw FfmpegException(result.toString())
    }
}

我肯定会发生这种情况,因为ProcessBuilder使用"转义了参数,因此它们看起来像"-filter_complex" "'[0:0][1:0][2:0]concat=n=3:v=0:a=1[out]'",这是错误的。

答案 1 :(得分:0)

使用\"逃脱',如下所示:

"ffmpeg -y -i input.mp4 -filter_complex \"fps=12, scale=480:-2:flags=lanczos\" output.mp4"