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-Key: 3378531082

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

Printed on: April 29, 2024 at 05:04 o'clock

Member: MrCount
MrCount Jul 19, 2022 at 10:29:06 (UTC)
Goto Top
Member: TheAggy
TheAggy Jul 19, 2022 at 11:07:15 (UTC)
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
Member: MrCount
MrCount Jul 19, 2022 at 11:29:29 (UTC)
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
Member: colinardo
Solution colinardo Jul 19, 2022 updated at 12:11:22 (UTC)
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
Member: TheAggy
TheAggy Jul 19, 2022 at 13:14:15 (UTC)
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?
Member: TheAggy
TheAggy Jul 19, 2022 at 14:39:29 (UTC)
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