因此,我使用 ffmpeg 使用 UDP 協定將即時網路攝影機串流到連接埠 1111 :
ffmpeg -f dshow -i video="Lenovo EasyCamera" -f mpegts udp://localhost:1111
當我直接透過 ffplay 從 1111 連接埠播放時,一切正常:
ffplay udp://localhost:1111
我得到的視頻質量是這樣的:
所以我想,我可以寫一些winsock程式碼偵聽連接埠 1111 並將其捕獲的任何 UDP 封包轉送至連接埠 2222。因此,我可以模擬我正在串流到連接埠 2222。
' // Please note that this is the simplified code - cause it worked
' // i've just post the key lines
Winsock1.Bind 1111
Winsock2.remotePort = 2222
WinSock1.GetData myPacket
Winsock2.SendData myPacket
然後我嘗試使用 ffplay 從連接埠 2222 播放串流:
ffplay udp://localhost:2222
好吧,我不知道為什麼影片品質變得這麼差:
關鍵是,我已經按照與串流媒體來源相同的順序發送了相同的 UDP 封包。這裡可能出了什麼問題?
PS:我已經嘗試過使用 TCP 進行類似的實驗,但最終結果的視訊品質與直接串流一樣好。那麼,這可能是 UDP 的問題嗎?
PS2:我透過用偵聽連接埠 2222 的套接字取代 ffplay 並列印所有收到的封包來測試 UDP 封包遺失和混亂。但結果是所有 10,000 多個資料包均按正確順序排列且沒有遺失。這是多麼瘋狂的現象?