Потоковая передача 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), другой способ потоковой передачи и т. д.

4 ответов


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

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


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

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

EDIT: еще одна вещь - вам не нужен как RTP payloader, так и GDP payloader, только один. Только RTP хорошо работает для меня.


компиляция 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


Вы можете найти возможное решение с форума протоколом RTSP потоковый кодек H264.

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

sudo modprobe bcm2835-v4l2

uv4l --driver raspicam --auto-video_nr

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