【发布时间】: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 的长度不起作用。