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

再生のためにストリームを読み取るとストリーム内の Position プロパティが移動し、ストリームにデータを書き込むときに位置が正しい位置にないため、読み取り中にストリームをダウンロードすることはできません。それが基本的に、ストリームでシークできない理由です。

その正確な問題を解決するために私がしたことは、読み取り/書き込みのロジックを埋め込むカスタム メモリ ストリーム (ReadWriteMemoryStream) を作成して、一方の端でファイルをダウンロードし、それを ReadWriteMemoryStream に追加して、代わりにこの ReadWriteMemoryStream に基づいて MediaStreamSource を作成することでした。ネットワーク ストリームの。

この ReadWriteMemoryStream の実装は、次の場所にあります。

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

よくわからない場合は、プロジェクトの残りの部分をチェックして、その使用法を確認することもできます。

お役に立てれば。

于 2012-01-11T13:06:28.590 に答える