代码之家  ›  专栏  ›  技术社区  ›  artem

初始化复杂筛选器时出错。从Kotlin运行ffmpeg时出现无效参数错误

  •  0
  • artem  · 技术社区  · 6 年前

    我正在为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应用程序中运行时,会出现以下错误:

    [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

    1 回复  |  直到 6 年前
        1
  •  7
  •   artem    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())
        }
    }
    

    " ,所以他们看起来像 "-filter_complex" "'[0:0][1:0][2:0]concat=n=3:v=0:a=1[out]'" ,这是错误的。

        2
  •  0
  •   Hansimov    5 年前

    使用 \" '

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