Я ищу самый быстрый способ кодирования потока веб-камеры, который будет доступен для просмотра в теге html5. Я использую Pandaboard: http://www.digikey.com/product-highlights/us/en/texas-instruments-pandaboard/686#tabs-2 для аппаратного обеспечения. Может использовать gstreamer, cvlc, ffmpeg. Я буду использовать его для управления роботом, поэтому вам потребуется наименьшее количество задержек в видеопотоке. Качество не должно быть большим, и оно не нуждается в аудио. Кроме того, это только для одного клиента, поэтому пропускная способность не является проблемой. Лучшее решение, используемое ffmpeg с mpjpeg, дает мне примерно 1 секунду задержки. Что-нибудь лучше?
Ищите быстрый видеокодер с минимальным запаздыванием для потоковой передачи веб-камеры на ipad
Ответ 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 и латентности, которую вы можете достичь. Но я надеюсь, что это окажется полезным в других случаях, когда вам нужна система с низкой задержкой.
Ответ 2
У нас была аналогичная проблема, в нашем случае необходимо было время внешних событий и синхронизировать их с видеопотоком. Мы попробовали несколько решений, но описанная здесь решена проблема и чрезвычайно низкая задержка:
Он использует gstreamer перекод к mjpeg, который затем отправляется на небольшой потоковый сервер python. Преимущество этого заключается в том, что он использует тег вместо того, чтобы его можно было просматривать большинством современных браузеров, включая iPhone.
Как вы хотите, <video> тегом, простым решением является использование http-launch. Что имели самую низкую латентность всех решений, которые мы пробовали, чтобы они могли сработать для вас. Будьте предупреждены, что ogg/theora не будет работать в Safari или IE, поэтому тем, кто хочет настроить таргетинг на Mac или Windows, придется изменить канал для использования MP4 или WebM.
Другое решение, которое выглядит многообещающим, gst-streaming-server. Мы просто не смогли найти достаточную документацию, чтобы сделать ее достойной. Я был бы признателен, если бы кто-нибудь мог задать вопрос о том, как он должен быть использован!