c# - 使用 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);
}
}
解决方案
在调试时,我发现从服务器获取的内容长度与流的实际大小不匹配,因此我最终通过从服务器获取的其他详细信息来计算内容长度。这个问题也可能是一个竞争条件,因为它在我手动跟踪我在内存流上写入的位置后停止了
推荐阅读
- java - 如何用包含所有.java文件的目录替换tomcat lib目录中的jar?
- python - 如何将 getattr() 与动态对象一起使用?
- azure - 在 azure blobs 中保存 spark ML 模型
- ios - 以编程方式禁用 ios 11+ 应用程序卸载?
- java - 我正在使用光标浏览我的内部文件夹,但文件夹是空的?
- c# - Sql 异常没有显示在消息框中
- python - 提取具有可选结束模式的字符串
- maven - 如何仅计算多模块 maven 项目的 Jacoco 代码覆盖率?
- mysql - MySQL和PHP:搜索可能有前导零的字符串
- excel - Excel vba复制粘贴到下一个空列