因此,我使用 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:我通过将 ffplay 替换为监听端口 2222 的套接字并打印出所有收到的数据包来测试 UDP 数据包丢失和混乱情况。但结果是所有 10,000 多个数据包都按正确顺序排列,没有任何丢失。多么疯狂的现象?