gpt4 book ai didi

c# - 如何在 Silverlight 4 中使用 MediaStreamSource 实现播放非缓冲 WAV?

转载 作者:可可西里 更新时间:2023-11-01 07:58:59 25 4
gpt4 key购买 nike

背景

我正在尝试使用发现的 MediaStreamSource 实现在 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) block :

Read is not supported on the main thread when buffering is disabled

问题

有没有办法在 Silverlight 4 中播放 WAV 流而无需提前缓冲?

最佳答案

在读取流时下载流是行不通的,因为读取流进行播放会移动流中的 Position 属性,当您将数据写入流时,位置将不在正确的位置。这基本上就是为什么你不能在你的流中寻找的原因。

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

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

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

如果您不确定,您还可以检查项目的其余部分以查看其用法。

希望这对您有所帮助。

关于c# - 如何在 Silverlight 4 中使用 MediaStreamSource 实现播放非缓冲 WAV?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2939857/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com