2016-08-24 41 views
0

我正在使用片段化mp4和websockets的組合將實況視頻流傳輸到MSE接管的Web瀏覽器。使用websockets中途訪問實時視頻流

我已經使用ffmpeg成功分段爲適當的fmp4格式並使用mpeg4parser工具檢查了數據。 利用websocket服務器,傳入的數據將廣播到所有通過websocket連接的瀏覽器客戶端。這對於播放和實況流式傳輸都很好(使用rtsp流作爲輸入)。

我遇到的問題出現在客戶端試圖中途訪問流時,即一旦ffmpeg流啓動。我在websocket服務器的隊列緩衝區中保存了初始段(ftyp + moov)元素。該隊列緩衝區將這些數據發送給每個連接的新客戶端。

由於瀏覽器控制檯未拋出'找不到媒體源元素'錯誤,我相信這些數據是正確發送的。然而,當接收到廣播的moof/mdat對時,不會流式傳輸視頻。

所以有幾個問題我想答案是:

1)我有每個MOOF元素都包含一個序列號,在它的mfhd子元素的觀察者。這是否必須始終從1開始,對於中途訪問的視頻流而言自然不會是這種情況?

2)是否可以在瀏覽器client.js中查看數據。目前我所能看到的是,我的mediaBuffer包含了一堆[Object ArrayBuffer]。我可以在這些緩衝區內打印二進制數據嗎?

3)從服務器端看,數據似乎以moof/mdat片段發送,因爲從ffmpeg輸出到達websocket服務器的每個新數據都以moof元素開頭。這是通過在控制檯中打印二進制數據而發現的。有沒有類似的方式在客戶端查看這些數據。

4)有沒有人知道爲什麼會發生這種情況?一些碎片化的mp4或ISO BMFF格式細節我缺少。

如果需要進一步詳細說明澄清請告訴我,我會提供。

回答

0

確保您的片段包含基礎媒體解碼時間。然後將視頻標籤'currentTime'設置爲接收到的第一個片段的時間。

+0

我檢查了我的碎片,我相信它們已經包含了基本的解碼時間。 的MOOF元件裏面,有一個TFDT部,其具有的0,512,1024,3072等值連續片段 有一個在ffmpeg的默認使用的時基: 12800 TBN,25 TBC 我可以看到這個藉助於mpeg解析器工具,我已經理解如何在javascript中設置video.currentTime。我不明白的是,如何在js中訪問此解碼時間值?我在mpegparser工具的幫助下看到了它。此解碼時間是否使用客戶端的特定功能或元素ID進行訪問? – Nishanth

+0

您可以查詢緩衝區域。然後將video.currentTime設置爲第一個區域的開始。所有的API文檔都可以在w3c上找到。 – szatmary

+0

非常感謝szatmary。現在視頻在刷新狀態和新用戶加入時都能正常播放。 解決方案簡述: 在videoElement播放的視頻源緩衝區中存在緩衝數據。 使用返回TimeRange對象的API video.buffered訪問緩衝區。該對象包含幾個參數,包括開始和結束時間。 在他的開始時間之間訪問視頻流的用戶將是一個非零的正值。因此,我們將video.currentTime設置爲正值,指示視頻元素從有效的緩衝區範圍播放。 – Nishanth