ffmpeg.wasm
ffmpeg.wasm copied to clipboard
How to output/pipe information from silencedetect filter
Describe the bug Hello! I was trying to save the silences produced by the filter in a .txt file for reference
To Reproduce
Steps to reproduce the behavior:
1. await ffmpeg.run( '-i', 'test.aac', '-af', 'silencedetect=d=0.8', '-f', 'null', '-', '2>', 'silences.txt' );
2. See error
[fferr] Input #0, aac, from 'test.aac':
log.js:15 [fferr] Duration: 00:00:54.94, bitrate: 127 kb/s
log.js:15 [fferr] Stream #0:0: Audio: aac (LC), 32000 Hz, mono, fltp, 128 kb/s
log.js:15 [fferr] [NULL @ 0x1a6c980] Unable to find a suitable output format for '2>'
log.js:15 [fferr] 2>: Invalid argument
log.js:15 [fferr] Conversion failed!
log.js:15 [ffout] FFMPEG_END
the command works when its just
await ffmpeg.run( '-i', 'test.aac', '-af', 'silencedetect=d=0.8', '-f', 'null', '-' );
Expected behavior Expected that a .txt file with the logs for silences to be produced in memfs. It worked with vanilla ffmpeg Not sure how to write this command.
Have seen other discussions where the desired log in parsed from the the logger, is this the only way? https://github.com/ffmpegwasm/ffmpeg.wasm/issues/277
You get that error because the 2> is a shell thing, not a program thing.
Use -report instead.
I finally figured out the solution. We can use a custom logger. Maybe we should add this to the doc.
const output: string[] = [];
const ffmpeg = createFFmpeg();
ffmpeg.setLogger(({ message }) => {
output.push(message);
});
await ffmpeg.load();
Here's what worked for me (based on @brunoais's suggestion; thank you)
await ffmpeg.exec([
"-i",
"/home/source/TEST.mp3",
"-report", // <-- this is key
"-af",
"silencedetect=d=0.8",
"-f",
"null",
"-",
]);
// grab latest execution report
const entries = await ffmpeg.listDir("/");
const logFiles = entries.filter((e) => !e.isDir).filter((e) => e.name.match(/ffmpeg-[0-9-]+\.log/gi));
if (logFiles.length === 0) {
// no logs 🤷♂️
}
return (await ffmpeg.readFile(`/${logFiles.sort()[logFiles.length - 1].name}`, "utf8")) as string;