簡體   English   中英

如何在 Silverlight 4 中使用 MediaStreamSource 實現播放非緩沖 WAV?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM