feat: dice (part 1/2)

This commit is contained in:
Saahil 2024-12-19 19:02:50 -05:00
parent 6c2af46c0d
commit 310fb08da8
No known key found for this signature in database
GPG key ID: 8A8B64515254CFC6
2 changed files with 72 additions and 0 deletions

57
scripts/remove_bg.ts Normal file
View file

@ -0,0 +1,57 @@
// convert video to frames
// remove bg from frames
// compile frames into video
// must have ffmpeg installed
import canvas from "canvas";
import { execSync } from "child_process";
const { createCanvas, loadImage } = canvas
import fs, { existsSync, readdirSync } from "fs"
// rmrif frames and remake
execSync(`rm -rf assets/dice/frames`, { stdio: 'inherit' })
execSync(`mkdir assets/dice/frames`, { stdio: 'inherit' })
if(!process.env.VIDEO_FILE) process.env.VIDEO_FILE=`assets/dice/green_screen_dice.mp4`
if(!process.env.OUT_FILE) process.env.OUT_FILE=`assets/dice/no_green_screen_dice.mp4`
const removeGreenScreen = async (inputPath, outputPath) => {
const image = await loadImage(inputPath);
const canvas = createCanvas(image.width, image.height);
const ctx = canvas.getContext('2d');
ctx.drawImage(image, 0, 0, image.width, image.height);
const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
const data = imageData.data;
for (let i = 0; i < data.length; i += 4) {
const red = data[i];
const green = data[i + 1];
const blue = data[i + 2];
if (green > 150 && red < 100 && blue < 100) {
data[i + 3] = 0; // Set alpha to 0 (transparent)
}
}
ctx.putImageData(imageData, 0, 0);
const buffer = canvas.toBuffer('image/png');
fs.writeFileSync(outputPath, buffer);
console.log(`Green screen removed and saved to ${outputPath}`);
};
execSync(`ffmpeg -i ${process.env.VIDEO_FILE} assets/dice/frames/frame_%04d.png`, { stdio: 'inherit' })
// Usage
let frames = readdirSync("assets/dice/frames");
;(async () => {
for(const frame of frames){
if(!existsSync(`assets/dice/frames/cleaned_${frame}`)){
await removeGreenScreen(`assets/dice/frames/${frame}`, `assets/dice/frames/cleaned_${frame}`)
} else {
console.log(`Skipping ${frame}`)
}
}
console.log(`Compiling frames into video`)
execSync(`ffmpeg -framerate 30 -i assets/dice/frames/cleaned_frame_%04d.png -c:v libx264 -pix_fmt yuva420p ${process.env.OUT_FILE}`, { stdio: 'inherit' })
console.log(`Done`)
})()

View file

@ -0,0 +1,15 @@
import { execSync } from "child_process"
import fs from "fs"
const splittedVideos = fs.readdirSync("assets/dice/splits")
for(const video of splittedVideos){
console.log(`Removing bg from ${video}`)
const cmd = `ts-node scripts/remove_bg.ts`
console.log(cmd)
execSync (cmd, { stdio: 'inherit', env: {
...process.env,
VIDEO_FILE: `assets/dice/splits/${video}`,
OUT_FILE: `assets/dice/splits/c/${video}`
} })
}