Stap 11: IP Camera (deel 2) - Software
De C#-programma kunt verzenden van opdrachten naar de camera, en de videostream weer te geven. De camerafuncties zijn standaard uitgeschakeld bij het opstarten van de toepassing. Dit is een programma om crashes te voorkomen als de camera niet beschikbaar is.
De camera krijgt opdrachten via http. Bijvoorbeeld, voor het streamen van video resolutie van 640 x 480 is de opdracht:
http://192.168.1.10/videostream.cgi?user=admin&pwd=&Resolution=32&Rate=0
Raadpleeg de documentatie van de SDK van de uw IP camera's of gebruikershandleiding voor de commandostructuur. Ik heb de documentatie voor mijn camera verbonden aan deze stap. Deze opdrachten kunnen ook rechtstreeks in de adresbalk van een Internet-browser worden ingevoerd.
Zodra de camera het krijgt hierboven getoonde bevel, zal het beginnen met het verzenden van een videostream van MJPEG. Mijn programma verwerkt deze stroom en geeft deze weer in de GUI. Ik was niet in staat om te vinden van alle bibliotheken die verwerken van de stream, dus ik maakte mijn eigen functie om het te doen. De functie werkt door het scannen van de inhoud van de stream. Wanneer het vindt de JPEG "Start van afbeelding" bytes (bytes 0,1: 0xFF, 0xD8), het zal beginnen met het opslaan van de stroom in een aparte byte-matrix. Het zullen houden het toevoegen van de inhoud van de stream aan de array totdat hij vindt de JPEG "Einde van de afbeelding" bytes (0xFF, 0xD9). Deze byte-matrix wordt vervolgens omgezet in een "memorystream", dan een bitmap, voordat het definitief wordt weergegeven op de GUI.
Het programma biedt twee video streaming resoluties. De hogere resolutie (640 x 480) biedt het beter duidelijkheid, maar heeft een aanzienlijk lagere beeldfrequentie. De lagere resolutie (320 x 240) is niet goed voor de beeldkwaliteit, maar de hogere beeldsnelheid maakt het de betere keuze als het besturen van de auto door de camera.
Er is ook een knop om te laten zien van een stilstaand beeld. Deze functionaliteit is afhankelijk van één of andere code die ik vond op een website (http://www.codeproject.com/Articles/15537/Camera-Vision-video-surveillance-on-C). Aanvankelijk, ik alleen gebruikt voor foutopsporing, bij het maken van mijn functies voor videostreaming. Ik ging om het te verwijderen, maar besloot om het in te laten.
Aangezien de camera pan/tilt beweging in gebouwd, voegde ik ook deze mogelijkheden in de C#-programma. De rechter analoge stick op de Xbox-controller is toegewezen aan het besturingselement van de camerapositie (de toewijzing van deze controle wordt meestal toegewezen aan "gratis kijken" in de XBox racegames). De camera krijgt zijn pan/tilt instructies via http opdrachten. Bijvoorbeeld, de camera om hoger te plaatsen, is de opdracht:
http://192.168.1.10/decoder_control.cgi?Command=0&user=admin&pwd=
Er zijn aparte http-opdrachten voor de motor start en stop. Ik gebruikte om te converteren beweging naar meetbare "stappen", vertragingen, zodat wanneer de analoge stick wordt verplaatst binnen een enkele controller "frame", de camera slechts één stap beweegt. De motoren zijn echter verre van nauwkeurig, zodat deze stappen zeer inconsistent in grootte zijn. Ik wilde aanvankelijk een "terug naar centrum"-functie voor de camera opneemt, maar vond dat wegens de wankel stap grootte, de camera zelden keerde terug naar het centrum. (De functie is er nog steeds in de broncode, maar niet in gebruik).