簡體   English   中英

使用 fluent-ffmpeg 在 nodejs 上處理 ffmpeg 命令

[英]process ffmpeg command on nodejs with fluent-ffmpeg

我正在編寫一個使用 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。

我應該在我的代碼中做什么才能讓它成功轉換?

流暢的ffmpeg版本:2.1.2

ffmpeg 版本:4.2.1

編輯:根據this fluent-ffmpeg issue comment ,在單引號中引用vsm arg,並使用雙引號作為外引號。


var_stream_map arg 應該是一個字符串,即

'"v:0,a:0 v:1,a: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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM