2012-03-23 63 views
1

從尋找位置傳輸mp4視頻時,我面臨問題。它從頭開始正確流式傳輸。在ASP.NET中尋求位置的流MP4視頻

第一個問題是,雖然mp4視頻是通過jw播放器流媒體播放器。當時間條用戶點擊開始流從視頻中的任何其他部分MP4視頻,JW播放器會發出啓動PARAM隨着時間信息e.g

http://[url]/stream/mp4.ashx?file=Madagascar3-trailer-48861c.mp4&start=53.71 

所以jwplayer發送時間間隔,以尋求從MP4流。

我正在使用以下代碼將大約時間間隔轉換爲字節,因爲seek將通過字節開始。

double total_duration = Convert.ToDouble(context.Request.Params["d"]); 
double startduration = Convert.ToDouble(context.Request.Params["start"]); 
double length_sec = (double)size/total_duration; // total length per second 
start = (long)(length_sec * startduration); 

下面是完整的示例代碼,我使用,開始從尋求位置e.g 53.71

private void ChunkDownload(string fullpath, HttpContext context) 
{ 
    long size, start, end, length, fp = 0; 
    using (StreamReader reader = new StreamReader(fullpath)) 
    { 
     size = reader.BaseStream.Length; 
     start = 0; 
     end = size - 1; 
     length = size; 

     double total_duration = Convert.ToDouble(context.Request.Params["d"]); 
     double startduration = Convert.ToDouble(context.Request.Params["start"]); 
     double length_sec = (double)size/total_duration; // total length per second 
     start = (long)(length_sec * startduration); 

     context.Response.AddHeader("Accept-Ranges", "0-" + size); 
     long anotherStart = start; 
     long anotherEnd = end; 

     // End bytes can not be larger than $end. 
     anotherEnd = (anotherEnd > end) ? end : anotherEnd; 
     // Validate the requested range and return an error if it's not correct. 
     if (anotherStart > anotherEnd || anotherStart > size - 1 || anotherEnd >= size) 
     { 

      context.Response.AddHeader("Content-Range", "bytes " + start + "-" + end + "/" + size); 
      throw new HttpException(416, "Requested Range Not Satisfiable"); 
     } 
     start = anotherStart; 
     end = anotherEnd; 

     length = end - start + 1; // Calculate new content length 
     fp = reader.BaseStream.Seek(start, SeekOrigin.Begin); 
     context.Response.StatusCode = 206; 

    } 
    // Notify the client the byte range we'll be outputting 
    context.Response.AddHeader("Content-Range", "bytes " + start + "-" + end + "/" + size); 
    context.Response.AddHeader("Content-Length", length.ToString()); 

    context.Response.WriteFile(fullpath, fp, length); 
    context.Response.End(); 

} 

流,但它未能無論是球員或直接檢查直播網址識別爲有效的MP4流。

任何人都可以幫助我解決這個問題。

+0

我認爲你必須重新發送文件頭,然後請求的位置。無論如何,解碼器無法識別壓縮設置並且將無法處理流。只是我的觀點。 – ppumkin 2012-09-14 12:07:33

回答

1

沒有有效的內容類型定義。嘗試將ContentType設置爲video/mp4。

UPDATE

雖然內容類型定義,並根據您的代碼HTTP狀態代碼是206,我建議你檢查這頁:206 Partial Content

+0

在調用函數ChunkDownload之前已經添加了它。 – irfanmcsd 2012-04-17 07:37:28

+0

視頻流通常在Flash播放器,html5和iphone上播放,但在尋找位置的情況下,僅在Flash播放器或html5的情況下才能識別視頻。 – irfanmcsd 2012-04-17 07:38:33

0

穆罕默德,

我注意到你正在做的很多計算和處理內容頭文件。也許當你對所有這些數學進行數學計算時,它會產生一個無效的標題,因爲額外的小數位(使其無效)或其他一些問題。

含義,我建議你做到以下幾點:

  1. 運行與使用相同的播放器一個網站流的一個視頻等,然後使用工具,而它的工作順利,查看標題。只需要有一組基準標題和有效值格式進行比較即可。

  2. 運行應用程序並跟蹤頭文件中已經設置之後他們,也許像這樣:how to dump response headers in ASP.Net 更妙的是,安裝「活HTTP標頭的Firefox插件或類似的規定。

將標題的工作集與您的比較。你在設置的值中看到奇怪的東西嗎?內容範圍/長度等是否可能?是不知何故抵消或無效?只要尋求一致性,一個小錯誤就可能輕易地破壞整個請求。

也許我在這裏錯過了一些東西,但我希望能引發一些想法。

0

我不認爲你可以尋找一個像這樣的MP4文件。 即使您有頭文件,您仍需要尋找I幀才能播放視頻。你很可能使用錯誤的API來做到這一點。

+0

我嘗試了所有可能的方式,沒有頭以上例和直接的方式瞄準ios(ipad,iphone)。 MP4視頻流,但當你點擊JW播放器或其他Flash播放器,視頻EIGHER從開始位置尋找,或者如果我強制它,它會失敗。只是爲了信息,我得到了適當的尋求,如果我使用Flash FLV格式,而不是MP4格式。只是我需要一些已經工作的人的幫助,面臨同樣的問題,並幫助我在這裏。它可以解決,如果我使用這個組件http://h264.code-shop.com/trac/wiki/Mod-H264-Streaming-Internet-Information-Services-IIS7-Version2 – irfanmcsd 2012-04-24 19:50:17

+0

但我想用我自己的流處理程序而不是任何第三方組件。 – irfanmcsd 2012-04-24 19:50:42

2

同意,你不能只是尋找一個像這樣的mp4/m3u8文件。

但我認爲你找不到解決方案或解決方法,我們有iPhone開發團隊的高級iPhone開發人員和外部顧問進行反覆試驗,我們花費了如此多的資源,但問題仍然無法解決。

2

谷歌搜索後,沒有找到相關的API。

如果問題無法解決,您可以檢查解決方法。

如果可能,請提供更多信息供進一步研究。

0

我不會評論這篇文章中的回覆內容,但你肯定有一個問題是MP4解析。與MP3不同,您不能輕易將時間偏移量轉換爲像這樣的字節範圍。您需要解析mp4 moov元素,並根據您感興趣的時間偏移量在相關軌道中查找正確的塊。它是這樣的:moov-> trak-> mdia-> minf-> stbl-> stts stts框會爲您提供您需要的示例到時間映射。