Wie kann ich einen OpusOggReadStream als WaveStream verwenden? (C#)C#

Ein Treffpunkt für C#-Programmierer
Guest
 Wie kann ich einen OpusOggReadStream als WaveStream verwenden? (C#)

Post by Guest »

Ich verwende derzeit den NAudio-Player, um Musik mit C# abzuspielen. Normalerweise verwende ich den MediaFoundationReader, aber in einigen Fällen, wie zum Beispiel bei Opus, kann ich ihn nicht verwenden, weil er nicht kompatibel ist.
Was ich derzeit mache, ist, dass ich Concentus verwende. Und mit Concentus dekodiere ich die gesamte Datei, lade sie in einen separaten Speicherstream und verwende diesen Speicherstream dann für den Wave-Stream.
try
{
_reader = new MediaFoundationReader(trackPath);
}
catch
{
var fileIn = File.OpenRead(trackPath);
var pcmStream = new MemoryStream();

var decoder = OpusCodecFactory.CreateDecoder(48000, 1);
var oggIn = new OpusOggReadStream(decoder, fileIn);

Task.Run(() =>
{
while (oggIn.HasNextPacket)
{
var packet = oggIn.DecodeNextPacket();
if (packet == null)
continue;

foreach (var t in packet)
{
var bytes = BitConverter.GetBytes(t);
pcmStream.Write(bytes, 0, bytes.Length);
}
}

pcmStream.Position = 0;
}).Wait();
_reader = new RawSourceWaveStream(pcmStream, new(48000, 1));
}

_reader ist mein NAudio WaveStream
jetzt ... ich habe einige ziemlich große Dateien und eine davon ist 200 MB groß, und das hat GIGAbytes an Speicher geschaffen Verbrauch und benötigt mehrere Minuten zum Lesen, daher brauche ich dafür bessere Lösungen.
Meine aktuelle Idee ist, wenn ich die Konvertierung in einen Speicherstream überspringe, könnte ich den OpusOggStream direkt als WaveStream verwenden , dafür müsste ich das konvertieren Position in Bytes in einen TimeSpan ... aber wie? Meine theoretischen Kenntnisse über Audio-Codecs sind 0.
Wenn Sie eine bessere Idee haben, wie ich Leistung und Speicherverbrauch einsparen kann, lassen Sie es mich bitte auch wissen, das würde auch helfen !

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post