修復即時串流媒體的視訊容器關鍵幀

修復即時串流媒體的視訊容器關鍵幀

我有一個採集卡由處理一個程式我打算在 Raspberry Pi 3(我為其編譯)中運行,以將視訊本地串流傳輸到 Chromecast。該程式運行後將視訊資料輸出到具有 H.264 和 AAC 編解碼器的 MPEG-TS 容器中的標準輸出。

我編寫了一個腳本,該腳本基本上將其分段以服務 HLS/m3u8 流:

./HDPVR2-testApp | ffmpeg -i - -c copy -f hls -hls_time 2 -hls_flags +delete_segments -hls_list_size 3 -hls_segment_filename /tmp/stream/file_%v_%03d.ts /tmp/stream/out.m3u8

除了 Chrome(cast) 拒絕播放串流之外,這幾乎適用於所有影片播放器。 CORS 配置正確。

使用偵錯時chrome://media-internals不斷出現下一則訊息:

視訊幀的 ISO-BMFF 容器元資料指示該幀是關鍵幀,但視訊幀內容指示相反。

進一步調查這一點我發現了這樣一個事實Chrome 對如何播放影片格式更加嚴格

依照指示這個答案,提取 H.264 串流並重新混合到檔案解決了該問題,使 Chrome 和 Chromecast 都可以輕鬆播放該串流。我使用管道 ( cat fixed-recording.mp4 | ffmpeg -i - ...) 對其進行了測試,只是為了確保這不是問題。

有沒有辦法可以使用 ffmpeg 即時修復容器關鍵影格?我需要在 RPi 3 中運行它,這意味著我將無法重新編碼視頻,而且我寧願不寫入磁碟大文件。這是我嘗試過的:

  • 使用-movflags empty_moov+default_base_moof+frag_keyframe以及它們的組合(來自 StackOverflow)。
  • 使用分段 MP4 串流代替。
  • 將原始流提取到兩個文件,但失敗,因為這兩個文件都需要不斷寫入。

相關內容