Node.JS FFMPEG显示彼此相邻的两个视频

时间:2016-07-06 21:49:04

标签: node.js ffmpeg fluent-ffmpeg

有没有人知道如何使用ffmpeg(fluent-ffmpeg)的node.js包装器将两个视频合并为一个,左边显示一个,右边显示另一个,而不是连接。

谢谢!

3 个答案:

答案 0 :(得分:0)

你可以使用过滤器组合来获得你想要的东西。 您首先将第一个视频重新调整为左侧所需的大小:https://ffmpeg.org/ffmpeg-filters.html#scale-1

'scale=width:height'

然后应用黑条来定位左侧视频; totalwidthtotalheight是输出视频的最终尺寸,xy您重新缩放左侧视频的位置:https://ffmpeg.org/ffmpeg-filters.html#pad-1

{
  filter: 'pad',
  options: 'totalwidth:totalheigth:x:y'
}

最后,使用复合过滤器overlay放置右侧视频;请注意,它应首先重新调整:https://ffmpeg.org/ffmpeg-filters.html#overlay-1

{
  filter: 'overlay', options: { x: 'x', y: 'y' },
},

以下是您的代码应如下所示:(基于快速文档:https://github.com/fluent-ffmpeg/node-fluent-ffmpeg#complexfilterfilters-map-set-complex-filtergraph

ffmpeg('left_video.avi')
.input('right_video.avi')
.complexFilter([
 // Rescale input video
 'scale=width:height',

 // Add black bars to position your left video at x, y position
 {
  filter: 'pad',
  options: 'totalwidth:totalheigth:x:y'
 }

 // Overlay the second input for right side video
 {
  filter: 'overlay', options: { x: 'x', y: 'y' },
 },
], 'output');

请注意我没有对其进行测试,但它应该可行

答案 1 :(得分:0)

这是我过去并排显示2个视频的内容。

ffmpeg()
.input("video1.mp4")
.input("video2.mp4")
.complexFilter([
  '[0:v]scale=300:300[0scaled]',
  '[1:v]scale=300:300[1scaled]',
  '[0scaled]pad=600:300[0padded]',
  '[0padded][1scaled]overlay=shortest=1:x=300[output]'
])
.outputOptions([
  '-map [output]'
])
.output("output.mp4")
.on("error",function(er){
  console.log("error occured: "+er.message);
})
.on("end",function(){
  console.log("success");
})
.run();

答案 2 :(得分:0)

我需要相同的结果;在NodeJS中以一个视频的形式在两个视频之间一个接一个地显示。经过一些研究,我通过使用exec库(Node附带)和来自此处的https://unix.stackexchange.com/a/233833/443530ffmpeg bash命令来完成此任务。

我使用的解决方案(为我工作):

let cmd = `ffmpeg -i ${pathToVid1} -i /home/shani/projects/open-app-p/files${pathToVid2} -filter_complex '[0:v]pad=iw*2:ih[int];[int][1:v]overlay=W/2:0[vid]' -map [vid] -c:v libx264 -crf 23 -preset veryfast ${outputFilePath}.mp4`; // one line

console.log("executing ffmpeg command... this might take a sec... ");
exec(cmd, (err, stdout, stderr) => {
  if (err) console.log("Error ", err)
  else console.log("Done!")
})