使用 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。
我应该如何处理我的代码才能让它成功转换?
fluent-ffmpeg 版本:2.1.2
ffmpeg 版本:4.2.1
编辑:根据这个 fluent-ffmpeg 问题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()
我正在编写一个使用 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
编辑:根据这个 fluent-ffmpeg 问题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()