Anonymous
Opusdec.exe не может декодировать со стандартного ввода на стандартный вывод
Сообщение
Anonymous » 23 окт 2024, 15:50
Я пытаюсь кодировать и декодировать данные opus с помощью opusdec в C#.
Код: Выделить всё
using System.Diagnostics;
List samples = new List();
WaveInEvent waveIn = new WaveInEvent();
WaveOutEvent waveOut = new WaveOutEvent();
waveIn.WaveFormat = WaveFormat.CreateIeeeFloatWaveFormat(48000, 2);
waveIn.BufferMilliseconds = 50;
var writer = new WaveFileWriter("output.wav", waveIn.WaveFormat);
waveIn.DataAvailable += (sender, e) =>
{
using (MemoryStream m4 = new MemoryStream())
using (var reader = new RawSourceWaveStream(new MemoryStream(e.Buffer, 0, e.BytesRecorded), waveIn.WaveFormat))
//using (var conversionStream = new WaveFormatConversionProvider(waveIn.WaveFormat, reader))
{
writer.Write(e.Buffer, 0, e.BytesRecorded);
WaveFileWriter.WriteWavFileToStream(m4, reader);
m4.Seek(0, SeekOrigin.Begin);
ProcessStartInfo startInfo = new ProcessStartInfo
{
FileName = "opusenc.exe",
Arguments = "--quiet --speech --bitrate 160 - -",
RedirectStandardInput = true,
RedirectStandardOutput = true,
UseShellExecute = false
};
MemoryStream opusBytes = new MemoryStream();
using (Process process = Process.Start(startInfo))
{
process.StandardInput.BaseStream.Write(m4.ToArray());
process.StandardInput.Flush();
byte[] buffer = new byte[1024];
int bytes = 0;
while ((bytes = process.StandardOutput.BaseStream.Read(buffer, 0, buffer.Length)) > 0)
{
opusBytes.Write(buffer, 0, bytes);
}
}
Console.WriteLine(m4.Length);
Console.WriteLine(opusBytes.Length);
samples.Add(opusBytes.ToArray());
}
Console.WriteLine("Recording");
};
waveIn.StartRecording();
Console.ReadLine();
waveIn.StopRecording();
Thread.Sleep(1000);
writer.Close();
foreach(var sample in samples)
{
//File.WriteAllBytes("temp.opus", sample);
MemoryStream wavBytes = new MemoryStream();
ProcessStartInfo startInfo = new ProcessStartInfo
{
FileName = "opusdec.exe",
Arguments = "- -",
RedirectStandardInput = true, // Rediriger l'entrée standard
RedirectStandardOutput = true,
UseShellExecute = false
};
using (Process process = Process.Start(startInfo))
{
process.StandardInput.BaseStream.Write(sample);
process.StandardInput.Close();
byte[] buffer = new byte[1024];
int bytes = 0;
while ((bytes = process.StandardOutput.BaseStream.Read(buffer, 0, buffer.Length)) > 0)
{
wavBytes.Write(buffer, 0, bytes);
}
}
wavBytes.Position = 0;
waveOut.Init(new RawSourceWaveStream(wavBytes, new WaveFormat(48000,16,2)));
waveOut.Play();
//Console.ReadLine();
while(waveOut.PlaybackState == PlaybackState.Playing)
{ }
}
но opusdec выдает
Если я раскавычу //File.WriteAllBytes("temp.opus", sample); и попытаюсь декодировать файл с помощью cmd и opusdec, все будет работать нормально .
Если я заменю Arguments = "- -", на Arguments = "temp.opus -",, всё работает нормально.
Если я наберу
Код: Выделить всё
{
FileName = "opusdec.exe",
Arguments = "- test.wav",
RedirectStandardInput = true, // Rediriger l'entrée standard
RedirectStandardOutput = true,
UseShellExecute = false
};
using (Process process = Process.Start(startInfo))
{
process.StandardInput.BaseStream.Write(File.ReadAllBytes("temp.opus"));
process.StandardInput.Close();
byte[] buffer = new byte[1024];
int bytes = 0;
while ((bytes = process.StandardOutput.BaseStream.Read(buffer, 0, buffer.Length)) > 0)
{
wavBytes.Write(buffer, 0, bytes);
}
}
он также работает нормально.
Все это приводит меня к выводу, что при использовании stdin и stdout с opusdec.exe возникает проблема. Я ошибаюсь?
Подробнее здесь:
https://stackoverflow.com/questions/791 ... -to-stdout
1729687852
Anonymous
Я пытаюсь кодировать и декодировать данные opus с помощью opusdec в C#. [code]using System.Diagnostics; List samples = new List(); WaveInEvent waveIn = new WaveInEvent(); WaveOutEvent waveOut = new WaveOutEvent(); waveIn.WaveFormat = WaveFormat.CreateIeeeFloatWaveFormat(48000, 2); waveIn.BufferMilliseconds = 50; var writer = new WaveFileWriter("output.wav", waveIn.WaveFormat); waveIn.DataAvailable += (sender, e) => { using (MemoryStream m4 = new MemoryStream()) using (var reader = new RawSourceWaveStream(new MemoryStream(e.Buffer, 0, e.BytesRecorded), waveIn.WaveFormat)) //using (var conversionStream = new WaveFormatConversionProvider(waveIn.WaveFormat, reader)) { writer.Write(e.Buffer, 0, e.BytesRecorded); WaveFileWriter.WriteWavFileToStream(m4, reader); m4.Seek(0, SeekOrigin.Begin); ProcessStartInfo startInfo = new ProcessStartInfo { FileName = "opusenc.exe", Arguments = "--quiet --speech --bitrate 160 - -", RedirectStandardInput = true, RedirectStandardOutput = true, UseShellExecute = false }; MemoryStream opusBytes = new MemoryStream(); using (Process process = Process.Start(startInfo)) { process.StandardInput.BaseStream.Write(m4.ToArray()); process.StandardInput.Flush(); byte[] buffer = new byte[1024]; int bytes = 0; while ((bytes = process.StandardOutput.BaseStream.Read(buffer, 0, buffer.Length)) > 0) { opusBytes.Write(buffer, 0, bytes); } } Console.WriteLine(m4.Length); Console.WriteLine(opusBytes.Length); samples.Add(opusBytes.ToArray()); } Console.WriteLine("Recording"); }; waveIn.StartRecording(); Console.ReadLine(); waveIn.StopRecording(); Thread.Sleep(1000); writer.Close(); foreach(var sample in samples) { //File.WriteAllBytes("temp.opus", sample); MemoryStream wavBytes = new MemoryStream(); ProcessStartInfo startInfo = new ProcessStartInfo { FileName = "opusdec.exe", Arguments = "- -", RedirectStandardInput = true, // Rediriger l'entrée standard RedirectStandardOutput = true, UseShellExecute = false }; using (Process process = Process.Start(startInfo)) { process.StandardInput.BaseStream.Write(sample); process.StandardInput.Close(); byte[] buffer = new byte[1024]; int bytes = 0; while ((bytes = process.StandardOutput.BaseStream.Read(buffer, 0, buffer.Length)) > 0) { wavBytes.Write(buffer, 0, bytes); } } wavBytes.Position = 0; waveOut.Init(new RawSourceWaveStream(wavBytes, new WaveFormat(48000,16,2))); waveOut.Play(); //Console.ReadLine(); while(waveOut.PlaybackState == PlaybackState.Playing) { } } [/code] но opusdec выдает [code]Failed to open '-'.[/code] Если я раскавычу //File.WriteAllBytes("temp.opus", sample); и попытаюсь декодировать файл с помощью cmd и opusdec, все будет работать нормально . Если я заменю Arguments = "- -", на Arguments = "temp.opus -",, всё работает нормально. Если я наберу [code] { FileName = "opusdec.exe", Arguments = "- test.wav", RedirectStandardInput = true, // Rediriger l'entrée standard RedirectStandardOutput = true, UseShellExecute = false }; using (Process process = Process.Start(startInfo)) { process.StandardInput.BaseStream.Write(File.ReadAllBytes("temp.opus")); process.StandardInput.Close(); byte[] buffer = new byte[1024]; int bytes = 0; while ((bytes = process.StandardOutput.BaseStream.Read(buffer, 0, buffer.Length)) > 0) { wavBytes.Write(buffer, 0, bytes); } } [/code] он также работает нормально. Все это приводит меня к выводу, что при использовании stdin и stdout с opusdec.exe возникает проблема. Я ошибаюсь? Подробнее здесь: [url]https://stackoverflow.com/questions/79117982/opusdec-exe-unble-to-decode-from-stdin-to-stdout[/url]