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