初始化复杂过滤器时出错。来自 Kotlin 的 运行 ffmpeg 时出现无效参数错误
Error initializing complex filters. Invalid argument error when running ffmpeg from Kotlin
我正在为 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
如果我 运行 ffmpeg 从命令行使用这个参数,它工作正常。
但是在 Kotlin 应用程序中 运行ning 时,会出现以下错误:
[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、Java1.8、macOS 10.13.6
好吧,解决方案是完全删除 '
:
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]'"
,这是错误的。
使用\"
转义'
,像这样:
"ffmpeg -y -i input.mp4 -filter_complex \"fps=12, scale=480:-2:flags=lanczos\" output.mp4"
我正在为 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
如果我 运行 ffmpeg 从命令行使用这个参数,它工作正常。
但是在 Kotlin 应用程序中 运行ning 时,会出现以下错误:
[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、Java1.8、macOS 10.13.6
好吧,解决方案是完全删除 '
:
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]'"
,这是错误的。
使用\"
转义'
,像这样:
"ffmpeg -y -i input.mp4 -filter_complex \"fps=12, scale=480:-2:flags=lanczos\" output.mp4"