Асинхронное копирование аудиопотока в wp7

У меня есть рабочий аудиоплеер, реализованный в 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 байтов.

Почему я не могу прочитать decodedStream?


person dcarneiro    schedule 22.02.2012    source источник
comment
Привет, Даниэль. Я пытаюсь реализовать фоновый потоковый аудиоплеер stackoverflow.com/questions/7111300/. Не могли бы вы предоставить мне, как это сделать? Я имею в виду код. Я искал любой пример, но я не мог найти ни одного подходящего.   -  person Alexandre    schedule 02.03.2012
comment
@AlexMaslakov, вы можете получить хороший пример здесь: github.com/loarabia/ManagedMediaHelpers, но я только может воспроизводить mp3 со следующими характеристиками: MPEG версии 1, битрейт 320000 и частота дискретизации 44100   -  person dcarneiro    schedule 02.03.2012
comment
Почему он воспроизводит мп3 только с определенными характеристиками?   -  person Alexandre    schedule 02.03.2012
comment
@AlexMaslakov Я думаю, что Mpeg Frame в этом решении не поддерживает определенные спецификации. Я не пробовал все возможные спецификации, но, по крайней мере, он не воспроизводился, когда я выбирал MPEG2 с битрейтом 64000 и частотой дискретизации 22050.   -  person dcarneiro    schedule 02.03.2012
comment
@Daniel: Привет, Даниэль, можешь ли ты увидеть мой вопрос stackoverflow.com/questions/14177334/   -  person Arslan Pervaiz    schedule 06.01.2013