使用 ffmpeg 進行低延遲串流傳輸

使用 ffmpeg 進行低延遲串流傳輸

最近,我嘗試使用串流遠端桌面ffmpeg。目標是能夠將一台計算機螢幕上顯示的內容傳送到另一台計算機,同時能夠選擇輸出解析度等設定。

這是一個小快要工作了概念證明。完成後,我將能夠使用以下方式替換 VNCffmpeg串流媒體x2x或者協同作用用於轉發鍵盤和滑鼠事件。

現在,我可以使用以下方式開始串流:

ffmpeg -f x11grab -s "1600x1200" -i ":0" \
    -f alsa -i pulse \
    -s 800x600 -b 200k -f mpegts - \
    | mplayer -cache 1024 -
#
# I have pulse audio configured so that `-i pulse` will
# The output can sent through for example netcat to another host
#

延遲取決於編碼選項。使用這些選項,螢幕更新和視訊更新之間的延遲約為 800 毫秒。

我想要實現的目標:

  • 延遲時間達到100毫秒
  • mplayer被執行時,它抱怨它無法在李爾流中尋找,並且有沒有音訊。當我將輸出保存到文件並播放時,我仍然有聲音。

    編輯:新增後-cache,在線性流中尋找的訊息不再出現。更改輸出格式以-f mpegts使音訊正常工作。

  • 如果編碼不會 100% 佔用其中一個 cpu 核心(次要目標),那就太好了。

經過在互聯網上的一些研究後,我認為這些問題與我應該使用的編解碼器/選項有關。但我不知道現有可能性之間的差異。您能給我一些可以解決我的問題的選擇嗎?另外,VLC 是一個很好的替代方案嗎?

答案1

從桌面 A 串流到桌面 B 是一個有趣的問題。如果您不需要視頻/音頻,那麼您可能需要檢查 NX 協議。它比 VNC 效率高得多。 FreeNX 是伺服器,NoMachine 和其他公司則製作 NX 用戶端。還有其他伺服器——免費的和商業的。

高效能遠端桌面、SPICE 以及 F/LOSS 專案的功能也在進行中。我認為 Redhat 處於領先地位。http://spice-space.org/

我不知道這些是否是有用的答案,但也許只是導致一些更有用的東西?

對於流視頻,可能需要避免完整桌面協議的開銷。

答案2

我最近需要設置比原始海報 (OP) 更嚴格的要求的低延遲流。我設計了一種解決方案,該解決方案運行良好,可以用作我的筆記型電腦的附加顯示器,並具有流暢的滑鼠和鍵盤輸入。

在發送端,我使用了以下ffmpeg命令:

ffmpeg -video_size 1920x1080 -r 30 -framerate 30 -f x11grab -i :0.0+0x0 \
    -b:v 40M -maxrate 50M -bufsize 200M \
    -field_order tt -fflags nobuffer -threads 1 \
    -vcodec mpeg4 -g 100 -r 30 -bf 0 -mbd bits -flags +aic+mv4+low_delay \
    -thread_type slice -slices 1 -level 32 -strict experimental -f_strict experimental \
    -syncpoints none -f nut "tcp://10.0.0.1:1234"

此指令的關鍵部分是 -g 100 參數,它會增加關鍵影格之間的時間,從而降低流比特率。

在接收端,我使用ffplay(包含在ffmpeg)在 Raspberry Pi 3 上顯示流:

ffplay -autoexit -flags low_delay -framedrop -strict experimental \
    -vf setpts=0 -tcp_nodelay 1 "tcp://10.0.0.1:1234\?listen"

雖然我意識到最初的問題已經有十多年的歷史了,並且從那時起普通用戶可用的處理能力已經顯著提高,但這兩個命令為任何尋求在本地網路上設置低延遲流的人提供了一個合理的起點,即使在低端硬體上也是如此。

相關內容