Skip to content

Instantly share code, notes, and snippets.

@jonahgeorge
Last active September 4, 2023 14:54
Show Gist options
  • Save jonahgeorge/217325e4c9330532a3109f4d2bda8155 to your computer and use it in GitHub Desktop.
Save jonahgeorge/217325e4c9330532a3109f4d2bda8155 to your computer and use it in GitHub Desktop.
FFMPEG Splice Ads Into Audio File
const ffmpeg = require('fluent-ffmpeg');
const fs = require('fs');
const _ = require('lodash');
const INPUT_FILE = "./data/input.mp3";
const OUTPUT_FILE = "./output.mp3";
function splice(fileName, startTime, duration, outputFile) {
var command = ffmpeg(fileName);
command.seekInput(startTime);
if (duration) {
command.duration(duration + 0.1); // AHAHAHAHAHAHA
}
command.save(outputFile);
}
function concat(files, outputFile) {
var command = ffmpeg();
files.forEach((file) => { command = command.input(file); });
return command.mergeToFile(outputFile, './tmp');
}
function makeSplices(inputFile, adTimes, outputDir) {
var files = [];
var cursor = 0;
adTimes.forEach((adTime, index) => {
var outputFile = './tmp/splice-' + index + '.mp3';
var duration = (index == adTimes.length-1) ? null : (adTime - cursor);
splice(inputFile, cursor, duration, outputFile);
cursor = adTime;
files.push(outputFile);
});
return files;
}
function getAds(numberOfAds, cb) {
fs.readdir("./ads", (err, files) => {
var betterFiles = _.map(files, (file) => "./ads/" + file);
var ads = _.sampleSize(betterFiles, numberOfAds);
cb(ads);
})
}
function interperseAds(splices, cb) {
var numberOfAds = splices.length - 1;
var ads = getAds(numberOfAds, function (ads) {
console.log(ads);
var zipped = _.zip(splices, ads);
console.log(zipped);
var files = _.flatten(zipped);
console.log(files);
return files;
});
}
function doStuff(originalFile, adTimes, outputFile) {
var splices = makeSplices(originalFile, adTimes, outputFile);
setTimeout(function () {
interperseAds(splices, function (files) {
concat(files, outputFile);
});
}, 1000);
}
// splice(INPUT_FILE, START_TIME, END_TIME, OUTPUT_FILE);
// concat(FILES, OUTPUT_FILE);
// makeSplices(INPUT_FILE, [15, 30, 90, 120], OUTPUT_FILE)
doStuff(INPUT_FILE, [10, 30], OUTPUT_FILE)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment