我有一個採集卡由處理一個程式我打算在 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 串流代替。
- 將原始流提取到兩個文件,但失敗,因為這兩個文件都需要不斷寫入。