Я пытаюсь обнаружить тишину из аудиофайла с помощью 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);
}