2010-01-20 16 views
1

test1.mp3和test2.mp3具有相同的比特率和采样率,我试图在HTTP响应中合并它们。生成的文件是test.mp3。从另外两个人创建的MP3不会在WMP11中播放?

test.mp3在WMP12和VLC中可以正常播放。在WMP11中,我只听到来自test1.mp3的音频。在您期望听到test2.mp3音频开始的那一刻,播放器停止播放。 WMP11报告没有错误...它只是停止播放。

什么需要改变,这样test.mp3将在WMP11中正确播放?

protected void Page_Load(object sender, EventArgs e) { 
    Response.Clear(); 
    Response.ContentType = "audio/mpeg"; 
    Response.AddHeader("Content-Disposition", "attachment; filename=test.mp3"); 
    var bytes1 = System.IO.File.ReadAllBytes(@"C:\test1.mp3"); 
    WriteBytesToResponse(bytes1); 
    var bytes2 = System.IO.File.ReadAllBytes(@"C:\test2.mp3"); 
    WriteBytesToResponse(bytes2); 
    Response.End(); 
} 

private void WriteBytesToResponse(byte[] sourceBytes) { 
    using (var sourceStream = new MemoryStream(sourceBytes, false)) { 
     sourceStream.WriteTo(Response.OutputStream); 
    } 
} 

回答

0

MP3文件包含完整的MPEG1标题以及其他信息,例如流的长度。你根本无法连接它们。 WMP读取标题,确定播放长度,并在第一个文件完成时停止播放。其余数据被忽略,因为它不应该在那里。

您将需要使用某些理解MPEG1或MP3文件进行串联的库或实用程序。

+0

我需要通过HTTP响应发送第一个文件的音频,然后才创建第二个文件的音频(它是在响应期间动态创建的)。我无法控制客户端(多个podcatcher中的任何一个)的超时容限,并且立即发送第一个音频文件,以防止如果直到第二个音频为止才发送单个字节,将会发生_will_超时动态创建(这需要几分钟)。听起来像我在一块石头和一个艰难的地方之间? – lance 2010-01-20 06:12:29

+0

@lance:如果你无法开始通过HTTP套接字相对快速的交付,你应该重新考虑你的文件生成策略请求 - 它也要求一系列其他问题(DoS,et) – 2010-01-20 07:36:27

+0

最后,我同意,真的。最近几天也暴露了项目设计中的其他缺陷。这绝不是对群众来说的,我从中学到了很多编写现在“无用”的代码。我很可能很快将您的答复标记为答案。你非常有帮助。谢谢。 – lance 2010-01-20 15:49:02