使用 NAudio 读取包含作品音频的 MemoryStream
Posted
技术标签:
【中文标题】使用 NAudio 读取包含作品音频的 MemoryStream【英文标题】:Reading a MemoryStream containing opus audio with NAudio 【发布时间】:2020-11-14 18:41:48 【问题描述】:我正在尝试播放来自网络的作品音频文件,我尝试使用MemoryStream
进行缓冲。我知道 NAudio 能够获取 url,但是我需要在访问文件之前设置 cookie 和用户代理,这样就消除了该选项。
我最新的方法是缓冲 30~ 秒的流,将其提供给 StreamMediaFoundationReader
并在需要时写入相同的 MemoryStream
,但是 NAudio 最终播放初始缓冲段并在完成后停止。正确的方法是什么?
如果需要,这是我当前的代码。 (我不知道音频流是如何工作的,所以请放轻松)
bufstr.setReadStream(httpreq.GetResponse().GetResponseStream()); //bufstr is a custom class which creates a memorystream I can write to.
StreamMediaFoundationReader streamread = new StreamMediaFoundationReader(bufstr.getStream());
bufstr.readToStream(); //get the initial 30~ seconds of content
waveOut.Init(streamread);
waveOut.Play();
int seconds = 0;
while(waveOut.PlaybackState == PlaybackState.Playing)
Thread.Sleep(1000);
seconds++;
if (secs % 30 > 15) bufstr.readToStream();
bufstr 的 readToStream 方法
public void readToStream()
int prevbufcount = totalbuffered; //I keep track of how many bytes I fetched from remote url.
while (stream.CanRead && prevbufcount + (30 * (this.bitrate / 8)) > totalbuffered && totalbuffered != contentlength) //read around 30 seconds of content;
Console.Write($"Caching prevbufcount + (30 * (this.bitrate / 8))/totalbuffered\r");
byte[] buf = new byte[1024];
bufferedcount = stream.Read(buf, 0, 1024);
totalbuffered += bufferedcount;
memorystream.Write(buf, 0, bufferedcount);
【问题讨论】:
看看here. 我最初是根据我从服务器得到的内容长度响应来设置 MemoryStream 的容量,但是没有设置 memorystream 的长度不起作用。 【参考方案1】:在调试时我发现我从服务器获取的内容长度与流的实际大小不匹配,因此我最终通过从服务器获取的其他详细信息来计算内容长度。 这个问题也可能是一个竞争条件,因为它在我手动跟踪我在内存流上写入的位置后停止了
【讨论】:
以上是关于使用 NAudio 读取包含作品音频的 MemoryStream的主要内容,如果未能解决你的问题,请参考以下文章