Então, usei o ffmpeg para transmitir a webcam ao vivo usando o protocolo UDP para a porta 1111:
ffmpeg -f dshow -i video="Lenovo EasyCamera" -f mpegts udp://localhost:1111
Quando joguei diretamente pelo ffplay da porta 1111, tudo funcionou corretamente:
ffplay udp://localhost:1111
Consegui a qualidade do vídeo assim:
Então eu acho que poderia escrever alguns códigos Winsock paraouça a porta 1111 e encaminhe qualquer pacote UDP capturado para a porta 2222. Assim, eu poderia simular que estou transmitindo para a porta 2222. Meu código é mais ou menos assim:
' // 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
Então tentei reproduzir o stream da porta 2222 usando ffplay:
ffplay udp://localhost:2222
Bem, não sei por que a qualidade do vídeo ficou tão ruim:
A questão é que enviei os mesmos pacotes UDP na mesma ordem que a fonte de streaming. Oque pode estar errado aqui?
PS: Eu tentei um experimento semelhante ao anterior com TCP, mas a qualidade do vídeo final foi tão boa quanto a transmissão direta. Então, isso poderia ser um problema do UDP?
PS2: Eu testei a perda e desordem de pacotes UDP substituindo o ffplay por um soquete que escuta a porta 2222 e imprime todos os pacotes recebidos. Mas o resultado é que todos os mais de 10.000 pacotes estavam na ordem correta e nada foi perdido. Que fenômeno maluco?