Я пытаюсь сделать mp3-плеер потоковым. Mp3-файл, который находится в интернет-источнике, может воспроизводиться в реальном времени в этом проекте. Также я хочу, чтобы он поддерживал Pause, Stop, Forward, Backward. Чтобы получить эти функции, мне нужно написать гибкий плеер.NAudio Mp3Frame является нулевым при потоковом mp3
Так что я написал этот код:
WaveOut outer;
AcmMp3FrameDecompressor decompressor;
BufferedWaveProvider provider;
public void Play()
{
Task.Run(() =>
{
var response = WebRequest.Create(url).GetResponse();
var responseStream = response.GetResponseStream();
Mp3Frame frame;
byte[] buffer = new byte[30000];
int bytesRead = 0;
MemoryStream ms = new MemoryStream();
ReadFullyStream fully = new ReadFullyStream(ms);
do
{
bytesRead = responseStream.Read(buffer, 0, buffer.Length);
ms.Write(buffer, 0, bytesRead);
frame = Mp3Frame.LoadFromStream(fully);
if (decompressor == null)
{
decompressor = CreateFrameDecompressor(frame) as AcmMp3FrameDecompressor;
provider = new BufferedWaveProvider(decompressor.OutputFormat);
provider.BufferDuration = TimeSpan.FromSeconds(50);
outer = new WaveOut();
outer.Init(provider);
outer.Play();
}
int decompressed = decompressor.DecompressFrame(frame, buffer, 0);
provider.AddSamples(buffer, 0, decompressed);
}
while (bytesRead > 0);
});
}
В коде выше он вызывает исключение из кадра равна нулю. Это означает, что LoadMp3FromStream
не работает для MemoryStream
. Как я могу это исправить?
Я внедрил этот код с изменениями из 'Mp3StreamingDemo/MP3StreamingPanel.cs'. Проблема здесь решена путем удаления ReadFullyStream и перестановки MemoryStream. Я забыл вопрос удалить, извините. Теперь у меня есть более важный вопрос, связанный с использованием памяти во время потоковой передачи. Я буду признателен, если взглянуть на http://stackoverflow.com/questions/39544929/how-to-stream-an-mp3-file-from-a-url-without-using-much-ram. Спасибо @Mark. –