首页 > 解决方案 > 使用 NAudio 读取包含作品音频的 MemoryStream

问题描述

我正在尝试播放来自网络的作品音频文件,我尝试使用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);
            }
        }

标签: c#naudio

解决方案


在调试时,我发现从服务器获取的内容长度与流的实际大小不匹配,因此我最终通过从服务器获取的其他详细信息来计算内容长度。这个问题也可能是一个竞争条件,因为它在我手动跟踪我在内存流上写入的位置后停止了


推荐阅读