ffmpegwasm / ffmpeg.wasm

FFmpeg for browser, powered by WebAssembly
https://ffmpegwasm.netlify.app
MIT License
14.33k stars 841 forks source link

How to output/pipe information from silencedetect filter #287

Open Ennnm opened 2 years ago

Ennnm commented 2 years ago

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

  1. 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

brunoais commented 1 year ago

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

atsixian commented 1 year ago

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();
callmephilip commented 5 months ago

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;