63 lines
1.5 KiB
JavaScript
63 lines
1.5 KiB
JavaScript
|
import { extname } from "path";
|
||
|
|
||
|
const args = process.argv.slice(-2);
|
||
|
|
||
|
const video = args[0];
|
||
|
const labels = args[1];
|
||
|
const ext = extname(video);
|
||
|
|
||
|
const labels_contents = (await $`awk '{print $3, $4, $5}' < ${labels}`).stdout;
|
||
|
|
||
|
const FREQ = 48000;
|
||
|
|
||
|
const working_dir = "/tmp/dziurkacz";
|
||
|
|
||
|
const before_path = `${working_dir}/before${ext}`;
|
||
|
const after_path = `${working_dir}/after${ext}`;
|
||
|
const working_path = `${working_dir}/working${ext}`;
|
||
|
const vdlist = `${working_dir}/vdlist.txt`;
|
||
|
|
||
|
async function makeCut({ duration, start, end }) {
|
||
|
await Promise.all([
|
||
|
$`ffmpeg -i ${working_path} -to ${start} -c copy -an -y ${before_path}`,
|
||
|
$`ffmpeg -ss ${end} -i ${working_path} -c copy -an -y ${after_path}`,
|
||
|
]);
|
||
|
await Promise.all([
|
||
|
$`echo file ${before_path} > ${vdlist}`,
|
||
|
$`echo file ${after_path} >> ${vdlist}`,
|
||
|
]);
|
||
|
await $`ffmpeg -f concat -safe 0 -i ${vdlist} -c copy -y ${working_path} `;
|
||
|
}
|
||
|
|
||
|
await $`mkdir -p ${working_dir}`;
|
||
|
await $`cp -f ${video} ${working_path}`;
|
||
|
|
||
|
const cuts = labels_contents
|
||
|
.split(os.EOL)
|
||
|
.slice(0, -1)
|
||
|
.map((e) =>
|
||
|
e
|
||
|
.split(" ")
|
||
|
.slice(1)
|
||
|
.map((x) => parseFloat(x))
|
||
|
)
|
||
|
.map(([samples, start]) => ({
|
||
|
duration: samples / FREQ,
|
||
|
start,
|
||
|
end: start + samples / FREQ,
|
||
|
}));
|
||
|
|
||
|
// await makeCut(cuts[0]);
|
||
|
// await makeCut(cuts[1]);
|
||
|
|
||
|
for (const cut of cuts) {
|
||
|
await makeCut(cut);
|
||
|
}
|
||
|
|
||
|
console.log(
|
||
|
`Removed ${cuts
|
||
|
.map((e) => e.duration)
|
||
|
.reduce((a, b) => a + b, 0)
|
||
|
.toFixed(3)}s from video`
|
||
|
);
|