![如何使用 ffmpeg 有意向輸入流添加延遲](https://rvso.com/image/1703363/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%20ffmpeg%20%E6%9C%89%E6%84%8F%E5%90%91%E8%BC%B8%E5%85%A5%E6%B5%81%E6%B7%BB%E5%8A%A0%E5%BB%B6%E9%81%B2.png)
我有一個連接到 Windows PC 的影像擷取卡。擷取輸入裝置為 1080p、60fps、4:4:4 原始視訊。我想在測試設定中使用它,讓用戶在現有的 Windows 應用程式上工作並引入圖像壓縮、降低解析度和降低幀率。其想法是了解用戶體驗並讓用戶評價不同的設定。我的想法是使用 ffmpeg 獲取 RAW 輸入流並引入延遲,轉碼為 MJPEG 並添加不同的 JPEG 等級並添加延遲。雖然我已經可以訪問捕獲設備,更改分辨率並降低幀速率,但我不確定是否有可能引入延遲,因為大多數時候人們要么想要引入視頻延遲來解決音頻延遲,要么人們想要為了減少視頻延遲,而不是故意添加視訊延遲:-)這就是我目前處理串流的方式:
ffmpeg -f dshow -i video="framegrabber_capture_1" -vf format=yuv420p,scale=1280x1024,fps=5 -f sdl test
附帶說明:我只需要純視頻,測試設定中不需要音頻。
我不知道如何轉碼為 MJPEG,但我想這是可行的。我根本找不到有關視頻延遲的信息,因為這也意味著流被緩存在某個地方。如果有人能指出我正確的方向,那就太好了。
謝謝!
J。
答案1
FFmpeg 不是為延遲顯示影片而設計的,因為 FFmpeg 不是視訊播放器。
我們可以透過在來自攝影機的視頻之前連接一個短視頻來強制 FFmpeg 延遲視頻,使用連接篩選。
我們還必須添加即時的過濾器,用於強制 FFmpeg 將輸出速率與輸入速率相匹配(沒有它,FFmpeg 會盡快發送視訊)。
使用 MJPEG 編碼,我們不能使用-f sdl test
FFmpeg 輸出到 FFplay 來顯示影片。
將捕獲的視訊延遲 5 秒的範例:
ffmpeg -an -f dshow -rtbufsize 1G -i video="framegrabber_capture_1" -filter_complex "color=white:size=1280x1024:rate=5:duration=5[w];[0:v]scale=1280x1024,setsar=1,fps=5[v0];[w][v0]concat,realtime=limit=10" -c:v mjpeg -pix_fmt yuvj420p -f mjpeg pipe: | ffplay pipe:
-rtbufsize 1G
- 將輸入緩衝區的大小增加到 1 GB(允許儲存「許多」輸入視訊幀)。color=white:size=1280x1024:rate=5:duration=5[w]
- 建立持續時間為 5 秒、速率為 5fps 的合成白色影片。儲存在[w]
.[0:v]scale=1280x1024,setsar=1,fps=5
- 縮放輸入視頻,並設定幀速率。儲存在[v0]
.[w][v0]concat
- 將 5 秒白色影片與縮放後的輸入影片連結(5 秒白色影片先出現)。realtime=limit=10
- 將輸出速率減慢至輸入速率(limit=10
是暫停限制)。-c:v mjpeg -f mjpeg
- 使用 MJPEG 編解碼器對輸出影片進行編碼,並將其儲存為 MJPEG 容器格式。pipe:
- 使用標準輸出作為輸出。| ffplay pipe:
將標準輸出管道從 FFmpeg 傳遞到 FFplay 的標準輸入管道(用作輸入)。
注意:
延遲並不準確,因為有額外的內建延遲。
我們可以(嘗試)使用更高的幀速率來提高延遲的準確性,並添加setpts=0
到 FFplay 命令:
ffmpeg -an -f dshow -rtbufsize 1G -i video="Microsoft® LifeCam HD-3000" -filter_complex "color=white:size=1280x1024:rate=25:duration=5[w];[0:v]scale=1280x1024,setsar=1,fps=25[v0];[w][v0]concat,realtime=limit=10" -c:v mjpeg -pix_fmt yuvj420p -f mjpeg pipe: | ffplay -vf setpts=0 pipe: