【问题标题】:process ffmpeg command on nodejs with fluent-ffmpeg使用 fluent-ffmpeg 在 nodejs 上处理 ffmpeg 命令
【发布时间】:2020-04-26 18:52:19
【问题描述】:

我正在编写一个使用 nodejs 将 MP4 转换为 HLS 的工具,我正在尝试使用 fluent-ffmpeg 进行转换,但是在给出 "outputOptions" 时出现了一些错误。

我的代码:

var fs = require('fs');
var ffmpeg = require('fluent-ffmpeg');

// open input stream
var infs = new ffmpeg

infs.addInput('./data/test3.mp4').outputOptions([
    '-map 0:0',
    '-map 0:1',
    '-map 0:0',
    '-map 0:1',
    '-s:v:0 2160x3840',
    '-c:v:0 libx264',
    '-b:v:0 2000k',
    '-s:v:1 960x540',
    '-c:v:1 libx264',
    '-b:v:1 365k',
    '-var_stream_map', '"v:0,a:0', 'v:1,a:1"',
    '-master_pl_name master.m3u8',
    '-f hls',
    '-hls_time 1',
    '-hls_list_size 0',
    '-hls_segment_filename', '"v%v/fileSequence%d.ts"'
]).output('./data/v%v/prog_index.m3u8')
    .on('start', function (commandLine) {
        console.log('Spawned Ffmpeg with command: ' + commandLine);
    })
    .on('error', function (err, stdout, stderr) {
        console.log('An error occurred: ' + err.message, err, stderr);
    })
    .on('progress', function (progress) {
        console.log('Processing: ' + progress.percent + '% done')
    })
    .on('end', function (err, stdout, stderr) {
        console.log('Finished processing!' /*, err, stdout, stderr*/)
    })
    .run()

我得到的错误是

Error: ffmpeg exited with code 1: v:1,a:1": Invalid argument
Unable to find a suitable output format for 'v:1,a:1"'

我尝试打印出 fluent-ffmpeg 生成的命令,然后我得到了

fmpeg -i ./data/test3.mp4 -y -map 0:0 -map 0:1 -map 0:0 -map 0:1 -s:v:0 2160x3840 -c:v:0 libx264 -b:v:0 2000k -s:v:1 960x540 -c:v:1 libx264 -b:v:1 365k -var_stream_map "v:0,a:0 v:1,a:1" -master_pl_name master.m3u8 -f hls -hls_time 1 -hls_list_size 0 -hls_segment_filename "v%v/fileSequence%d.ts" ./data/v%v/prog_index.m3u8

我将此命令粘贴到终端中,我可以成功将 mp4 转换为 hls。

我应该如何处理我的代码才能让它成功转换?

fluent-ffmpeg 版本:2.1.2

ffmpeg 版本:4.2.1

【问题讨论】:

    标签: node.js video ffmpeg fluent-ffmpeg


    【解决方案1】:

    根据fluent-ffmpeg 文档。可以使用在 output() 函数之前添加的 outputOptions(option...) 来解决。

    所以,最终的解决方案看起来像..

        infs.addInput('./data/test3.mp4').outputOptions([
        '-map 0:v', '-map 0:a', '-map 0:v','-map 0:a',
        '-s:v:0 2160x3840',
        '-c:v:0 libx264',
        '-b:v:0 2000k',
        '-s:v:1 960x540',
        '-c:v:1 libx264',
        '-b:v:1 365k',
        '-master_pl_name master.m3u8',
        '-f hls',
        '-hls_time 1',
        '-hls_list_size 0',
        '-hls_segment_filename', '"v%v/fileSequence%d.ts"'])
    .outputOption('-var_stream_map', 'v:0,a:0 v:1,a:1')
    .output('./data/v%v/prog_index.m3u8')
        .on('start', function (commandLine) {
            console.log('Spawned Ffmpeg with command: ' + commandLine);
        })
        .on('error', function (err, stdout, stderr) {
            console.log('An error occurred: ' + err.message, err, stderr);
        })
        .on('progress', function (progress) {
            console.log('Processing: ' + progress.percent + '% done')
        })
        .on('end', function (err, stdout, stderr) {
            console.log('Finished processing!' /*, err, stdout, stderr*/)
        })
        .run()
    

    【讨论】:

      【解决方案2】:

      编辑:根据这个 fluent-ffmpeg 问题comment,将 vsm arg 用单引号括起来,并将双引号用于外引号。


      var_stream_map 参数应该是一个字符串,即

      '"v:0,a:0 v:1,a:1"',
      

      【讨论】:

      • 我也试过这个'-var_stream_map', '"v:0,a:0 v:1,a:1"', '-master_pl_name master.m3u8' ,但我仍然收到这个错误Error: ffmpeg exited with code 1: v:1,a:1": Invalid argument
      • 对不起,我对“用单引号引用 vsm arg 并为外引号使用双引号”感到困惑。 .似乎我必须提供这样的选项['-var_stream_map', '"v:0,a:0 v:1,a:1"'],但它仍然不正确。
      • 像这样:"-var_stream_map", "'v:0,a:0 v:1,a:1'"
      • 不工作。 Error 我还是一样。我认为它总是得到 a:0 v:1 之间的空间,并将 v:1 解析为下一个命令而不是参数
      • 不要将其作为数组传递。请参阅github.com/fluent-ffmpeg/… 的最后一个示例
      猜你喜欢
      • 1970-01-01
      • 2016-09-28
      • 2021-02-19
      • 1970-01-01
      • 2021-03-06
      • 2020-10-20
      • 2014-07-22
      • 2022-06-14
      • 1970-01-01
      相关资源
      最近更新 更多