Ответ 1
Меня спрашивали много раз, поэтому я попытаюсь ответить на это немного в общем, а не только на mjpeg. Получение очень низких задержек в системе требует немного усилий по разработке системы, а также понимания компонентов.
Некоторые простые настройки верхнего уровня, о которых я могу думать, следующие:
Убедитесь, что кодек настроен на самую низкую задержку. Кодеки будут иметь (особенно встроенные системные кодеки) конфигурацию с низкой задержкой. Включите его. Если вы используете H.264, это наиболее полезно. Большинство людей не понимают, что по стандартным требованиям декодеры H.264 должны предварительно отформатировать фреймы перед их отображением. Это может быть до 16 для Qcif и до 5 кадров для 720p. Это большая задержка в получении первого кадра. Если вы не используете H.264, убедитесь, что у вас нет B-снимков. Это добавляет задержки для получения первого изображения.
Поскольку вы используете mjpeg, я не думаю, что это вам очень подходит.
Кодеры также будут иметь задержку контроля скорости. (Записанная задержка инициализации или размер vbv buf). Установите его на наименьшее значение, которое дает вам приемлемое качество. Это также уменьшит задержку. Подумайте об этом как буфере бит-потока между кодировщиком и декодером. Если вы используете x264, это будет размер буфера vbv.
Некоторые простые другие конфигурации: используйте как можно меньше изображений я (большой интервал времени). Фотографии я огромны и добавляют задержку для отправки по сети. Это может быть не очень заметно в системах, где конечная задержка находится в диапазоне от 1 секунды или более, но когда вы разрабатываете системы, требующие задержки конца до конца 100 мс или менее, это и несколько других аспектов вступают в игру. Также убедитесь, что вы используете аудиокодек с низкой задержкой aac-lc (а не heaac).
В вашем случае, чтобы получить более низкие задержки, я бы предложил отказаться от mjpeg и использовать как минимум mpeg4 без B-изображений (Простой профиль) или лучше всего - базовый профиль H.264 (x264 дает опцию нулевой последовательности). Простая причина, по которой вы получите более низкую задержку, заключается в том, что вы получите более низкое кодирование после биттреста, чтобы отправить данные, и вы можете перейти к полной частоте кадров. Если вы должны придерживаться mjpeg, у вас есть близкое к тому, что вы можете получить без поддержки дополнительных функций от кодека и системы, используя компоненты с открытым исходным кодом, как есть.
Другим аспектом является передача содержимого на дисплей. Если вы можете использовать udp, это уменьшит задержку довольно много по сравнению с tcp, хотя иногда это может быть потеряно в зависимости от условий сети. Вы упомянули видео html5. Мне любопытно, как вы делаете потоковое видео в теге html5.
Есть и другие аспекты, которые можно также настроить, которые я бы поставил в продвинутой категории, и требует от системного инженера попробовать различные вещи.
Что такое буферизация сети в ОС? ОС также буферизует данные перед отправкой по соображениям производительности. Подстройте это, чтобы получить хороший баланс между производительностью и скоростью.
Используете ли вы кодировку CR или VBR? Хотя CBR отлично подходит для низкого джиттера, вы также можете использовать capped vbr, если кодек предоставляет его.
Может ли ваш декодер начать декодирование частичных кадров? Поэтому вам не нужно беспокоиться о создании данных перед тем, как предоставить его декодеру. Просто продолжайте нажимать данные на декодер как можно скорее.
Вы можете кодировать поле? Половина времени от кодирования кадра до получения первого изображения.
Можете ли вы нарезать кодировку с помощью обратных вызовов всякий раз, когда доступен срез для отправки по сети сразу?
В системах с задержкой в 100 мс, которые я работал во всех вышеперечисленных, используются. Некоторые из функций могут быть недоступны в компонентах с открытым исходным кодом, но если вы действительно нуждаетесь в этом и с энтузиазмом, вы можете продолжить их реализацию.
EDIT: Я понимаю, что вы не можете много сделать для решения IPad потоковой передачи, и есть ограничения из-за hls и латентности, которую вы можете достичь. Но я надеюсь, что это окажется полезным в других случаях, когда вам нужна система с низкой задержкой.