ffmpeg.wasm icon indicating copy to clipboard operation
ffmpeg.wasm copied to clipboard

How to output/pipe information from silencedetect filter

Open Ennnm opened this issue 4 years ago • 3 comments

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

Ennnm avatar Dec 10 '21 06:12 Ennnm

You get that error because the 2> is a shell thing, not a program thing. Use -report instead.

brunoais avatar Dec 06 '22 17:12 brunoais

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();

atsixian avatar Mar 13 '23 14:03 atsixian

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;

callmephilip avatar May 14 '24 20:05 callmephilip