Więc użyłem ffmpeg do strumieniowania kamery na żywo za pomocą protokołu UDP do portu 1111:
ffmpeg -f dshow -i video="Lenovo EasyCamera" -f mpegts udp://localhost:1111
Kiedy grałem bezpośrednio w ffplay z portu 1111, wszystko działało poprawnie:
ffplay udp://localhost:1111
Mam jakość wideo taką jak ta:
Myślę więc, że mógłbym napisać kilka kodów winsock, aby nasłuchiwać portu 1111 i przekazywać dowolny pakiet UDP, który przechwytuje do portu 2222 . W ten sposób mógłbym zasymulować, że przesyłam strumieniowo do portu 2222. Mój kod jest mniej więcej taki:
' // 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
Następnie spróbowałem odtworzyć strumień z portu 2222 przy użyciu ffplay:
ffplay udp://localhost:2222
Nie wiem, dlaczego jakość wideo zmieniła się na tak złą:
Chodzi o to, że wysłałem te same pakiety UDP w tej samej kolejności co źródło przesyłania strumieniowego. Co może tu być nie tak?
PS: Próbowałem podobnego eksperymentu jak powyżej z TCP, ale końcowa jakość wideo była równie dobra jak bezpośrednie przesyłanie strumieniowe. Czy może to być problem UDP?
PS2: Przetestowałem utratę i zaburzenie pakietu UDP, zastępując grę ffplay gniazdem, które nasłuchuje portu 2222 i drukuje wszystkie otrzymane pakiety. Ale wynikiem jest to, że wszystkie ponad 10 000 pakietów było w prawidłowej kolejności i nic nie zostało utracone. Co za szalone zjawisko?