kyr*_*isu 14 .net c# wav silverlight-4.0 wavmss
背景
我正在尝试使用此处的 MediaStreamSource实现在Silverlight 4中传输wave文件.问题是我想在缓冲时播放文件,或者至少在缓冲时给用户一些视觉反馈.现在我的代码看起来像这样:
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();
});
}
Run Code Online (Sandbox Code Playgroud)
问题是在设置request.AllowReadStreamBuffering = false流后不支持搜索并且上面提到的实现抛出异常(请记住我已经将一些位置设置逻辑放入if (stream.CanSeek)块中):
禁用缓冲时,主线程不支持读取
题
有没有办法在Silverlight 4中预先缓存WAV流?
在读取流时下载流是行不通的,因为读取流进行播放会移动流中的 Position 属性,并且当您将数据写入流时,位置将不会位于正确的位置。这基本上就是您无法在流中搜索的原因。
我为解决这个问题所做的就是创建一个自定义内存流(ReadWriteMemoryStream),它将嵌入读/写逻辑,这样我就可以在一端下载文件,将其添加到 ReadWriteMemoryStream 并将我的 MediaStreamSource 建立在这个 ReadWriteMemoryStream 上的网络流。
您可以在这里找到我对此 ReadWriteMemoryStream 的实现:
https://github.com/salfab/open-syno/blob/master/OpenSyno/OpenSyno/ReadWriteMemoryStream.cs
如果您不确定,您还可以检查项目的其余部分,以了解其用法。
希望这可以帮助。