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:

wprowadź opis zdjęcia tutaj

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łą:

wprowadź opis zdjęcia tutaj

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?

vantrung -cuncon
źródło