2010-05-30 15 views
14

背景如何在Silverlight 4中使用MediaStreamSource实现播放非缓冲WAV?

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

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中缓冲它?

回答

3

下载一个流,而你读它不会工作,因为阅读steram播放将移动流中的位置属性,并且当你将数据写入流时,位置将不会在正确的位置。这基本上就是为什么你不能在你的流中寻找。

我做了什么来解决确切的问题是创建一个自定义内存流(ReadWriteMemoryStream),它将嵌入读/写逻辑,所以我可以在一端下载文件,将其添加到ReadWriteMemoryStream并基于我的MediaStreamSource在此ReadWriteMemoryStream而不是网络流。

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

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

,你也可以检查项目的其余部分,以便看看它的使用,如果你不确定它。

希望这会有所帮助。