2015-06-16 66 views
8

我創建了HTML5的流分段的MP4,使用下面的命令零碎的MP4創作:沖洗和延遲問題與FFMPEG

-i rtsp://172.20.28.52:554/h264 -vcodec copy -an -f mp4 -reset_timestamps 1 -movflags empty_moov+default_base_moof+frag_keyframe -loglevel quiet - 
  1. 「-i RTSP://172.20.28.52:554/h264「,因爲來自IP攝像頭的rtp數據包流中的源是h264。 爲了測試起見,相機的GOP設置爲1(即所有的幀都是關鍵幀)
  2. 「-vcodec copy」,因爲我不需要轉碼,只能重新轉換成mp4。
  3. 「-movflags empty_moov + default_base_moof + frag_keyframe」根據媒體源擴展規範創建分段mp4。
  4. 「 - 」在最後爲了輸出mp4到標準輸出。我抓取輸出並通過網絡套接字發送給Web客戶端。

一切工作正常,期待着我試圖解決的延遲問題。 如果我記錄一個數據是從標準輸出進來,與到來的時間戳每一次,我得到這樣的輸出:

16/06/2015 15:40:45.239獲得數據的大小= 24

16/06/2015 15:40:45.240得到數據的大小= 7197

16/06/2015 15:40:45.241得到的數據大小= 32768

16/06/2015 15:40:45.241得到的數據大小= 4941

16/06/2015 15 :40:45.241得到的數據大小= 12606

16/06/2015 15:40:45.241得到數據的大小= 6345

16/06/2015 15:40:45.241得到數據的大小= 6339

16/06/2015 15:40:45.242得到數據的大小= 6336

16/06/2015 15:40:45.242得到數據的大小= 6361

16/06/2015 15:40:45.242得到數據大小= 6337

16/06/2015 15:40:45.242得到數據的大小= 6331

16/06/2015 15:40:45.242得到數據的大小= 6359

16/06/2015 15:40:45.243得到數據的大小= 6346

16/06/2015 15:40:45.243得到數據的大小= 6336

16/06/2015 15:40:45.243得到數據的大小= 6338

16/06/2015 15:40:45.243得到的數據大小= 6357

16/06/20 15 15:40:45.243得到數據的大小= 6357

16/06/2015 15:40:45.243得到數據的大小= 6322

16/06/2015十五點40分45秒。243得到數據的大小= 6359

16/06/2015 15:40:45.244得到數據的大小= 6349

16/06/2015 15:40:45.244得到數據的大小= 6353

16/06/2015 15:40:45.244得到數據的大小= 6382

16/06/2015 15:40:45.244得到數據的大小= 6403

16/06/2015 15:40:45.304得到數據的尺寸= 6393

16/06/2015 15:40:4 5.371了數據的尺寸= 6372

16/06/2015 15:40:45.437得到數據的大小= 6345

16/06/2015 15:40:45.504得到數據的大小= 6352

16/06/2015 15:40:45.571得到數據的大小= 6340

16/06/2015 15:40:45.637得到數據的大小= 6331

16/06/2015 15:40:45.704得到數據的尺寸= 6326

16/06/2015 15:40 :45.771得到數據的大小= 6360

16/06/2015 15:40:45.838得到數據的大小= 6294

16/06/2015 15:40:45.904得到數據的大小= 6328

16/06/2015 15:40:45.971得到數據的大小= 6326

16/06/2015 15:40:46.0​​38得到數據的大小= 6326

16/06/2015 15:40:46.105得到的數據大小= 6340

16/06/2015 15: 40:46.171得到數據的大小= 6341

16/06/2015 15:40:46.238得到數據的大小= 6332

正如你可以看到,第一線23(其包含約1.5秒的數據的視頻)幾乎立即到達,然後每2個連續行之間的延遲爲〜70ms,這是合理的,因爲視頻是每秒15幀。 此行爲引入大約1.5秒的延遲。

它看起來像一個潮紅的問題,因爲我沒有看到任何理由爲什麼ffmpeg需要保存內存中的前23幀,特別是因爲每個幀都是它自己在mp4內部的一個片段。 但是,我無法找到任何會導致ffmpeg更快地刷新此數據的方法。

有沒有人有建議?

我想指出,這是一個後續的問題這一個: Live streaming dash content using mp4box

+0

我想到,你可以控制用於緩衝輸出的'blocksize'。檢查http://www.ffmpeg.org/ffmpeg-all.html#toc-pipe,看看是否調整該值可以幫助你。 –

+0

@PabloMontilla我試圖玩一些塊大小不同的值,雖然它以某種方式影響輸出,但它並沒有解決初始延遲問題。 – galbarm

+0

Hello @galbarm!我無法使用你的'ffmpeg'參數在頁面上運行視頻,總是得到'跳過無法識別的頂層框:ftyp'。 (h264 ip cam)。我還嘗試將'-vcodec'更改爲'libx264',這種情況下,我得到了'跳過無法識別的頂級盒子:mdat'。你能否更詳細地描述你的代碼或者將它放在什麼地方?最有趣的部分是'.addSourceBuffer'參數,即編解碼器字符串。提前致謝! – zarkone

回答

4

去除延遲的關鍵是使用-probesize論點:

probesize整數(輸入)以字節爲單位

集探測尺寸,即 的數據的大小,以分析以獲取流信息。較高的值將使 在分散到 流的情況下啓用檢測更多信息,但會增加延遲。必須是不小於 的整數32.默認情況下它是5000000。

默認值爲5,000,000字節,相當於約1.5秒的視頻。 我幾乎可以通過將值減少到200,000來完全消除延遲。

0

我使用-g選項設置組中的幀數解決延遲問題。在我的情況下,我使用-g 2。我懷疑如果你沒有明確說明,片段要麼等待源提供關鍵幀,要麼使用非常大的默認值來生成關鍵幀,然後關閉片段並將其轉儲到標準輸出。

+0

我想你正在轉碼視頻,所以你可以控制輸出GOP的大小。我在「vcodec copy」模式下使用ffmpeg,因此只能將其重新分割爲分段的mp4。我試圖設置我的視頻(網絡攝像機)的來源只提供關鍵幀,但它沒有幫助初始延遲。 – galbarm

0

通常,在控制檯輸出的情況下,stdout的緩衝被禁用。如果從代碼運行ffmpeg,則啓用緩衝,所以只有在緩衝區已滿或命令結束時纔會獲取數據。

你必須消除os的stdout緩衝。在Windows上它不可能的IMO,但在Ubuntu的前。有http://manpages.ubuntu.com/manpages/maverick/man1/stdbuf.1.html