Создание видеопотока MJPEG в c #

У меня есть изображения, отправляемые в мою базу данных из удаленного источника видео со скоростью около 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, ни Media player - ничего.


person typemismatch    schedule 19.10.2008    source источник
comment
Вы когда-нибудь решали эту проблему?   -  person Josh Stodola    schedule 16.06.2010
comment
Не использую этот метод - я просто загрузил фоновое изображение с помощью JS в браузере, а затем переключил изображения так же быстро, как они появились. Работало нормально.   -  person typemismatch    schedule 20.06.2010
comment
У вас в основном есть основы, здесь есть реализация @ net7mma.codeplex.com/SourceControl/latest   -  person Jay    schedule 20.06.2014


Ответы (5)


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

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

person dviljoen    schedule 05.11.2008

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

person csgero    schedule 05.11.2008

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

person dicroce    schedule 19.10.2008
comment
Да, я сделал это - изображения используются для других вещей, независимо от видео, поэтому я могу их просматривать, и они хорошо выглядят. - person typemismatch; 19.10.2008
comment
Означает ли это, что вы просматривали кадры после того, как они были обработаны вашей программой? - person junkforce; 19.10.2008
comment
Да, у меня он тоже работает в Firefox, и я могу видеть отличное видео, но да, я также записал изображения в виде отдельных файлов jpg на диск, и они в порядке. - person typemismatch; 21.10.2008

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

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

person John Dyer    schedule 20.10.2008

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

person QueueHammer    schedule 17.12.2008