从文件中将音频写入内存流

时间:2013-04-26 19:16:34

标签: c# memorystream

我正在尝试将此文件发送到输出流,但无法弄清楚它为什么吐出基本上是空的mp3文件。正如你所看到的那样,我会过早地关闭流,所以我现在已经注释掉了。任何指针都赞赏。

using (FileStream mp3file = File.OpenRead(newFile))
                {
                    context.Response.AddHeader("content-transfer-encoding", "binary");
                    context.Response.ContentType = "audio/mpeg";
                    MemoryStream memStream = new MemoryStream();
                    byte[] bytes = new byte[mp3file.Length];
                    memStream.SetLength(mp3file.Length);
                    mp3file.Read(memStream.GetBuffer(), 0, (int)mp3file.Length);
                    memStream.Write(bytes, 0, (int)mp3file.Length);
                    //mp3file.Close();
                    memStream.WriteTo(context.Response.OutputStream);
                    //memStream.Close();

                }

1 个答案:

答案 0 :(得分:5)

这部分是问题所在:

 byte[] bytes = new byte[mp3file.Length];
 ...
 // Here you're reading into the memory stream buffer...
 mp3file.Read(memStream.GetBuffer(), 0, (int)mp3file.Length);
 // And here you're overwriting it with the byte array full of zeroes!
 memStream.Write(bytes, 0, (int)mp3file.Length);

你不应该假设Read的单个调用实际上会读取所有内容。目前尚不清楚您正在使用哪个版本的.NET,但如果您使用的是.NET 4或更高版本,则可以使用Stream.CopyTo使其更简单。

还不清楚你为什么要使用MemoryStream。你为什么不直接复制到输出流?

mp3File.CopyTo(context.Response.OutputStream);

或者,如果您使用的是旧版本的.NET:

byte[] buffer = new byte[16 * 1024]; // For exmaple...
int bytesRead;
while ((bytesRead = mp3File.Read(buffer, 0, buffer.Length)) > 0)
{
    context.Response.OutputStream.Write(buffer, 0, bytesRead);
}

(这几乎相当于CopyTo。)