webentwicklung-frage-antwort-db.com.de

Erstellen eines MJPEG-Videostreams in c #

Ich habe Bilder, die von einer entfernten Videoquelle mit ungefähr 5 Bildern pro Sekunde als JPEG-Bilder an meine Datenbank gesendet werden. Ich versuche herauszufinden, wie ich diese Bilder in ein Videoformat bringen kann, damit ich einen Live-Video-Feed an Silverlight streamen kann.

Es scheint sinnvoll, einen MJPEG-Stream zu erstellen, aber ich habe ein paar Probleme. Zuerst habe ich versucht, über eine HTTP-Anfrage zu streamen, damit ich mich nicht mit Sockets auseinandersetzen musste, aber vielleicht bricht dies meinen Code.

Wenn ich versuche, von QT aus in meinen Stream zu surfen, wird ein Videofehler angezeigt. Media Player zeigt das erste Einzelbild an und Silverlight stürzt ab :)

Hier ist der Code, der gestreamt wird - da ich diesen Inhaltstyp verwendet habe, kann er nur gesendet werden, wenn ich weiß, dass er nicht ideal ist und die Hauptursache sein könnte. Alle Bilder kommen über ein LINQ2SQL-Objekt.

Ich habe bereits versucht, einfach die Bildquelle eines Bildsteuerelements in Silverlight zu aktualisieren, aber das Flimmern ist nicht akzeptabel. Wenn Silverlight MJPEG nicht unterstützt, macht es keinen Sinn, weiterzumachen, aber es sieht so aus. Ich habe Zugriff auf die eingehenden h.264-Frames, aber das schien über MP4 komplizierter zu sein.

    Response.Clear();
    Response.ContentType = "multipart/x-mixed-replace; boundary=--myboundary";
    ASCIIEncoding ae = new ASCIIEncoding();
    HCData data = new HCData();
    var videos = (from v in data.Videos
                 select v).Take(50); // sample the first 50 frames
    foreach (Video frame in videos)
    {
        byte[] boundary = ae.GetBytes("\r\n--myboundary\r\nContent-Type: image/jpeg\r\nContent-Length:" + frame.VideoData.ToArray().Length + "\r\n\r\n");
        var mem = new MemoryStream(boundary);
        mem.WriteTo(Response.OutputStream);
        mem = new MemoryStream(frame.VideoData.ToArray());
        mem.WriteTo(Response.OutputStream);
        Response.Flush();
        Thread.Sleep(200);
    }

Vielen Dank!

BEARBEITEN: Ich habe den Stream in Firefox. Wenn ich also zur Seite surfe, sehe ich ein Video! aber nichts anderes akzeptiert das Format. Nicht IE, SL, Media Player - nichts.

25
typemismatch

Ich habe MJPEG vor langer Zeit (vor 3-4 Jahren) gemacht und ich kratzte mir am Kopf, um mich an die Details zu erinnern, und ich kann es einfach nicht. Aber, wenn es möglich ist, würde ich vorschlagen, eine Art Website zu finden, die MJPEG-Inhalte streamt und wireshark/Ethereal startet und sieht, was Sie über den Draht bekommen. Vermutlich fehlen Ihnen einige erforderliche HTTP-Header, über die Firefox etwas mehr verzeiht.

Wenn Sie keinen Beispiel-MJPEG-Stream über das Internet finden können, verfügen viele Webkameras über eine Software, die Ihnen einen MJPEG-Stream bietet. Die App, mit der ich daran gearbeitet habe, war eine Konsole für mehrere Überwachungskameras, daher weiß ich, dass dies eine übliche Implementierung für Kameras aller Art ist (sofern sie ein Webinterface unterstützen).

2
dviljoen

Ich bin weit davon entfernt, ein Experte für MJPEG-Streaming zu sein, aber wenn Sie sich die Quelle von mjpg-streamer on sourcefourge ansehen, sollten Sie jeden Frame separat senden und die Begrenzung vor und nach jedem Frame schreiben. Sie sollten den Inhaltstyp natürlich nicht in die schließende Begrenzung schreiben.

1
csgero

Schreiben Sie zuerst Ihre MJPEG-Frames in separate Dateien. Sie sollten dann in der Lage sein, diese in Phototshop zu öffnen (dies überprüft unabhängig, ob Sie den Stream korrekt analysieren). Wenn dies fehlschlägt, besteht die Wette darin, dass Sie HTTP-Header in Ihre Bilddaten eingebettet haben.

0
dicroce

Haben Sie sich verschiedene Web-Cam-Konfigurationen im Internet angesehen? Viele von ihnen führen eine Art Low-Res-Update durch, ohne zu flimmern. Sie sollten in der Lage sein, diese Site-Typen zurückzuentwickeln, um zusätzliche Hinweise auf Ihr Problem zu erhalten.

Auf einigen Websites wird eine GIF-Animation erstellt. Möglicherweise ist dies eine Option, damit der Benutzer die letzte Minute sehen kann.

0
John Dyer

Zu Ihrer Bearbeitung: MJPEG wird von Firefox und Safari unterstützt. Andere Anwendungen wie Explorer oder Silverlight tun dies jedoch nicht, je nachdem, was Sie damit tun.

0
QueueHammer