2013-05-27 15 views
1

我在C#,在字節數組返回一個MP3文件的HttpHandler,代碼是這樣的:錯誤在時間從HttpHandler的重現MP3文件與鉻

public class BasicHandler : IHttpHandler 
{ 
    public void ProcessRequest(HttpContext httpContext) 
    { 
     string mp3FileName = @"C:\Users\gustavo.torrico\Desktop\WInAir\TestPlayer\Mp3Player\Files\TestFile.mp3"; 
     byte[] bytes = File.ReadAllBytes(mp3FileName); 
     httpContext.Response.ContentType = "audio/mp3"; 
     httpContext.Response.BinaryWrite(bytes); 
    } 

    public bool IsReusable 
    { 
     get 
     { 
      return false; 
     } 
    } 
} 

該文件必須在再現一個HTML5播放器,播放器的代碼如下所示:

<audio controls> 
    <source loop="on" preload="on" src="http://localhost:4677/Services/BasicHandler.ashx" type="audio/mpeg"> 
     Your browser does not support the audio element.</audio> 

播放器,可以完美兼容IE +9和Firefox 21,但與鉻,有一個問題,只是再現文件一次,並沒有更多的。沒有像Silverlight或Flash這樣的插件可以解決這個問題嗎?

例如工程是here

回答

0

研究關於HTML5播放器在不同瀏覽器的行爲,一點點,我發現,谷歌Chrome的每一個音頻播放時間,here a more complete explanation

對於解決問題請求到服務器的資源,是必要的武力緩存的HttpHandler的音頻文件:

public void ProcessRequest(HttpContext httpContext) 
    { 
     string mp3FileName = @"C:\Users\gustavo.torrico\Desktop\WInAir\TestPlayer\Mp3Player\Files\TestFile.mp3"; 

     byte[] bytes = File.ReadAllBytes(mp3FileName); 
     httpContext.Response.ContentType = "audio/mp3"; 
     httpContext.Response.AddHeader("pragma", "Public"); 
     httpContext.Response.Cache.SetCacheability(HttpCacheability.Public); 
     httpContext.Response.Cache.SetLastModified(new DateTime(2000, 01, 01)); 
     httpContext.Response.Cache.SetExpires(new DateTime(2020, 01, 01)); 
     httpContext.Response.BinaryWrite(bytes); 
    } 

經過這樣的修改,Chrome瀏覽器可以保存在緩存中的文件的副本,但也有一個漏洞,因爲該文件仍然無法重現一些時間,除非你刷新與F5的頁面,刷新玩家將工作完美。

一個可能解決有關此問題是包裝在一個div的音頻播放器,然後刷新DIV,這裏簡單摘錄的內容:

管窺球員:

<div id="Player"> 
<audio id="audioPlayer" preload="auto" controls onplay="ReloadPlayer()"> 
    <source src="http://localhost:4677/Services/BasicHandler.ashx" type="audio/mpeg"> 
     Your browser does not support the audio element. 
</audio> 

腳本:

function ReloadPlayer() { 
    $("#Player").load("Home/Player", function() { 
     $('#audioPlayer').removeAttr("onplay"); 
     $('#audioPlayer').prop("autoplay", true); 
     //alert('Load was performed.'); 
    }); 
} 

主視圖:

<div id="Player"> 
    @Html.Partial("Player") 
</div> 
0

你嘗試通過JavaScript,而不是硬編碼到HTML設置src屬性?我使用Chrome瀏覽器時遇到了一些不好的體驗,當我編碼src,並不得不求助於通過javascript進行設置。不知道它如何與你的項目一起工作,但它可能值得一試。