Потоковая передача H264 с помощью камеры RaspberryPi

Я работаю над проектом по созданию робота с использованием Raspberry Pi, который будет отправлять видео на устройство Android и будет управляться с него.
Я решил использовать камеру RaspberryPi (может быть, веб-камера USB лучше?). Я хочу, чтобы видео было в формате H264, но у меня возникли проблемы с потоковой передачей в этом формате. Я пробовал использовать gstreamer и vlc:

  1. Если я использую vlc, я получаю очень задержанное видео, а не плавное.
  2. Если я использую gstreamer, я получаю хорошее видео, но я не знаю, как установить URL-адрес для вставки кода приложения для Android. Я могу посмотреть видео, запустив команду gstreamer на моем компьютере. Я использую следующие команды:

На RaspberryPi:

raspivid -t 999999 -h 720 -w 1080 -fps 25 -hf -b 2000000 -o - | gst-launch-1.0 -v fdsrc ! h264parse !  rtph264pay config-interval=1 pt=96 ! gdppay ! tcpserversink host=192.168.1.102 port=5000

На моем ПК (для просмотра видео):

gst-launch-1.0 -v tcpclientsrc host=192.168.1.102 port=5000  ! gdpdepay !  rtph264depay ! avdec_h264 ! videoconvert ! autovideosink sync=false

Итак, во-первых, мой вопрос: есть ли способ установить URL-адрес для перехвата этого потока gstreamer (или любой другой способ перехвата потока в коде приложения для Android)?
Во-вторых, если у вас есть какие-либо другие советы, такие как с использованием другой камеры, другого формата (не mjpg), другого способа потоковой передачи и т. д.


person A. Sarid    schedule 24.12.2013    source источник
comment
Я также работаю над беспроводным потоковым видео, насколько я знаю, лучший способ - это сервер потока как RTSP (в котором используется RTP через TCP / UDP). После этого вы можете написать приложение, которое воспроизводит URL-адрес rtsp: // ip.   -  person Alston    schedule 17.02.2014


Ответы (5)


Я считаю, что выбранный вами путь - лучший. В Gstreamer есть готовые к использованию примеры Android (через NDK): http://docs.gstreamer.com/display/GstSDK/Android+tutorial+3%3A+Video

Здесь вы можете найти образец приложения: https://play.google.com/store/apps/details?id=pl.effisoft.rpicamviewer2

person zuko    schedule 26.11.2014

Конечно, вы можете использовать тот же конвейер ПК в коде Android. Взгляните на Учебник 3 по GStreamer для Android, чтобы увидеть как запустить код GStreamer на Android. По сути, вы можете запустить эту точную учебную программу на своем устройстве Android, просто вставив свой конвейер в вызов gst_parse_launch. Также не забудьте добавить ИНТЕРНЕТ разрешение на манифест Android, иначе ваша программа не сможет открыть сокет.

Единственное, что ваш конвейер использует GStreamer 1.0, а приведенный выше учебный пример SDK написан для GStreamer 0.10. Однако кросс-компиляцию GStreamer 1.0 SDK для Android с помощью системы сборки Cerbero довольно легко (я сделал это недавно и могу вам помочь). Или вы можете просто придерживаться версии 0.10 на Android и использовать предварительно созданные файлы SDK 0.10.

РЕДАКТИРОВАТЬ: Еще одна вещь - вам не нужны загрузчики RTP и GDP, только один. Один только RTP подходит для меня.

person Kevin Boos    schedule 31.07.2014

Компиляция gstreamer для Android иногда бывает сложной. Вы можете рассмотреть альтернативное решение для просмотра вашего конвейера на устройстве Android. Пример кода ниже открывает простой конвейер на основе videotestsrc:

Intent intent = new Intent("pl.effisoft.rpicamviewer2.PREVIEW");
int camera =0;

//--------- Basic settings
intent.putExtra("full_screen", true);
intent.putExtra("name"+camera, "My pipeline name");
intent.putExtra("host"+camera, "192.168.0.1");
intent.putExtra("port"+camera, 5000);
intent.putExtra("description"+camera, "My pipeline description");
intent.putExtra("uuid"+camera, UUID.randomUUID().toString() );
intent.putExtra("aspectRatio"+camera, 1.6);
intent.putExtra("autoplay"+camera, true);

//--------- Enable advanced mode
intent.putExtra("advanced"+camera, true);
intent.putExtra("custom_pipeline"+camera, "videotestsrc ! warptv ! autovideosink");

//--------- Enable application extra features
intent.putExtra("extraFeaturesEnabled"+camera, false);

//--------- Add autoaudiosink to featured pipeline
intent.putExtra("extraFeaturesSoundEnabled"+camera, false);

//--------- Scale Video Stream option
intent.putExtra("extraResizeVideoEnabled"+camera, false);


intent.setPackage("pl.effisoft.rpicamviewer2");
startActivityForResult(intent, 0);

Полный пример кода находится здесь: https://github.com/pzuk/raspberry-pi-camera-viewer-embedded-example

person zuko    schedule 23.07.2016

Вы можете найти возможное решение на форуме RTSP Streaming H264 .

Доступ к плате камеры rasperry можно получить через драйвер V4L2:

sudo modprobe bcm2835-v4l2

uv4l --driver raspicam --auto-video_nr

Далее вы можете найти простую реализацию потока стримера RTSP из источника H264 V4L2 gihub

person mpromonet    schedule 03.11.2014

У меня была аналогичная потребность, и после многих испытаний с vlc, gstreamer я решил использовать raspivid, nc (netcat) и следующее приложение для Android:

https://github.com/ShawnBaker/RPiCameraViewer

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

person weirdgyn    schedule 22.05.2020