Я получил Pi B + и камеру Pi и сейчас пытаюсь найти наиболее эффективную (с низким ЦП) и самую низкую задержку конфигурацию для потоковой передачи видео в формате H.264 с камеры на мой домашний сервер.
Я прочитал следующее:
(Все ссылки используют gstreamer-1.0 от deb http://vontaene.de/raspbian-updates/ . main
.)
За последние годы в этом направлении было сделано много.
Первоначально мы должны были перенаправить вывод raspivid
в gst-launch-1.0
(см. Ссылку 1).
Затем (ссылка 2) был создан официальный драйвер V4L2, который теперь является стандартным, и он позволяет напрямую получать данные без канала, используя только gstreamer (см. Особенно сообщение от towolf ». Sat 07 декабря 2013 г. 15:34 в ссылке 2):
Отправитель (Пи): gst-launch-1.0 -e v4l2src do-timestamp=true ! video/x-h264,width=640,height=480,framerate=30/1 ! h264parse ! rtph264pay config-interval=1 ! gdppay ! udpsink host=192.168.178.20 port=5000
Приемник: gst-launch-1.0 -v udpsrc port=5000 ! gdpdepay ! rtph264depay ! avdec_h264 ! fpsdisplaysink sync=false text-overlay=false
Если я правильно понимаю, оба способа используют GPU для декодирования H264, но последний является немного более эффективным, так как ему не нужно проходить через ядро в другой раз, так как нет никакого канала между вовлеченными процессами.
Теперь у меня есть несколько вопросов по этому поводу.
Является ли последний все еще самый последний способ эффективно получить H264 от камеры? Я читал о том
gst-omx
, что позволяет gstreamer конвейеров, как... video/x-raw ! omxh264enc ! ...
. Делает ли это что-то отличное от простого использованияvideo/x-h264
, или это может быть даже более эффективным? Какая разница?Как узнать, какой плагин кодирования gstreamer на самом деле используется при использовании
video/x-h264 ...
конвейера? Кажется, это просто указывает нужный мне формат по сравнению с другими частями конвейера, где я явно называю компонент (код) (например,h264parse
илиfpsdisplaysink
).В этом ответе на ссылку 1 Микаэль Леписто упоминает «Я удалил один ненужный проход фильтра с потоковой стороны» , что означает, что он вырезал
gdppay
иgdpdepay
. Что они делают? Зачем они нужны? Могу ли я действительно их снять?Он также упоминает, что, указав
caps="application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264, payload=(int)96"
параметры дляudpsrc
принимающей стороны, он может запустить / возобновить потоковую передачу в середине потока. Чего добиваются эти заглавные буквы, почему эти конкретные выборы, где я могу прочитать о них больше?Когда я делаю то, что предложено в вопросах 3 и 4 (добавление
caps
, удалениеgdppay
иgdpdepay
), тогда моя задержка видео становится намного хуже (и, кажется, накапливается, задержка увеличивается со временем, и через несколько минут видео останавливается)! Почему это может быть? Я хотел бы получить задержку, полученную с помощью оригинальной команды, но также иметь возможность присоединения к потоку в любое время.Я читал, что RTSP + RTP обычно используют комбинацию TCP и UDP: TCP для управляющих сообщений и других вещей, которые не должны быть потеряны, и UDP для реальной передачи видеоданных. В приведенных выше настройках, я на самом деле использую это, или я просто использую только UDP? Мне немного непонятно, заботится ли об этом gstreamer или нет.
Буду признателен за любой ответ хотя бы на один из этих вопросов!
|
создает какую-либо проблему в этом контексте, является невероятной частью BS. Вы пробовали какие-либоraspivid | cvlc
методы? У меня не было камеры очень долго или много времени, чтобы поиграть с ней, но использование ее для создания потока http (видимого на linux на другом конце с /vlc
), похоже, работает нормально.cat file | grep ...
вместоgrep ... file
. Канал добавляет еще один уровень копирования в ядро и из него, что легко измерить, особенно на устройствах с низкой пропускной способностью памяти. Если gstreamer может читать файлы устройства напрямую, почему бы не использовать это? Что касается вашегоraspivid | cvlc
предложения: я использовал это до того, как переключился на решение на основе gstreamer, у него задержка на 3 секунды больше, чем у gstreamer (я не знаю почему).cvlc
использует ~ 45%, но простое прохождение через канал с такой скоростью передачи данных (опять же, учитывая, что канал не замедляет его ) едва ли переместит стрелку, я думаю. Нравится <5%. Это не совсем незначительно, если вы хотите сделать это максимально эффективно, конечно ...raspivid | cvlc
тот, и это 40-50%. Люди могут лучше ответить на вопрос, который заставляет их улучшать конкретную фигуру. Прямо сейчас вы спрашиваете много о причинах, не объясняя, почему каждый из них важен.Ответы:
Варианты:
raspivid -t 0 -o - | nc -k -l 1234
raspivid -t 0 -o - | cvlc stream:///dev/stdin --sout "#rtp{sdp=rtsp://:1234/}" :demux=h264
cvlc v4l2:///dev/video0 --v4l2-chroma h264 --sout '#rtp{sdp=rtsp://:8554/}'
raspivid -t 0 -o - | gst-launch-1.0 fdsrc ! h264parse ! rtph264pay config-interval=1 pt=96 ! gdppay ! tcpserversink host=SERVER_IP port=1234
gst-launch-1.0 -e v4l2src do-timestamp=true ! video/x-h264,width=640,height=480,framerate=30/1 ! h264parse ! rtph264pay config-interval=1 ! gdppay ! udpsink host=SERVER_IP port=1234
uv4l --driver raspicam
picam --alsadev hw:1,0
Что нужно учитывать
top -d 10
)Сравнение:
источник
?
"?Только современный способ потока H264 в браузер с UV4L : нет задержки, ни конфигурации, с дополнительным аудио, опционально двухсторонняя аудио / видео. Никакого волшебного соуса GStreamer, но можно расширить его использование.
источник
uv4l
? Мой конвейер gstreamer выглядит довольно устаревшим! Не могу дождаться, чтобы проверить, какова задержка!1.) Поток h264es через сеть (только для примера)
на сервере:
на клиенте:
2.) Поток mjpeg через сеть (только для примера)
на сервере:
на клиенте:
все это даже работает на RPi Zero W (настроен как сервер)
источник
sample only
значит?