У меня есть приложение с белым металлом, работающее на крошечном 16-битном микроконтроллере (ST10) с 10BASE-T Ethernet (CS8900) и реализация Tcp/IP на основе проекта EasyWeb.
Основной задачей приложения является управление дисплеем со светодиодной матрицей для информации о пассажирском движении. Он генерирует информацию отображения примерно со скоростью 41fps и настраиваемый размер дисплея, например. 160 × 32 пикселя, глубина цвета 1 бит (каждый светодиод может быть либо включен, либо выключен).
Пример:
Реализован крошечный веб-сервер, который обеспечивает соответствующий контент буфера кадров (равный содержимому отображаемого матричного дисплея) в качестве PNG или BMP для загрузки (как несжатых из-за нагрузки процессора, так и глубины цвета 1 бит). Поэтому я могу получать моментальные снимки, например:
wget http://$IP/content.png
или
wget http://$IP/content.bmp
или поместите соответствующий html-код в контроллер index.html
, чтобы просмотреть его в веб-браузере.
Я также мог написать html/javascript код для обновления этого изображения периодически, например. каждую секунду, чтобы пользователь мог видеть изменения отображаемого содержимого.
Теперь для следующего шага я хочу предоставить отображаемый контент как некоторый поток видео, а затем поместить соответствующий html-код в мой index.html
или просто открыть этот "потоковый URI", например. vlc.
Поскольку мои растровые изображения framebuffer создаются несжатыми, я ожидаю постоянный битрейт.
Я не уверен, как лучше всего начать с этого.
(1) Какой видеоформат легче всего сгенерировать, если у меня уже есть PNG для каждого фрейма (но у меня есть этот PNG только на пару миллисекунд и вы не можете его долгое время буферизовать)?
Обратите внимание, что моя целевая система очень ограничена ресурсами как в памяти, так и в вычислительной мощности.
(2) Каким образом для распределения по IP?
У меня уже есть несколько сокетов tcp, открытых для прослушивания на порту 80. Я мог бы транслировать видео через HTTP (после получения) с помощью кодированной передачи передачи (каждый кадр как собственный фрагмент). (Возможно, HTTP Live Streaming, как это?)
Я бы также читал о таких, как SCTP, RTP и RTSP, но это похоже на работу по реализации этого на моей цели. И поскольку есть также потенциальный недостаток firewall, я думаю, что предпочитаю HTTP для транспорта.
Обратите внимание, что приложение закодировано в простой C, без операционной системы или мощных библиотек. Все материалы кодируются с нуля, даже с веб-сервером и генерацией PNG.
Редактировать 2017-09-14, попробовать с APNG
Как было предложено Номинальным животным, я попытался использовать APNG.
Я бы расширил свой код, чтобы создать соответствующие фрагменты fcTL
и fdAT
для каждого фрейма и предоставить bla.apng
HTTP Content-Type image/apng
.
После загрузки этих bla.apng
он выглядит полезным, когда, например, открытие в firefox или chrome (но не в
konqueror,
vlc,
игрок-дракон,
gwenview).
Попытка потока, что apng работает красиво, но только с firefox. Chrome хочет сначала загрузить файл полностью.
Таким образом, APNG может быть решением, но с недостатком, что он в настоящее время работает только с firefox. После дальнейших испытаний я узнал, что 32-битные версии Firefox (55.0.2), сбойные после примерно 1 часа воспроизведения APNG, были переданы за 100 Мбайт данных за это время. Похоже, что они не отбрасывают старые/устаревшие кадры.
Дополнительные ограничения: поскольку APNG должен иметь 32-битный "порядковый номер" в каждом фрагменте анимации (требуется 2 для каждого кадра), может быть ограничение максимальной продолжительности воспроизведения. Но для моей частоты кадров 24 мс этот предел длительности составляет около 600 дней, и поэтому я мог бы жить с.
Обратите внимание, что тип mime APNG был указанный mozilla.org, как image/apng
. Но в моих тестах я узнал, что он немного лучше поддерживается, когда мой HTTP-сервер поставляет APNG с Content-Type image/png
. Например. Chromium и Safari на iOS будут воспроизводить мои APNG файлы после загрузки (но все еще не потоковые). Даже сервер wikipedia обеспечивает, например, этот пляжный мяч APNG с Content-Type image/png
.
Изменить 2017-09-17, попробовать с анимированным GIF
Как также предлагается Номинальное животное, Я теперь попробовал анимированный GIF.
Выглядит хорошо в некоторых браузерах и зрителях после полной загрузки (например, 100 или 1000 кадров).
Попытка трансляции в реальном времени выглядит нормально в Firefox, Chrome, Opera, Rekonq и Safari (на macOS Sierra). Не работает Safari (на OSX El Capitan и iOS 10.3.1), Konqueror, vlc, игрок-дракон, gwenview. Например. Safari (проверенный на iOS 10.3.3 и OSX El Capitan) сначала хочет полностью загрузить gif перед отображением/воспроизведением.
Недостаток использования GIF: по какой-либо причине (например, использование процессора) я не хочу реализовывать сжатие данных для созданных изображений фреймов. Напр. PNG, я использую несжатые данные в блоке IDAT и для 160x32 PNG с глубиной цвета 1Bit a получил около 740 бит для каждого кадра. Но при использовании GIF без сжатия, особенно для 1 бит черно-белых растровых изображений, он сбрасывает пиксельные данные в 3-4 раза.