流畅的 ffmpeg => 如何在不编写许多输出文件的情况下将视频的各个部分修剪并连接到一个输出文件中。制定最有效的解决方案

问题描述 投票:0回答:1

我目前正在一个在线视频网站上工作,我需要使用随机时间戳和视频持续时间来快速预览视频。

假设视频有15分钟,那么我想剪掉一些部分,例如->

1. from 00:00:40 take out next 2s 
2. from 00:01:20 take out next 2s 
3. ... and so on until the new video becomes 15s

我如何在nodejs项目中使用 Fluent-ffmpeg来做到这一点

我能否获得最有效的方法来做到这一点无需编写许多输出文件,然后分别连接它们并稍后删除

仅将修剪后的视频连接到一个输出文件中,并在完成后保存。

我还找到了一个使用复杂过滤器的解决方案,但我不知道如何使用它

   ffmpeg("video.mp4")
  .complexFilter([
    ....// some filters here

  ])
  .on('end',  function () {
    console.log('files have been merged and saved.')
  })
  .on('error',function (err){
    console.log(err)
  }
  .saveToFile("output.mp4")```
node.js ffmpeg video-processing fluent fluent-ffmpeg
1个回答
0
投票

这有点晚了,但对于将来遇到同样问题的人来说。

我不确定你会如何在 fluence-ffmpeg 中做到这一点。但是,您可以生成 FFmpeg 命令,然后在控制台中运行它。

type Timestamps = {
  start: number;
  end: number;
};

function generateFilter({ start, end }: Timestamps, index: number): string {
  const videoFilter = `[0:v]trim=start=${start}:end=${end},setpts=PTS-STARTPTS,format=yuv420p[${index}v];`;
  const audioFilter = `[0:a]atrim=start=${start}:end=${end},asetpts=PTS-STARTPTS[${index}a];`;
  return videoFilter + audioFilter;
}

function TrimVideo(input: string, output: string, timestamps: Timestamps[]): string {
  const filters = timestamps.map(generateFilter);
  const concatInputs = timestamps.map((_, index) => `[${index}v][${index}a]`).join("");

  const baseCommand = `ffmpeg -i ${input} -filter_complex`;
  const endCommand = `concat=n=${timestamps.length}:v=1:a=1[outv][outa]" -map [outv] -map [outa] ${output}`;

  return `${baseCommand} "${filters.join(" ")} ${concatInputs} ${endCommand}`;
}

// Example timestamps
const timestamps: Timestamps[] = [
  { start: 5, end: 10 },
];

const ffmpegCommand = TrimVideo("in.mp4", "out.mp4", timestamps);
console.log(ffmpegCommand);
© www.soinside.com 2019 - 2024. All rights reserved.