У меня есть работающий аудиоплеер, реализованный в WP7, который подключает аудиопоток к сети с помощью HttpWebRequest и использует AudioStreamingAgent и MediaStreamSource для воспроизведения его в фоновом режиме.
Код для извлечения потока следующий:
public class AudioTrackStreamer : AudioStreamingAgent
{
protected override void OnBeginStreaming(AudioTrack track, AudioStreamer streamer)
{
stream = GetDownloadStream(track.Tag);
// Use sine wave audio generator to simulate a streaming audio feed
BackgroundMp3MediaStreamSource mss = new BackgroundMp3MediaStreamSource(stream);
// Event handler for when a track is complete or the user switches tracks
mss.StreamingCompleted += new EventHandler(mss_StreamingCompleted);
// Set the source
streamer.SetSource((MediaStreamSource) mss);
}
}
Мне нужно изменить клиента, чтобы получить поток AES и декодировать его перед воспроизведением.
Хотя я мог бы создать декодированный поток и передать его в BackgroundMp3MediaStreamSource,Что-то вроде:
...
stream = GetDownloadStream(track.Tag);
decodedStream = GetDecodedStream(stream);
BackgroundMp3MediaStreamSource mss = new BackgroundMp3MediaStreamSource(decodedStream);
...
private Stream GetDecodedStream(Stream encoded) {
Stream destination = new MemoryStream();
BackgroundWorker streamCopier = new BackgroundWorker();
streamCopier.DoWork += (o, e) => StreamCopierDoWork(encoded, destination);
streamCopier.RunWorkerAsync();
return new NonUiStreamer(destination);
}
private static void StreamCopierDoWork(Stream encoded, Stream destination) {
const int chunk = 1 * 1024;
var buffer = new byte[chunk];
AsyncCallback rc = null;
rc = readResult => {
int read = encoded.EndRead(readResult);
if (read > 0) {
destination.BeginWrite(buffer, 0, read, writeResult => {
destination.EndWrite(writeResult);
encoded.BeginRead(buffer, 0, buffer.Length, rc, null);
}, null);
}
};
encoded.BeginRead(buffer, 0, chunk, rc, null);
}
Примечание : Я пока не декодирую поток.Просто скопируйте его асинхронно в другой поток, чтобы увидеть, все ли работает.
Но когда я пытаюсь прочитать первые байты декодированного потока decodedStream.Read(data, 0, 3);
, возвращается 0 байтов.
Почему не получаетсяЯ читаю декодированный поток?