использование ffmpeg для обнаружения тишины с входным каналом - PullRequest
0 голосов
/ 24 августа 2018

Я пытаюсь обнаружить тишину из аудиофайла с помощью ffmpeg в c #.
Я хочу передать поток из потока памяти c # и получить длительность молчания, как в следующей команде

ffmpeg -hide_banner -i pipe:0 -af silencedetect=noise=-50dB:d=0.5 -f null - 

но есть проблема, когда входной поток закачивает в трубу, ffmpeg ожидает в строке p.WaitForExit ().
когда я изменяю p.WaitForExit () на p.WaitForExit (1000) и устанавливаю таймаут форсировки, отображается следующий результат.

[mp3 @ 00000163818da580] invalid concatenated file detected - using bitrate for durationInput #0, mp3, from 'pipe:0':  
Metadata:    encoder         : Lavf57.71.100  Duration: N/A, start: 0.023021, bitrate: 86 kb/s    
Stream #0:0: Audio: mp3, 48000 Hz, mono, fltp, 86 kb/sStream mapping:  Stream #0:0 -> #0:0 (mp3 (mp3float) -> pcm_s16le (native))Output #0, null, to 'pipe:':  
Metadata:    encoder         : Lavf58.17.101    Stream #0:0: Audio: pcm_s16le, 48000 Hz, mono, s16, 768 kb/s   
 Metadata:      encoder         : Lavc58.21.105 pcm_s16le

[silencedetect @ 0000023df1786840] silence_start: 50.1098
[silencedetect @ 0000023df1786840] silence_end: 51.5957 | silence_duration: 1.48588
[silencedetect @ 0000023df1786840] silence_start: 51.5959
[silencedetect @ 0000023df1786840] silence_end: 52.127 | silence_duration: 0.531062
[silencedetect @ 0000023df1786840] silence_start: 52.8622
[silencedetect @ 0000023df1786840] silence_end: 54.0096 | silence_duration: 1.14733
[silencedetect @ 0000023df1786840] silence_start: 54.6804

как вы можете видеть в результате обнаружения молчания, но сначала с ошибкой. это означает, что входной файл правильно закачан в ffmpg, но ждет. Как я могу решить проблему без установленного времени ожидания для p.WaitForExit ()

private void Execute(string exePath, string parameters, Stream inputStream)
        {
            byte[] Data = new byte[5000];

            var p = new Process();
            var sti = p.StartInfo;
            sti.CreateNoWindow = true;
            sti.UseShellExecute = false;
            sti.FileName = exePath;
            sti.Arguments = arg;
            sti.LoadUserProfile = false;
            sti.RedirectStandardInput = true;
            sti.RedirectStandardOutput = true;

            sti.RedirectStandardError = true;

            p.ErrorDataReceived += P_ErrorDataReceived;
            p.OutputDataReceived += P_OutputDataReceived;

            p.Start();

            p.BeginOutputReadLine();
            p.BeginErrorReadLine();

            var spInput = new StreamPump(inputStream, p.StandardInput.BaseStream, 4064);
            spInput.Pump((pump, result) =>
            {
                pump.Output.Flush();
                inputStream.Dispose();
            });

            //unlimited waiting
            //p.WaitForExit();

            p.WaitForExit(1000);

        }
...