使用 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的主要内容,如果未能解决你的问题,请参考以下文章

使用 NAudio 将 g722 音频转换为 WAV

带有 NAudio 的音频中继器

在 WPF C# 中使用 NAudio 录制音频

在 NAudio 中添加 WAV 标头

c# Naudio 音频电平捕获和显示,仅在打开录音属性时有效

是否可以设置 NAudio 读取请求的样本数?