Node-Packages / video_processing.yaml
mypiper's picture
Update video_processing.yaml
71e6036 verified
raw
history blame
2.58 kB
_id: video_processing
version: 2
title: en=Video processing;ru=Работа с видео
description: Using FFmpeg process videos
readme: "Fix ffmpeg fluent"
author: Anton Breslavskii | https://github.com/breslavsky
url: https://huggingface.co/PiperMy/Node-Packages/resolve/main/video_processing.yaml
nodes:
split_video_by_frames:
_id: split_video_by_frames
arrange:
x: 280
y: 110
category:
id: split_video_by_frames
title: en=Video processing;ru=Обработка видео
costs: ""
environment: {}
inputs:
video:
order: 1
title: Source video
type: video
required: true
fps:
order: 2
title: Frame rate
type: integer
min: 1
max: 60
step: 1
default: 12
outputs:
frames:
title: Frames
type: image[]
package: video_processing
script: |-
export async function run({ inputs }) {
const { video, fps } = inputs;
const { FatalError, NextNode } = DEFINITIONS;
const ffmpeg = require('fluent-ffmpeg');
const path = require('path');
const fs = require('fs/promises');
const { fileTypeFromBuffer } = require('file-type');
const frames = [];
await useTempFolder(async (tmpFolder) => {
const { data } = await download(video);
const { ext } = await fileTypeFromBuffer(data);
const videoPath = path.join(tmpFolder, `source.${ext}`);
await fs.writeFile(videoPath, data);
await new Promise((resolve, reject) => {
ffmpeg(videoPath)
.outputOptions([
`-r ${fps || 12}`,
'-q:v 1'
])
.output(`${tmpFolder}/%05d.jpg`)
.on('start', (cmd) => console.log(cmd))
.on('end', () => resolve())
.on('error', (err) => reject(new FatalError(err)))
.run();
});
const files = await fs.readdir(tmpFolder);
for (const file of files) {
if (file.endsWith('jpg')) {
frames.push(await fs.readFile(path.join(tmpFolder, file)));
}
}
});
return NextNode.from({ outputs: { frames } });
}
source: catalog
title: en=Split video by frames;ru=Разбить видео по кадрам
version: 6