将HTTP音频流录制到文件

时间:2011-05-06 17:38:19

标签: c# io streaming shoutcast

在C#中我想录制音频流

我正在做的事情是:

HttpWebRequest req;
req = (HttpWebRequest)WebRequest.Create("http://url.com/stream");

Webresponse resp = req.GetResponse();
Stream s = resp.GetResponseStream();

fs = File.Exists(fileName)
    ? new FileStream(fileName, FileMode.Append)
    : new FileStream(fileName, FileMode.Create);

byte[] buffer = new byte[4096];

while (s.CanRead)
{
    Array.Clear(buffer, 0, buffer.Length);
    total += s.Read(buffer, 0, buffer.Length);
    fs.Write(buffer, 0, buffer.Length);
}

并且文件大小增加但无法通过VLC或任何其他程序播放。

这不是我的确切代码我做了很多错误检查等,但这给出了一般的想法。

3 个答案:

答案 0 :(得分:2)

    Array.Clear(buffer, 0, buffer.Length);
    total += s.Read(buffer, 0, buffer.Length);
    fs.Write(buffer, 0, buffer.Length);

在阅读之前,您不必清除整个阵列 - 这样做没有意义。但是你必须检查实际读取的字节数,并不能保证每次都填满整个数组(而且可能不会):

    int bytesRead = s.Read(buffer, 0, buffer.Length);
    fs.Write(buffer, 0, bytesRead);
    total+=bytesRead;

此外,文件是否播放(即使在您修复文件编写代码后不再损坏)也取决于您正在下载的格式 - 它是什么编解码器/文件类型?

答案 1 :(得分:2)

问题是流比特没有上下文。当您流式传输到应用程序时,默认情况下您正在处理文件类型X,然后流式程序尝试播放这些位。

当您流式传输到文件时,您必须添加上下文。其中一个最重要的部分是标识文件类型和其他信息的标题。

如果您可以添加标题,则可以从文件系统播放该文件。标题不会成为流的一部分,因为服务器和客户端已经就它已经存在的文件类型达成一致。

如果您创建了一个流式播放器,则可以在协商类型时回放您保存的位。为了让它自动从文件中工作,你必须添加标题。

答案 2 :(得分:0)

如果不详细了解MP3的流格式和文件格式,尝试将流式MP3音频保存到磁盘基本上是不可能的。你从流中得到的是一系列转换到频域的“窗口”音频块;接收流的播放器会在运行时将块转换回时域音频,然后逐个播放。

要制作MP3 文件,您必须首先写出包含格式信息的标头,然后然后写入每个数据块。但很可能将这些块存储在文件中的格式与它们压缩成流的方式不同。

抱歉,但我会认真地建议你放弃。音乐服务流而不是提供文件下载的一个主要原因是因为将MP3类型的流保存到磁盘非常困难(将未压缩的音频流保存到WAV文件将是一件小事)。