[英]How to play non buffered WAV with MediaStreamSource implementation in Silverlight 4?
背景
我正在嘗試使用此處找到的 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 流而不預先緩沖它?
在讀取流時下載它是行不通的,因為讀取 steram 進行播放會移動流中的 Position 屬性,並且當您將數據寫入流時,位置將不會處於正確位置。 這基本上就是你不能在你的信息流中尋找的原因。
我為解決這個確切問題所做的是創建一個自定義內存流(ReadWriteMemoryStream),它會嵌入讀/寫邏輯,這樣我就可以在一端下載文件,將它添加到 ReadWriteMemoryStream 並將我的 MediaStreamSource 建立在這個 ReadWriteMemoryStream 上的網絡流。
您可以在此處找到我對此 ReadWriteMemoryStream 的實現:
https://github.com/salfab/open-syno/blob/master/OpenSyno/OpenSyno/ReadWriteMemoryStream.cs
如果您不確定它,您還可以檢查項目的其余部分以查看其使用情況。
希望這可以幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.