tomaszzmuda/Xabe.FFmpeg

FFProbe prints blank for this command

Adil-A-Rahman opened this issue · 1 comments

Hello,

I am trying to run this command and find out the RMS peaks of an mp3 file. Here is the command (reference I used)
ffprobe -v error -f lavfi -i "amovie=input.mp3,astats=metadata=1:reset=1" -show_entries frame_tags=lavfi.astats.Overall.RMS_level -of csv=p=0
If I run this in the command line, I am able to get the output, but this does not work with the FFprobe code:

string result = await Probe.New().Start("-v error -f lavfi -i "amovie=input.mp3,astats=metadata=1:reset=1" -show_entries frame_tags=lavfi.astats.Overall.RMS_level -of csv=p=0");
Console.WriteLine(result);  //prints nothing

What am I doing wrong ?

If I manually call it using CMD from C#, it works. Here is the code:

string commandCMD = $"/C ffprobe -v error -f lavfi -i \"amovie=input.mp3,astats=metadata=1:reset=1\" -show_entries frame_tags=lavfi.astats.Overall.RMS_level -of csv=p=0";

string result = string.Empty;
int exitCode;
var outputs = new List<string>();

using (Process process = new())
{
    process.StartInfo.UseShellExecute = false;
    process.StartInfo.CreateNoWindow = true;
    process.StartInfo.RedirectStandardOutput = true;
    process.StartInfo.FileName = "cmd";
    process.StartInfo.Arguments = commandCMD;
    process.StartInfo.RedirectStandardOutput = true;
    process.StartInfo.RedirectStandardError = true;
    process.Start();

    process.ErrorDataReceived += (sender, e) =>
    {
        if (!string.IsNullOrEmpty(e.Data))
        {
            outputs.Add(e.Data);
        }
    };
    process.BeginErrorReadLine();

    process.OutputDataReceived += (sender, e) =>
    {
        if (!string.IsNullOrEmpty(e.Data))
        {
            outputs.Add(e.Data);
        }
    };
    process.BeginOutputReadLine();

    process.WaitForExit();
    exitCode = process.ExitCode;
    process.Close();
}

foreach (var output in outputs)
{
    Console.WriteLine(output);
}

Here is the output I am expecting:
image

Thanks

Hello @Adil-A-Rahman
It turned out that this command generate some errors and output went on StandardError and is not readed.
In FFprobeWrapper.RunProcess there is a line with process.StandardError.ReadToEnd()

It needs to be changed to event listener and added StandardError listener + set standardError flag in RunProcess method to true.

I'm quite busy right now, but I really encourage to participate to creating that code :)