usando ffmpeg para detecção de silêncio com tubo de entrada

0

Eu estou tentando detectar o silêncio do arquivo de áudio com ffmpeg em c #.
eu quero canalizar a entrada do fluxo de memória c # e obter a duração do silêncio como o seguinte comando

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

mas há um problema, quando o fluxo de entrada é bombeado no canal, o ffmpeg espera na linha p.WaitForExit ().
Quando eu mudar p.WaitForExit () para p.WaitForExit (1000) e definir o tempo limite de força, o resultado a seguir é exibido.

[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

como você pode ver no resultado, a detecção do silêncio é feita, mas com erro no primeiro. esse arquivo de entrada significa bombeado corretamente no ffmpg, mas esperando. Como posso resolver o problema sem definir o tempo limite para 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);

        }
    
por Moharrer 25.08.2018 / 16:19

0 respostas