la création de mon propre flux MJPEG
Je suis en train de créer un flux MJPEG, j'ai une série de fichiers jpeg que je veux mettre ensemble dans un cours d'eau de sorte qu'un utilisateur peut cliquer sur une URL et obtenir un flux mjpeg.
J'ai essayé depuis quelques jours pour que tout cela fonctionne, et c'est peut-être pas possible. Je l'ai porté jusqu'éthérée et écouté les paquets en provenance d'une caméra axis sur le net quelque part, et a essayé de mimmick. J'ai d'abord essayé d'utiliser WCF, et le retour d'un "flux", mais plus tard découvert que j'aurais besoin de définir le type de contenu sur ce flux, j'ai donc ensuite essayé la WCF REST api, mais qui souffre du même problème. donc, je suis maintenant à l'aide d'un os à nu HTTPListener et la gestion de l'événement. Je serais très préférez utiliser WCF, mais je ne suis pas sûr qu'il va me permettre de retourner un flux avec le bon type de contenu.
alors, voici ce que j'ai pour le httpListener .
dans le gestionnaire de l'auditeur de retour d'appel j'ai mis la suivante.
HttpListenerResponse response = context.Response;
response.ProtocolVersion = new System.Version(1, 0);
response.StatusCode = 200;
response.StatusDescription = "OK";
response.ContentType = "multipart/x-mixed-replace;boundary=" + BOUNDARY + "\r\n";
System.IO.Stream output = response.OutputStream;
Render(output);
la méthode Render ressemble à ceci
var writer = new StreamWriter(st);
writer.Write("--" + BOUNDARY + "\r\n");
while (true)
{
for (int i = 0; i < imageset.Length; i++)
{
var resource = Properties.Resources.ResourceManager.GetObject(imageset[i]) as Bitmap;
var memStream = new MemoryStream();
resource.Save(memStream,ImageFormat.Jpeg);
byte[] imgBinaryData = memStream.ToArray();
string s = Convert.ToBase64String(imgBinaryData);
writer.Write("Content-type: image/jpeg\r\n");
foreach (var s1 in imgBinaryData)
{
writer.Write((char)s1);
}
writer.Write("\n--" + BOUNDARY + "\n");
writer.Flush();
Thread.Sleep(500);
}
}
À ce moment, j'ai juste ajouté quelques images jpeg en tant que propriétés de la dll, et je suis une itération sur eux, finalement, ce seront des images dynamiques, mais pour l'instant je veux juste la chose à travailler.
De ce que je comprends sur le MJPEG (spec) est que le contenu doit être mis à multipart/x-mixte-de remplacer et d'une limite définie. et puis vous venez de deliminate les fichiers jpeg dans le ruisseau par la frontière.
Cela semble comme il devrait être plus simple, je suis en train de faire, mais je me demande où je vais mal. si je charge cette URL dans IE ou Firefox se bloque. si j'essaie de faire un talon de page html avec une balise img, dont la source est l'URL puis-je obtenir une image brisée.
Des idées, merci
Josh
OriginalL'auteur Joshua | 2009-10-20
Vous devez vous connecter pour publier un commentaire.
Bien, autant que je peux dire, voici vos questions:
La
StreamWriter
n'est pas un bon choix. Utiliser un flux régulier fonction d'écriture est fine. Sens, vous devriez écrire des données dans le tableau d'Octets au lieu de string.Vous convertissez les données Binaires de l'image à String64, le navigateur n'a pas connu que, toujours en pensant que c'est 32 bits de données.
Votre jpeg format n'est pas correct. Vous devez également ajouter
Content-Length
à l'image de l'en-tête de sorte que l'application qui reçoit les flux de savoir quand arrêter de lire plutôt que d'avoir à vérifier pour la prochaine frontière de la chaîne de tous les lire. Ce sera environ de 4 à 5 fois plus vite dans la lecture des données. Et il y a aussi une incohérence dans votre caractère de nouvelle ligne, certains sont des "\r\n", tandis que d'autres sont "\n".Boucle While est une boucle infinie.
Alors, voici la solution.
Remarque: Il pourrait y avoir quelques erreurs de syntaxe, mais vous avez probablement l'idée générale.
OriginalL'auteur Long Ngo
Il y a aussi une mise en œuvre @ https://net7mma.codeplex.com/SourceControl/latest à la bibliothèque on peut transcoder le Http, Rtp compatible à la volée!
OriginalL'auteur Jay