Создание видеопотока MJPEG в c # - PullRequest
25 голосов
/ 19 октября 2008

У меня есть изображения, отправляемые в мою базу данных из удаленного источника видео со скоростью около 5 кадров в секунду в виде изображений JPEG. Я пытаюсь выяснить, как преобразовать эти изображения в видеоформат, чтобы я мог транслировать поток живого видео в Silverlight.

Кажется, имеет смысл создать поток MJPEG, но у меня есть несколько проблем. Сначала я пытался выполнять потоковую передачу через HTTP-запрос, поэтому у меня не было сделок с сокетами, но, возможно, это нарушает мой код.

Если я пытаюсь перейти к своему потоку из QT, у меня появляется ошибка видео, проигрыватель мультимедиа показывает изображение первого кадра и происходит сбой Silverlight:)

Вот код для потоковой передачи - поскольку используемый мной тип контента может быть отправлен только тогда, когда я знаю, что он не идеален и может быть основной причиной. Все изображения поступают через объект LINQ2SQL.

Я уже пытался просто обновить источник изображения для элемента управления изображением в Silverlight, но мерцание неприемлемо. Если Silverlight не поддерживает MJPEG, то нет смысла даже продолжать, но похоже, что это так. У меня есть доступ к фреймам h.264, но через MP4 это казалось более сложным.

    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);
    }

Спасибо!

РЕДАКТИРОВАТЬ: у меня есть поток, работающий в Firefox, поэтому, если я перехожу на страницу, я вижу видео! но ничто другое не принимает формат. Не IE, SL, медиаплеер - ничего.

Ответы [ 5 ]

2 голосов
/ 06 ноября 2008

Я делал MJPEG давным-давно (3-4 года назад), и я чешу голову, пытаясь вспомнить детали, а я просто не могу. Но, если это возможно, я бы посоветовал найти какой-нибудь веб-сайт, который транслирует контент MJPEG, запустил wireshark / ethereal и увидел, что вы получаете по проводам. Я предполагаю, что вам не хватает некоторых обязательных заголовков HTTP, о которых Firefox чуть больше не прощает.

Если вы не можете найти образец потока MJPEG через Интернет, многие веб-камеры имеют программное обеспечение, которое дает вам поток MJPEG. Приложение, с которым я работал, было консолью для нескольких камер безопасности, поэтому я знаю, что это обычная реализация для камер всех типов (если они поддерживают веб-интерфейс).

1 голос
/ 05 ноября 2008

Я далеко не эксперт по потоковой передаче MJPEG, но, глядя на источник mjpg-streamer на sourcefourge, я думаю, что вы должны отправлять каждый кадр отдельно, писать границы до и после каждого из них , Конечно, вы не должны писать тип содержимого в закрывающей границе.

0 голосов
/ 17 декабря 2008

О редактировании: MJPEG поддерживается Firefox и Safari. Однако другие приложения этого не делают, например Explorer или Silverlight, в зависимости от того, что вы делаете с ним.

0 голосов
/ 20 октября 2008

Вы смотрели на различные настройки веб-камеры, которые существуют в сети? Многие из них делают какое-то обновление с низким разрешением без мерцания. Вы должны иметь возможность провести обратный инжиниринг этих типов сайтов, чтобы получить дополнительные подсказки к вашей проблеме.

Некоторые сайты создают анимацию в формате GIF, возможно, это вариант, позволяющий пользователю видеть прошедшую минуту или около того.

0 голосов
/ 19 октября 2008

Во-первых, запишите ваши кадры mjpeg в отдельные файлы. Затем вы сможете открыть их в Phototshop (это будет независимо проверять, правильно ли вы анализируете поток). Если это не удастся, значит, у вас есть заголовки HTTP, встроенные в данные вашего изображения.

...