amishshah / prism-media

Easily transcode media using Node.js 🎶
https://amishshah.github.io/prism-media
Apache License 2.0
241 stars 55 forks source link

How to debug the ffmpeg execution? #107

Open n0th1ng-else opened 2 years ago

n0th1ng-else commented 2 years ago

Issue:

I am trying to implement the converter into wav. It works pretty fine for mp3/ogg files. But then I wanted to use the same implementation for mp4 file (ie cut the video, convert it into wav) But the output is always empty.

How do I debug the execution and understand what goes wrong?

Steps to reproduce:

To simplify the process, I first tried the convertation with ffmpeg cli: ./node_modules/ffmpeg-static/ffmpeg -i ~/Downloads/file_97.mp4 -vn -ac 1 -ar 16000 test.wav

it works good ^^

Then in the code, I do almost the same, but do a GET request to download the file rather than read the file from the file system. the result is empty...

import { FFmpeg } from "prism-media";

const getMpegDecoder = (): FFmpeg =>
  new FFmpeg({
    args: [
      "-analyzeduration",
      "0",
      "-loglevel",
      "0",
      "-vn",
      "-ar",
      "16000",
      "-ac",
      "1",
    ],
  });

const getWavBuffer = (fileLink: string): Promise<Buffer> => { // buffer is empty
  logger.info("Converting into wav 💿");

  return new Promise<Buffer>((resolve, reject) => {
    runGet(fileLink, (response) => {
      const wavBuffer: Buffer[] = [];
      const wavStream = response.pipe(getMpegDecoder());

      wavStream.on("data", (bufferPart) => wavBuffer.push(bufferPart));
      wavStream.on("error", (err) => reject(err));
      wavStream.on("end", () => resolve(Buffer.concat(wavBuffer)));
    }).on("error", (err) => reject(err));
  });
};
mtripg6666tdr commented 1 year ago

conversion maybe goes well by specifying '-f' and '-acodec'

mtripg6666tdr commented 1 year ago

exclude 'loglevel' from your args, write as following then you can see ffmpeg logs

const ffmpeg = new FFmpeg({/* options */});
ffmpeg.process.stderr.on("data", chunk => console.debug(chunk.toString()));