记录HTTP音频流文件
在C#我想记录的音频流记录HTTP音频流文件
我做线沿线的东西:
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或任何其他程序。
这不是我的确切代码,我做了很多错误检查等,但是这给出了一般的想法。
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;
而且是否播放文件(即使是一旦修复文件编写代码,就不会再损坏)取决于您下载的格式 - 它是什么编解码器/文件类型?
所以,如果我添加一个文件类型头到前面该文件然后我应该很好?让它成为一个通用的wav文件,我该如何为它添加标题? – bep 2011-05-06 17:47:33
@bep:将未压缩的音频流保存到WAV文件是一项非常简单的任务,但没有人会这么做,因为没有人传输未压缩的音频。 – MusiGenesis 2011-05-06 17:57:44
问题是流传输位没有上下文。当您流式传输到某个应用程序时,您将遇到一个默认协议,您正在处理文件类型X,然后流式传输程序会尝试播放这些位。
当你流到一个文件时,你必须添加上下文。其中最重要的一点是识别文件类型和其他信息的标题。
如果您可以添加标题,则可以从文件系统播放该文件。标题不会成为流的一部分,因为服务器和客户端已经同意它已经是什么类型的fo文件。
如果您创建了流媒体播放器,则可以在协商类型时播放保存的位。 BUt让它自动从文件中工作,你必须添加标题。
因此,如果我添加一个文件类型头文件的前面,那么我应该是好?让它成为一个通用的wav文件,我将如何添加头文件 – bep 2011-05-06 17:47:57
如果没有详细了解流格式和MP3文件格式,试图将流式MP3音频保存到磁盘基本上是不可能的。从流中获得的是一系列“窗口化”的音频块,转换为频域;接收到数据流的播放器会将数据块立即转换回时域音频并逐一播放。
要使一个MP3文件,你就必须先写出包含格式信息和然后写的每个数据块的头部。但是,将这些块存储在一个文件中的格式很可能与将它们压缩到一个流中的方式不同。
对不起,但我会认真地建议你放弃这一点。音乐服务流而不是提供文件下载的一个主要原因是因为将MP3类型的流保存到磁盘非常困难(将未压缩的音频流保存为WAV文件是一件小事)。
您应该删除最后一段。这没有帮助。我可以考虑少数应用程序,可以节省MPEG流量。 – Brad 2011-05-07 13:54:24
我的整个评论是没有帮助的,除非我觉得这对于不知道MP3如何在引擎盖下工作的人来说太难了(实质上是不可能的)任务,并且我试图挽救这个人免于浪费他们的时间。 “少数应用程序能够节省MPEG流量”这一事实并不意味着这项任务很简单。 – MusiGenesis 2011-05-09 15:16:22
我发现这个网址在谷歌作为一个例子或流类型我想抓住http://zlz-stream10.streaming.init7.net/1/rsj/mp3_128 – bep 2011-05-06 17:38:59