首页 > 解决方案 > Fluent FFMPEG 复杂过滤器将文件拆分为多个输出

问题描述

似乎可以从单个 FFMPEG 命令获得多个输出:ffmpeg overlay on multiple output

我想知道如何在 FFMPEG 中做到这一点。我专门使用 complexFilter 选项来尝试将视频拆分为 4 种不同的大小并放置一个叠加层,然后保存 4 个生成的文件。

该代码是我尝试将视频简单地拆分为 4 并保存它。我得到了Error: ffmpeg exited with code 1: Filter split:output3 has an unconnected output错误。我不确定如何将输出连接到 fluent-ffmpeg 中的文件。

    let ffmpegCommand = ffmpeg() 
        .addInput(path.join(__dirname, PROCESSING_CACHE_DIRECTORY, "tempImage_%d.jpg"))

        .addOutput(outputPathFull)
        .addOutput(outputPathMed)
        .addOutput(outputPathSmall)
        .addOutput(outputPathThumb)


        .toFormat('mp4')
        .videoCodec('libx264')
        .outputOptions('-pix_fmt yuv420p')
        .complexFilter([
        {
                filter: 'split', options: '4',
                inputs: ['0:v'], outputs: [outputPathFull, outputPathMed, outputPathSmall, outputPathThumb]
            },
        ])

当我翻转输出并将它们放在 complexFilter 下方时,我得到 4 个文件 - 一个具有适当的质量(并且比预期大 4 倍),而其他的质量非常低。

标签: node.jsffmpegfluent-ffmpeg

解决方案


执行此操作的正确方法ffmpeg是使用 为每个输出定义所需的过滤器-map,按照以下示例fluent-ffmpeg

let ffmpeg = require('fluent-ffmpeg')
let fileName = 'video.mp4'
let outputID1 = '1'
let outputID2 = '2'
let outputID3 = '3'
let outputID4 = '4'
let outputPathFull = 'out-1.mp4'
let outputPathMed = 'out-2.mp4'
let outputPathSmall = 'out-3.mp4'
let outputPathThumb = 'out-4.mp4'

ffmpeg() 
.addInput(path.join(__dirname, PROCESSING_CACHE_DIRECTORY, fileName))
.complexFilter([
{
        filter: 'split', options: '4',
        inputs: ['0:v'], outputs: [outputID1, outputID2, outputID3, outputID4]
    },
])

.output(outputPathFull)
.map(outputID1)
.toFormat('mp4')
.addOutputOption('-c:v libx264')
.addOutputOption('-pix_fmt yuv420p')

.output(outputPathMed)
.map(outputID2)
.toFormat('mp4')
.addOutputOption('-c:v libx264')
.addOutputOption('-pix_fmt yuv420p')

.output(outputPathSmall)
.map(outputID3)
.toFormat('mp4')
.addOutputOption('-c:v libx264')
.addOutputOption('-pix_fmt yuv420p')

.output(outputPathThumb)
.map(outputID4)
.toFormat('mp4')
.addOutputOption('-c:v libx264')
.addOutputOption('-pix_fmt yuv420p')

.run()

推荐阅读