int*_*_32 6 java ffmpeg processbuilder 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)
}
}
Run Code Online (Sandbox Code Playgroud)
和:
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())
}
}
Run Code Online (Sandbox Code Playgroud)
此方法生成的参数是可以的:
-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
Run Code Online (Sandbox Code Playgroud)
如果我从命令行使用这个 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
Run Code Online (Sandbox Code Playgroud)
我已经尝试过:
'用\'为"结果是一样的。
FFMPEG 4.1、Kotlin 1.3、Java 1.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())
}
}
Run Code Online (Sandbox Code Playgroud)
我确定这是因为 ProcessBuilder 使用 转义参数",所以它们看起来像"-filter_complex" "'[0:0][1:0][2:0]concat=n=3:v=0:a=1[out]'",这是错误的。
| 归档时间: |
|
| 查看次数: |
5136 次 |
| 最近记录: |