обработать команду ffmpeg на nodejs с помощью fluent-ffmpeg

Я программирую инструмент для преобразования MP4 в HLS с помощью nodejs, я пытаюсь использовать 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


person Niguai    schedule 09.01.2020    source источник


Ответы (2)


Изменить: в соответствии с этой проблемой fluent-ffmpeg comment, заключайте аргумент vsm в одинарные кавычки и используйте двойные кавычки для внешних кавычек.


Аргумент var_stream_map должен быть одной строкой, т.е.

'"v:0,a:0 v:1,a:1"',
person Gyan    schedule 09.01.2020
comment
я тоже пробовал это '-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 - person Niguai; 10.01.2020
comment
извините, я путаю, что цитирую аргумент vsm в одинарных кавычках и использую двойные кавычки для внешних кавычек. . Похоже, я должен указать такой вариант ['-var_stream_map', '"v:0,a:0 v:1,a:1"'], но это все равно неправильно. - person Niguai; 10.01.2020
comment
Вот так: "-var_stream_map", "'v:0,a:0 v:1,a:1'" - person Gyan; 10.01.2020
comment
не работа . Ошибка, которую я получаю по-прежнему. Я думаю, что он всегда получает пробел между a: 0 v: 1 и анализирует v: 1, чтобы быть следующей командой, а не параметром - person Niguai; 10.01.2020
comment
Не передавайте его как массив. См. последний пример на github.com/fluent- ffmpeg/ - person Gyan; 10.01.2020
comment
оно работает. Я удаляю массив и меняю параметр следующим образом "-var_stream_map", 'v:0,a:0 v:1,a:1' спасибо!! - person Niguai; 10.01.2020

Согласно fluent-ffmpeg. Документация. Это можно решить с помощью outputOptions(option...), добавленного перед функцией output().

Итак, окончательное решение выглядит так.

    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()
person Chirag Prajapati    schedule 17.03.2021