14

背景

我正在尝试使用此处找到的 MediaStreamSource 实现在 Silverlight 4 中流式传输波形文件。问题是我想在文件仍在缓冲时播放文件,或者至少在缓冲时给用户一些视觉反馈。现在我的代码看起来像这样:

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)块中):

禁用缓冲时,主线程不支持读取

问题

有没有办法在 Silverlight 4 中播放 WAV 流而不预先缓冲它?

4

1 回答 1

3

在读取流时下载流是行不通的,因为读取 steram 以进行播放会在流中移动 Position 属性,并且当您将数据写入流时,位置将不在正确的位置。这基本上就是为什么你不能在你的流中寻找。

我为解决这个确切问题所做的是创建一个自定义内存流(ReadWriteMemoryStream),它将嵌入读/写逻辑,这样我就可以在一端下载文件,将它添加到 ReadWriteMemoryStream 并将我的 MediaStreamSource 建立在这个 ReadWriteMemoryStream 上的网络流。

你可以在这里找到我对这个 ReadWriteMemoryStream 的实现:

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

如果您不确定,您还可以检查项目的其余部分以了解其使用情况。

希望这可以帮助。

于 2012-01-11T13:06:28.590 回答