theaggy
Goto Top

MJPEG-Stream in Powershell-Form darstellen

Moin zusammen,

aktuell gibt es bei uns diverse Kameras der Marke Agfeo die über den Webbrowser das Bild darstellen können.

Es funktioniert zwar, hierrüber sich das Bild anzuschauen, allerdings dauert das laden der Seite lange und die Anmeldedaten der Kamera sind in der URL sichtbar.
Über ein IP Camera Programm funktioniert der Abruf dieses Streams schnell.

Gewünscht ist eine Datei die gestartet wird und es erscheint direkt als kleines Fenster das Bild der Kamera, sonst nichts

Meine Idee wäre nun über eine Powershell-Form diesen MJPEG-Stream darzustellen, allerdings scheitere ich hierbei bei der Einbindung des MJPEG-Streams.

Meine Recherchen ergaben leider nur Codebeispiele für C# aber damit kann ich leider noch nicht soviel anfangen :/


Hat hier jemand Ideen wie ich den MJPEG-Stream in die Windows Form bekomme?

Danke schonmal im Voraus.

Liebe Grüße

Content-ID: 3378531082

Url: https://administrator.de/contentid/3378531082

Ausgedruckt am: 02.11.2024 um 22:11 Uhr

MrCount
MrCount 19.07.2022 um 12:29:06 Uhr
Goto Top
TheAggy
TheAggy 19.07.2022 um 13:07:15 Uhr
Goto Top
Danke schonmal für die schnelle Antwort face-smile

Leider kann ich damit nicht viel anfangen. :/

Die Demos auf der Seite sind auch nicht mehr verfügbar, dann wäre ich da wohl schlauer draus geworden face-sad
MrCount
MrCount 19.07.2022 um 13:29:29 Uhr
Goto Top
Zitat von @TheAggy:

Die Demos auf der Seite sind auch nicht mehr verfügbar, dann wäre ich da wohl schlauer draus geworden face-sad


Auf GitHub sind die Codes noch zu finden: https://github.com/jacobbo/WebEye
colinardo
Lösung colinardo 19.07.2022 aktualisiert um 14:11:22 Uhr
Goto Top
Quick n' Dirty mit Bordmitteln.
function GenerateForm {
    Add-Type -A System.Windows.Forms
    Add-Type -A System.Drawing
    $wc = New-Object System.Net.WebClient
    $timer = New-Object System.Windows.Forms.Timer -P @{
        add_Tick = {
            $ms = [System.IO.MemoryStream]::new($wc.DownloadData('https://sace11.ddns3-instar.de:8084/tmpfs/auto.jpg?usr=gast&pwd=gast'))  
            $box.Image = [System.Drawing.Bitmap]::FromStream($ms)
            $ms.Close
        }
        Interval = 1000
    }
    
    $form = New-Object System.Windows.Forms.Form -P @{
        ClientSize = '640,480'  
        Text = "CAM"  
        add_Activated = {
            $timer.Start()
        }
        add_Closed = {
            $timer.Stop()
            $timer.Dispose()
        }
    }
    
    $box = New-Object System.Windows.Forms.PictureBox -P @{
        Location = '0,0'  
        Dock = 'Fill'  
        SizeMode = 'Zoom'  
    }
    
    $form.Controls.Add($box)
    [void]$form.ShowDialog()
}
GenerateForm
Grüße Uwe
TheAggy
TheAggy 19.07.2022 um 15:14:15 Uhr
Goto Top
Danke Uwe das sieht schon gut aus face-smile

konnte es bei einem Test schon erfolgreich umsetzen, allerdings habe ich noch ein Problem mit der Authentifizierung.

Wenn ich die URL im Format http://user,pw@IPAdresse:port/... eingebe schlägt der Abruf mit Fehler "401 nicht authorisiert" Fehl.

Hab grad noch versucht das script zu erweitern mit

$wc.Credentials = new-object System.Net.NetworkCredential("user","password")

oder

$passwd = ConvertTo-SecureString "password" -AsPlainText -Force;
$wc.Credentials = New-Object System.Management.Automation.PSCredential ("user", $passwd)

Aber dann hängt sich die Form leider auf :/

Hast noch ne Idee wie ich die Authentifizierung mit einbauen kann?
TheAggy
TheAggy 19.07.2022 um 16:39:29 Uhr
Goto Top
Kurzes Update:

Habe nun durch testen festgestellt, dass es nicht an der Authentifizierung liegt.
Die Cam bietet auch eine URL für ein einzelnen Bild als JPG an. Hier funktioniert es die Basic Authentifizierung hinzuzufügen.

Somit habe ich jetzt eine Form wo sich diese jede Sekunde dieses Bild neu holt.

Das Sollte für unsere Anforderung reichen.

Das ganze sieht nun so aus:

$user="user"  
$pw="password"  
$url='http://IP:PORT/?action=snapshot'  


function GenerateForm {
    Add-Type -A System.Windows.Forms
    Add-Type -A System.Drawing
    $wc = New-Object System.Net.WebClient



    $credCache = new-object System.Net.CredentialCache
    $creds = new-object System.Net.NetworkCredential($user,$pw)
    $credCache.Add($url, "Basic", $creds)  
    $wc.Credentials = $credCache

    $timer = New-Object System.Windows.Forms.Timer -P @{
        add_Tick = {
            $ms = [System.IO.MemoryStream]::new($wc.DownloadData($url))
            $box.Image = [System.Drawing.Bitmap]::FromStream($ms)
            $ms.Close
        }
        Interval = 1000
    }
    
    $form = New-Object System.Windows.Forms.Form -P @{
        ClientSize = '640,480'  
        Text = "CAM"  
        add_Activated = {
            $timer.Start()
        }
        add_Closed = {
            $timer.Stop()
            $timer.Dispose()
        }
    }
    
    $box = New-Object System.Windows.Forms.PictureBox -P @{
        Location = '0,0'  
        Dock = 'Fill'  
        SizeMode = 'Zoom'  
    }
    
    $form.Controls.Add($box)
    [void]$form.ShowDialog()
}
GenerateForm

Danke für eure Hilfe habt mir sehr geholfen face-smile