如何正确提供的数据?
我正在为HTML5音频彻底的.aspx页面提供二进制数据。 该文件可以播放,但SeekBar存在问题,并在Safari(iPad),Chrome和Firefox中重放。
编辑我简化了(希望不是太多)代码和完整列表(页面文件名显然是play.aspx)。
protected void Page_Load(object sender, EventArgs e) { if ( Request["filename"] != null) { string FilePath = MapPath(Request["filename"]); long fSize = (new System.IO.FileInfo(FilePath)).Length; //Headers Response.AddHeader("Content-Length",fSize.ToString()); Response.ContentType = "audio/mp3"; //Data Response.WriteFile(FilePath); Response.End(); }; } Direct
Provided
因此提供了Content-Length
和Content-Type
标头。 当直接访问文件或通过.aspx页面访问文件时,两个标签启用比较行为。
问题是如何在所有必需的浏览器(ff,safari,chrome,IE9 +)上正确地为标签提供数据。
问题
Safari(iPad):当按下播放按钮时,会播放声音,但有“Streaming …”而不是Seek Bar,播放似乎永远持续,声音无法播放。
Firefox(窗口):显示搜索栏但显示增加的时间直到结束并在重放时表现正常。
Chrome(Windows):正确搜索栏但无法重播。
IE10:好的
我找到了类似的问题,但没有答案。 从fiddler观察另一个页面看来,标题Accept-Ranges: bytes
和Content-Range: bytes 0-8100780/8100781
可以提供帮助。 但是提供必要的function似乎太难了,因为只是一次尝试,所以我没有尝试。
注意我正在寻找解决其他连接问题的解决方案如何在IE(9+)和Safari(Pad)中使用HTML5音频播放.m4a?
简单回答:有必要处理浏览器range request
。
完整的故事
当比较Fiddler在Firefox和IIS之间捕获的通信时,我注意到直接链接的响应状态是206 Partial Content
而间接链接200 OK
。
更仔细地分析请求显示Firefox请求Range: bytes=0-
和iPad Range: bytes=0-1
和更高版本Range: bytes=0-fullsize
( 从iOS设备捕获流量 )。
设置Response.StatusCode = 206
足以欺骗Firefox而不是Safari。 但我知道关键信息和rest很简单。 有必要遵守range
请求,请参阅:SO: HTML5video不会循环播放 。 我在阿哈找到了怎么做的解释! #1 – 用于HTML5video的ASP.NET ASHXvideo流 。 所以新代码是(只有活动部分呈现rest与答案中相同):
protected void Page_Load(object sender, EventArgs e) { if ( Request["filename"] != null) { string FilePath = MapPath(Request["filename"]); long fSize = (new System.IO.FileInfo(FilePath)).Length; long startbyte = 0; long endbyte=fSize-1; int statusCode =200; if ((Request.Headers["Range"] != null)) { //Get the actual byte range from the range header string, and set the starting byte. string[] range = Request.Headers["Range"].Split(new char[] { '=','-'}); startbyte = Convert.ToInt64(range[1]); if (range.Length >2 && range[2]!="") endbyte = Convert.ToInt64(range[2]); //If the start byte is not equal to zero, that means the user is requesting partial content. if (startbyte != 0 || endbyte != fSize - 1 || range.Length > 2 && range[2] == "") {statusCode = 206;}//Set the status code of the response to 206 (Partial Content) and add a content range header. } long desSize = endbyte - startbyte + 1; //Headers Response.StatusCode = statusCode; Response.ContentType = "audio/mp3"; Response.AddHeader("Content-Length",desSize.ToString()); Response.AddHeader("Content-Range", string.Format("bytes {0}-{1}/{2}", startbyte, endbyte , fSize)); //Data Response.WriteFile(FilePath,startbyte,desSize); Response.End(); }; }
添加其他标题( Content-Disposition
, Accept-Ranges
, Access-Control-Allow-Origin
)可能很方便,但目的是提供尽可能简单的解决方案。
课程 :如果我没有修复并且也查找
,我会更快地找到解决方案。