我正在为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
我已经尝试过:
'
转义\
'
替换为"
结果相同。
FFMPEG 4.1,Kotlin 1.3,Java 1.8,macOS 10.13.6
答案 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"