2013-01-15 19 views
1

使用MVC3和的Flowplayer,我有一個設置爲獲得與下面的標記視頻文件的視頻播放器:錯誤與Chrome的HTML5視頻,採用RangeFilePathResult

<div id="video"> 
    <div id="video-viewport"> 
     <!-- The data-ratio is a decimal number represeting the height of the video in proportion to the width --> 
     <div class="flowplayer" data-swf="http://releases.flowplayer.org/5.1.1/flowplayer.swf" 
     data-ratio="0.417" data-engine="html5" data-keyboard="true" data-native_ipad_fullscreen="true" 
     data-volume="0.6"> 
     <video> 
     <!-- By default Flowplayer attempts to use HTML5 video and if it's not 
     supported then Flash (9.0+) and MP4 is used. MP4 is enough for 
     complete browser support but providing WebM and/or OGG gives you 
     broader support for HTML5 video which is the preferred technology. --> 
    <!-- MP4 gives a complete cross browser support with the aid of Flash --> 
    <source type="video/mp4" src="@Url.Action("GetVideo", "Video", new { id = Model.WebMp4Video.Id })"/> 
    <!-- WEBM gives HTML5 video support for the latest Firefox, Chrome and Opera browser --> 
     <source type="video/webm" src="@Url.Action("GetVideo", "Video", new { id = Model.WebMVideo.Id })"/> 
    <!-- OGG gives HTML5 support for older versions of Firefox and Opera --> 
     <source type="video/ogv" src="@Url.Action("GetVideo", "Video", new { id = Model.OgvVideo.Id })"/> 
     </video> 
     </div> 
    </div> 
    </div> <!--/video--> 

在控制器我有這個方法返回視頻:

public ActionResult GetVideo(string id) { 
       ... 
     var cd = new System.Net.Mime.ContentDisposition { 
     Inline = false 
    }; 
    FileInfo info = new FileInfo(path); 
    Response.AppendHeader("Content-Disposition", cd.ToString()); 
    return new RangeFilePathResult(MimeType, info.FullName, info.LastWriteTimeUtc, info.Length); 
} 

​​已經在返回部分緩解生命的救星,這一切工作正常在Firefox和IE,但在Chrome中我得到一個錯誤頻繁:

"server cannot set status after http headers have been sent".

和玩家本身崩潰,揭示了頁面上出現以下錯誤:

html5: Video not properly encoded

我仍然在試圖讓我的周圍部分反應的頭,但可能這是因爲RangeFileResult設置一個狀態碼206每個部分響應?還是還有什麼我在這裏失蹤?

編輯:如果我調試通過RangeFileResult代碼,並且還檢查在Chrome網絡選項卡,我注意到該請求到控制器方法返回部分響應,帶有狀態之前,只要代碼點擊這一行:

context.HttpContext.Response.Flush();

這似乎有一個延遲,有時超過10秒,但是當這個完成後,repsonse的狀態變爲206.通常在視頻播放時,狀態再次變爲取消這是

html5: Video not properly encoded

消息出現在視頻播放器上。

EDIT2:是我得到的repsonses如下(3個迴應,第一個和第三個被取消,第二個有206種狀態:

請求

URL: http://localhost:64729/Video/GetVideo/24 
Method: GET 
Status Code: 206 Partial Content 

請求頭

Accept:*/* 
Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3 
Accept-Encoding:identity;q=1, *;q=0 
Accept-Language:en-US,en;q=0.8 
Cache-Control:max-age=0 
Connection:keep-alive 
Cookie:.ASPXAUTH=BD5B9748E6985F5659B56289A5543C11CACBF1602AFFD5D4335453560988B870F2543269809401D13EE9F12EFBAC2D4CE0322B5F826871B9968B3D2986C01E35C536B28B5EC24E8E4F631D094B0DBEFF76DA84DA7CCC753E06C38C0FA36A858AC87548099BD23D4BE9B80434970A542489EC5E5F4543A9C98CA573F196DCBFE1B8CC18C10AE1AFEB0E4E899C6CA4DEFC59138E170954016DCB9C007FDC7C2B2950436E24AA5FF9C0888822626C9AE01C07A98F317A9499F0E9D5E61434F959E9;ASP.NET_SessionId=o112vzki5owvbptr4kudbdax 
Host:localhost:64729 
Range:bytes=0- 
Referer:http://localhost:64729/Video/Index/3 
User-Agent:Mozilla/5.0 (Windows NT 6.2) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.52 Safari/537.17 

響應標頭

Cache-Control:private, s-maxage=0 
Connection:Close 
Content-Length:7362920 
Content-Range:bytes 0-7362919/7362920 
Content-Type:video/mp4 
Date:Tue, 15 Jan 2013 12:55:24 GMT 
Server:ASP.NET Development Server/10.0.0.0 
X-AspNet-Version:4.0.30319 
X-AspNetMvc-Version:3.0 

請求

URL: http://localhost:64729/Video/GetVideo/24 
Method: GET 
Status Code: 206 Partial Content 

請求頭

Accept:*/* 
Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3 
Accept-Encoding:identity;q=1, *;q=0 
Accept-Language:en-US,en;q=0.8 
Connection:keep-alive 
Cookie:.ASPXAUTH=BD5B9748E6985F5659B56289A5543C11CACBF1602AFFD5D4335453560988B870F2543269809401D13EE9F12EFBAC2D4CE0322B5F826871B9968B3D2986C01E35C536B28B5EC24E8E4F631D094B0DBEFF76DA84DA7CCC753E06C38C0FA36A858AC87548099BD23D4BE9B80434970A542489EC5E5F4543A9C98CA573F196DCBFE1B8CC18C10AE1AFEB0E4E899C6CA4DEFC59138E170954016DCB9C007FDC7C2B2950436E24AA5FF9C0888822626C9AE01C07A98F317A9499F0E9D5E61434F959E9;ASP.NET_SessionId=o112vzki5owvbptr4kudbdax 
Host:localhost:64729 
Range:bytes=7339303- 
Referer:http://localhost:64729/Video/Index/3 
User-Agent:Mozilla/5.0 (Windows NT 6.2) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.52 Safari/537.17 

響應頭

Cache-Control:private, s-maxage=0 
Connection:Close 
Content-Length:23617 
Content-Range:bytes 7339303-7362919/7362920 
Content-Type:video/mp4 
Date:Tue, 15 Jan 2013 12:55:24 GMT 
Server:ASP.NET Development Server/10.0.0.0 
X-AspNet-Version:4.0.30319 
X-AspNetMvc-Version:3.0 

請求

URL: http://localhost:64729/Video/GetVideo/24 
Method: GET 
Status Code: 206 Partial Content 

請求頭

Accept:*/* 
Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3 
Accept-Encoding:identity;q=1, *;q=0 
Accept-Language:en-US,en;q=0.8 
Connection:keep-alive 
Cookie:.ASPXAUTH=BD5B9748E6985F5659B56289A5543C11CACBF1602AFFD5D4335453560988B870F2543269809401D13EE9F12EFBAC2D4CE0322B5F826871B9968B3D2986C01E35C536B28B5EC24E8E4F631D094B0DBEFF76DA84DA7CCC753E06C38C0FA36A858AC87548099BD23D4BE9B80434970A542489EC5E5F4543A9C98CA573F196DCBFE1B8CC18C10AE1AFEB0E4E899C6CA4DEFC59138E170954016DCB9C007FDC7C2B2950436E24AA5FF9C0888822626C9AE01C07A98F317A9499F0E9D5E61434F959E9;ASP.NET_SessionId=o112vzki5owvbptr4kudbdax 
Host:localhost:64729 
Range:bytes=48- 
Referer:http://localhost:64729/Video/Index/3 
User-Agent:Mozilla/5.0 (Windows NT 6.2) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.52 Safari/537.17 

響應頭

Cache-Control:private, s-maxage=0 
Connection:Close 
Content-Length:7362872 
Content-Range:bytes 48-7362919/7362920 
Content-Type:video/mp4 
Date:Tue, 15 Jan 2013 12:55:24 GMT 
Server:ASP.NET Development Server/10.0.0.0 
X-AspNet-Version:4.0.30319 
X-AspNetMvc-Version:3.0 
+1

請放下'Response.AppendHeader(「內容處置」,cd.ToString())',然後再試一次(你不應該需要內容處理標頭時,您的視頻流,當然這不能不要用'Inline = false')。除此之外,在這一點上我沒有看到任何問題。讓我們也知道你的視頻文件是如何編碼的(並非所有的瀏覽器都支持所有的編碼)。 – tpeczek

+0

謝謝,我會給這些嘗試 – DevDave

+0

@tpeczek,如果我刪除您提到的代碼,問題仍然是相同的。另外,我沒有使用任何我知道的編碼,默認值是什麼? – DevDave

回答

1

經過一番緊張的測試(謝謝你的示例項目),它看起來像Chrome在與MP4格式的一些問題。

爲了修復這種情況下,它應該是足夠的移動WEBM爲第一格式,因此Chrome將它撿起來代替MP4的(IE會跳到MP4所以它也可以工作):

<div id="video"> 
    <div id="video-viewport"> 
     <div class="flowplayer" data-swf="http://releases.flowplayer.org/5.1.1/flowplayer.swf" data-ratio="0.417" data-engine="html5" data-keyboard="true" data-native_ipad_fullscreen="true" data-volume="0.6"> 
      <video> 
       <source type="video/webm" src="@Url.Action("GetVideo", "Video", new { id = Model.WebMVideo.Id })"/> 
       <source type="video/ogv" src="@Url.Action("GetVideo", "Video", new { id = Model.OgvVideo.Id })"/> 
       <source type="video/mp4" src="@Url.Action("GetVideo", "Video", new { id = Model.WebMp4Video.Id })"/> 
      </video> 
     </div> 
    </div> 
</div> 
+0

我在GetRanges方法的末尾添加了代碼(在else語句中),第一個響應現在變爲狀態200.但問題仍然存在。 – DevDave

+0

此外,Firefox視頻仍在播放,但代碼更改似乎影響了它,因爲您無法在視頻中向前跳過,並且不顯示緩衝欄。 – DevDave

+0

@Tyler我需要一個來自你的repro項目,我從靜態分析中找不到更多東西。你是否檢查過我發給你的文章中的示例文件,以確保它不是編碼問題? – tpeczek

0

你可以試試這個,它解決了我的問題,跟你的問題似乎一樣。

<script> 
    flowplayer.conf={ 
     engine:'flash' 
    }; 
</script> 
+0

謝謝,但我特別想使用Html5引擎 – DevDave