process ffmpeg command on nodejs with fluent-ffmpeg
我正在编程一个使用nodejs将MP4转换为HLS的工具,我正在尝试使用fluent-ffmpeg对其进行转换,但是在给" outputOptions "时出现了一些错误。
我的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | 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() |
我得到的错误是
1 2 | 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产生的命令,我得到了
1 | 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
编辑:根据此fluent-ffmpeg问题注释,将vsm arg用单引号引起来,并使用双引号作为外引号。
var_stream_map arg应该是一个字符串,即
1 | '"v:0,a:0 v:1,a:1"', |
根据fluent-ffmpeg文档。可以使用在output()函数之前添加的outputOptions(option ...)来解决此问题。
所以,最终的解决方案看起来像..
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | 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() |