Подтвердить что ты не робот

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

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

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

Если я попытаюсь запустить мой поток из QT, я получаю видео-ошибку, Media Player показывает изображение первого кадра и 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);
    }

Спасибо!

EDIT: У меня есть поток, работающий в firefox, поэтому, если я просматриваю страницу, я вижу видео! но ничто иное не принимает формат. Не IE, SL, медиаплеер - ничего.

4b9b3361

Ответ 1

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

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

Ответ 2

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

Ответ 3

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

Ответ 4

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

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

Ответ 5

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