Как воспроизвести небуферизованный WAV с реализацией MediaStreamSource в Silverlight 4? - PullRequest
14 голосов
/ 30 мая 2010

Фон

Я пытаюсь передать потоковый файл в Silverlight 4, используя найденную реализацию MediaStreamSource здесь . Проблема в том, что я хочу воспроизвести файл, пока он еще буферизируется, или, по крайней мере, дать пользователю визуальный отклик, пока он буферизируется. На данный момент мой код выглядит так:

private void button1_Click(object sender, RoutedEventArgs e)
{
    HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(new Uri(App.Current.Host.Source, "../test.wav"));
    //request.ContentType = "audio/x-wav";
    request.AllowReadStreamBuffering = false;

    request.BeginGetResponse(new AsyncCallback(RequestCallback), request);
}

private void RequestCallback(IAsyncResult ar)
{
    this.Dispatcher.BeginInvoke(delegate()
    {
        HttpWebRequest request = (HttpWebRequest)ar.AsyncState;
        HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(ar);

        WaveMediaStreamSource wavMss = new WaveMediaStreamSource(response.GetResponseStream());

        try
        {
            me.SetSource(wavMss);
        }
        catch (InvalidOperationException)
        {
            // This file is not valid
        }
        me.Play();
    });
}

Проблема в том, что после установки request.AllowReadStreamBuffering = false поток не поддерживает поиск, и вышеупомянутая реализация выдает исключение (имейте в виду, что я поместил некоторую логику установки позиции в блок if (stream.CanSeek)):

Чтение не поддерживается в главном потоке, когда буферизация отключена

Вопрос

Есть ли способ воспроизвести поток WAV без предварительной буферизации в Silverlight 4?

1 Ответ

3 голосов
/ 11 января 2012

Загрузка потока во время чтения не будет работать, потому что чтение стера для воспроизведения будет перемещать свойство Position в потоке, и когда вы будете записывать данные в поток, позиция не будет в правильной позиции. вот почему вы не можете искать в своей ленте.

Что я сделал, чтобы решить эту проблему, так это создать собственный поток памяти (ReadWriteMemoryStream), который бы встраивал логику для чтения / записи, чтобы я мог загрузить файл на одном конце, добавить его в ReadWriteMemoryStream и основать мой MediaStreamSource на этот ReadWriteMemoryStream вместо сетевого потока.

Вы можете найти мою реализацию этого ReadWriteMemoryStream здесь:

https://github.com/salfab/open-syno/blob/master/OpenSyno/OpenSyno/ReadWriteMemoryStream.cs

Вы также можете проверить остальную часть проекта, чтобы взглянуть на его использование, если вы не уверены в этом.

Надеюсь, это поможет.

...