Оглавление:
- Шаг 1: GStreamer на Raspbian
- Шаг 2: Android. Введение. Создание Приложения С NDK, JNI, Компиляция Ndk-build
- Шаг 3: Прикручиваем GStreamer
- Шаг 4: Конвейер GStreamer В Коде *.c Android Studio
Видео: GStreamer И Android (GStreamer Android Studio Windows): 4 шага
2024 Автор: John Day | [email protected]. Последнее изменение: 2024-01-30 11:48
Версия библиотек GStreamer:
- на RPi 3B (Raspberry OS Buster) 1.14.4,
- на Android 1.18.3.
Версия Android Studio 4.1.2, ОС Windows 7 x86-64.
Шаг 1: GStreamer на Raspbian
Установка gstreamer (https://gstreamer.freedesktop.org/documentation/installing/index.html) на Raspberry Pi:
- выполняем команду «aptitude search gstreamer1.0» она выведет доступные к установке пакеты;
- необходимо как минимум установить следующие пакеты: «gstreamer1.0-tools», «gstreamer1.0-plugins-good», «gstreamer1.0-plugins-good-doc», «gstreamer1.0-plugins-base», «gstreamer1. 0-doc »,« libgstreamer1.0-0 »,« gstreamer1.0-rtsp »,« libgstreamer-plugins-base1.0-dev »,« gstreamer1.0-plugins-base-apps »,« gstreamer1.0- плагины-плохие »и все зависимости. Команда будет «sudo apt-get install gstreamer1.0-tools gstreamer1.0-plugins-good gstreamer1.0-plugins-good-doc gstreamer1.0-plugins-base gstreamer1.0-doc libgstreamer1.0-0 gstreamer1.0- rtsp libgstreamer-plugins-base1.0-dev gstreamer1.0-plugins-base-apps gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly »;
- для включения gstreamer в код, необходимо включить «#include», при компиляции программы добавить «` pkg-config --cflags --libs gstreamer-1.0` », получится так« gcc `pkg-config --cflags --libs gstreamer -1.0` basic-tutorial-1.c -o basic-tutorial-1 »;
- для получения исходников примеров gstreamer можно выполнить команду «git clone
Для получения изображения с помощью RPI через gstreamer по сети с использованием плагина udpsink для использования в камере необходимо выполнить команду:
- для камеры RPi: «raspivid -t 999999 -h 1080 -w 1920 -fps 25 -hf -vf -b 6000000 -o - | gst-launch-1.0 -v fdsrc! h264parse! rtph264pay config-interval = 1 pt = 96! udpsink host = 192.168.1.223 порт = 5000 »;
- для USB-камеры MJPEG: «gst-launch-1.0 v4l2src device = / dev / video0 do-timestamp = true! изображение / JPEG, ширина = 1920, высота = 1080, частота кадров = 30/1! avdec_mjpeg! omxh264enc control-rate = 1 target-bitrate = 8000000! h264parse! rtph264pay config-interval = 1 pt = 96! udpsink host = 192.168.1.223 port = 5000 »,
где host - ip-адрес получателя потока (смартфон на андроид), что делает каждый плагин (fdsrc, h264parse, rtph264pay,…). и т.д.
Для получения видео потока на винде (после установки gstreamer) в сети с использованием плагина udpsrc необходимо в консоли получить команду: «c: / gstreamer / 1.0 / msvc_x86_64 / bin / gst-launch-1.0 -v udpsrc port = 5000! application / x-rtp, имя-кодировки = H264! rtph264depay! avdec_h264! видеоконвертировать! autovideosink sync = false »(у меня Windows 7 64 бит, GStreamer установлен в« c: / gstreamer / »).
Забегая вперёд скажу что для Samsung S7 получение видео потока на android (конвейер с использованием udpsrc) «udpsrc port = 5000! application / x-rtp, имя-кодировки = H264! rtph264depay! h264parse! amcviddec-omxexynosavcdec! видеоконвертировать! автовидеосонок ».
Шаг 2: Android. Введение. Создание Приложения С NDK, JNI, Компиляция Ndk-build
Для начала нужно, чтобы нормально создавалось приложение с NDK, JNI с компиляцией с помощью ndk-build (https://developer.android.com/ndk/guides,
- устанавливаем в Windows переменную среду «GSTREAMER_ROOT_ANDROID», значение - путь до каталога с распакованными (установленными) библиотеками gstreamer (предварительно созданная) https://gstreamer.freedesktop.org/data/pkg/android/1.18.3/ (в моём случае это « C: / gstreamer », последний слэш ставить не нужно);
- устанавливаем NDK, CMake, LLDB (тут только галочки расставить);
- создаём новое приложение с типом «Native C ++» (самый низ списка), дожидаемся пока все процессы завершатся;
- в левом окне выбираем вид «Project» (выпадающий список в левом верхнем углу), раскрываем ветку в каталог «app», нажимаем по «app» правой клавишей мыши и выбираем пункт меню «New-> Folder-> JNI Folder», в появившемся окне ставим галочку «Изменить расположение папки», в появившейся строке «Новое расположение папки» оставляем строку «jni /», нажимаем кнопку «Готово», в каталоге «app» появится элемент «jni»;
- жмём правой клавишей мыши по элементу «jni», выбираем пункт меню «New-> C / C ++ Source File», в появившемся окне выбираем расширение файла, и вводим название (если пока ничего не планируется то можно, например дать имя «dummy»), нажимаем кнопку «ОК» и будет создан файл;
- жмём правой клавишей мыши по элементу «jni», выбираем пункт меню «New-> File», в появившемся окне вводим имя «Android.mk», минимальное содержимое, если вы создали «dummy.c» может быть таким:
LOCAL_PATH: = $ (вызвать my-dir)
включить $ (CLEAR_VARS) LOCAL_MODULE: = фиктивный LOCAL_SRC_FILES: = dummy.c включить $ (BUILD_SHARED_LIBRARY)
жмём правой клавишей мыши по элементу «jni», выбираем пункт меню «New-> File», в появившемся окне вводим имя «Application.mk», минимальное содержимое может быть таким:
APP_ABI: = все
теперь в левом окне выбираем вид «Android» (выпадающий список в левом верхнем углу), раскрываем ветку «Gradle Scripts» и открываем файл «build.gradle Module: app», в файле удаляем оба включения таких строк:
ExternalNativeBuild {
CMake…}
- сохраняемся и жмём «синхронизация градиента» в верхнем процессе завершится, ждём когда будет завершено;
- после всех этих процедур нам нужно нажать правой клавишей мыши на элемент «приложение» и наконец то в меню появится нужный нам пункт меню «Связать проект C ++ с Gradle», нажимаем на.
- Появится окно, в нём в списке «Build System» вместо «CMake» нужно в списке выбрать «ndk-build», после чего в «Project Path» указать путь до файла «Android.mk» (в окне выбора файла нажимаем комбинацию клавиш « Ctrl + 2 », разворачиваем каталог проекта, далее« app / jni », выбираем созданный файл« Android.mk », нажимаем« ОК »), ждём пока завершится процесс запуска, либо инициируем его« File-> Sync Project with Gradle Files » ».
- В нашем дереве, в каталоге «cpp» появились добавленные файлы, но самое главное - это то, что теперь проект нормально соберётся, если у Вас в коде ошибок нет (урок для начинающих: https://developer.android.com/ndk / samples / sample_hellojni # java).
Шаг 3: Прикручиваем GStreamer
Процесс прикручивания библиотеки gstreamer (версия библиотек 1.18.3, версия Android Studio 4.1.2):
- Создаём проект с NDK, JNI, компиляция ndk-build (Шаг 2).
- Содержимое «Android.mk» взято из «tutorial_1» примеров gstreamer и модифицировано, я распаковал библиотеки для андроид в каталог «C: / gstreamer \», файл на языке си я назвал (и ранее добавил в папку «jni» проекта) «gst_tut_01.c », которая будет собрана из этого файла, я назвал« gst_tut_01 »(сам файл библиотеки, соответственно будет называться« libgst_tut_01.so »).
LOCAL_PATH: = $ (вызвать my-dir)
включают в себя $ (CLEAR_VARS) LOCAL_MODULE: = gst_tut_01 LOCAL_SRC_FILES: = gst_tut_01.c LOCAL_SHARED_LIBRARIES: = gstreamer_android LOCAL_LDLIBS: = -llog включают $ (BUILD_SHARED_LIBRARY) ifeq ($ (TARGET_ARCH_ABI), armeabi-v7a) GSTREAMER_ROOT: = C: / GStreamer / ARMv7 GSTREAMER_NDK_BUILD_PATH: = C: / gstreamer / armv7 / share / gst-android / ndk-build / else ifeq ($ (TARGET_ARCH_ABI), arm64-v8a) GSTREAMER_ROOT: = C: / gstreamer / arm64 GSTREAMER_NDK_BUILD_PATH: = C: share / gst-android / ndk-build / else ifeq ($ (TARGET_ARCH_ABI), x86) GSTREAMER_ROOT: = C: / gstreamer / x86 GSTREAMER_NDK_BUILD_PATH: = C: / gstreamer / x86 / share / gst-build-else / ndq ($ (TARGET_ARCH_ABI), x86_64) GSTREAMER_ROOT: = C: / gstreamer / x86_64 GSTREAMER_NDK_BUILD_PATH: = C: / gstreamer / x86_64 / share / gst-android / ndk-build / endif GSTREAMER_STREAMER_STREAMER_STREAMER: GSTREAMER_NDK_BUILD_PATH) /gstreamer-1.0.mk
Обращаю внимание, что в «Android.mk», не зависимо от платформы (Windows, Linux), путь прописывается через «/».
Нужно создать блок «externalNativeBuild {…}» в файле «build.gradle Module: app» в ветке «defaultConfig» (показано с начала блока, чтобы было видно куда вставлять)
defaultConfig {
applicationId "com.example.test_gst_01" minSdkVersion 23 targetSdkVersion 28 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner. AndroidJUnitRunner" externalNativeBuild {ndkBuild {defRootAndroid) проект if (проект).gstAndroidRoot else gstRoot = System.env. GSTREAMER_ROOT_ANDROID аргументы "NDK_APPLICATION_MK = jni / Application.mk", "GSTREAMER_JAVA_SRC_DIR = src", "GSTREAMER_ROOT_Root_DIR =" src "," GSTREAMER_ROOT_ANDROID_CAD_GSTREAMER_ROOT_ANDROID_GST_GSTREAMER_ROOT_ANDROID_GST_GST_GST_ROOT_ASS01 " MIPS и MIPS64 поддерживаются abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'}}}
Остальные настройки по этому описанию: https://stackoverflow.com/questions/45044210/gstreamer-examples-in-android-studio. Если резюмировать, то получится так:
- создаём код на си;
- оказывается в общем случае android studio не всегда нормально по умолчанию прилинковывает библиотеку «libc ++ _ shared.so», поэтому лучше если в вашем «Android.mk» вместо строки «LOCAL_SHARED_LIBRARIES: = gstreamer_android» будет «LOCAL_SHARED_LIBRARIES: = gstreamer_android c ++ _ shared », В Android Studio 3.5.1 также в файле« Application.mk »строчку« APP_STL: = c ++ _ shared »;
- перед тем как начать писать код на Java, для исключения проблем с импортом «org.freedesktop.gstreamer. GStreamer» из каталога с распакованными созданными собранными библиотеками (у меня это «C: / gstreamer / arm64 / share / gst-build / ») Скопировать файл« GStreamer.java »(эти файлы на всех архитектурах одинаковые) и вставить его в проект в пакет« org.freedesktop.gstreamer », в свою очередь для этого в студии Android необходимо переключить вид дерева проектов на« Android », кликаем правой клавишей мыши на элемент «java» и выбираем пункт меню «New-> Package», появляется диалог «Choose Destination Directory», выбираем «… / app / src / main / java», жмём «ОК», появится диалог « Новый пакет », в строке ввода нужно ввести« org.freedesktop.gstreamer », в дереве новый элемент, теперь нажмите правой клавишей по новому элементу и выберите пункт меню« Вставить ». В файле «GStreamer.java», чтобы их исправить нужно удалить все слова вида «@… что то написано… @»;
- если планируется использование плагина androidmedia (это почти 100%), то необходимо из каталога с распакованными созданными собранными библиотеками (у меня это «C: / gstreamer / arm64 / share / gst-android / ndk-build \»)). »(В нём 3 файла.java) и вставить его в пакет« org.freedesktop.gstreamer »;
- в процессе создания кода на «си» студия Android будет ругаться, что не может найти «#include», иногда это решается выполнить команду «File-> Invalidate Caches / Restart», достаточно сделать один раз, позже он всё равно будет ругаться на этом «#include» но сборка будет проходить нормально (в общем случае достаточно 1 раз сделать, после чего забить на ругань android studio на методы из «gst / gst.h»);
- если сборка заканчивается ошибкой, например «android studio gstreamer make: *** Нет правила для создания целевого объекта tutorial_02.c, необходимого для tutorial_02.o», то просто внимательно проверьте ваш «Android.mk» скорее всего в нём лишний символ (в конце строк не должно быть пробелов);
- Рекомендую ознакомиться с этой статьёй: https://habr.com/ru/post/270479/, в ней приводятся «Методы лечения различных ошибок в Android Studio при разработке проекта».
Шаг 4: Конвейер GStreamer В Коде *.c Android Studio
Итак, GStreamer вроде заработал, по крайней мере работают tutorial_1… tutorial_3 из документации «GStreamer Android Tutorials» (не смотря на то, что в смартфоне они запустились, мой вариант, основанный на tutorial_3 в эмуляторе вылетает).
Но вот с конвейером беда, в соответствии с этой информацией: https://gstreamer.freedesktop.org/documentation/installing/for-android-development.html#using-androidstudio в андроиде есть свой декодер видео, называется он «androidmedia» и находится в категории «GSTREAMER_PLUGINS: = $ (GSTREAMER_PLUGINS_CODECS)», такой плагин в библиотеке 1.15.2 GStreamer для Android Studio есть, но приложение будет ругаться что найти его (androidmedia) не может. по другому (https://www.ohandroid.com/67892.html), а именно (в моём случае для телефона Samsung S7) «amcviddec-omxexynosavcdec», где префикс «amcviddec-» всегда один и тот же (для всех телефонов), а вот наименование второй части можно составить из информации в файле «/etc/media_codecs.xml» (файл находится в смартфоне, я смотрел с помощью Total Commander), в частности для моего телефона в файле сохраняющейся записи «<MediaCodec name =”OMX. Exynos.avc.dec” type =”video / avc”> », (avc - это кодек h264, для кодека h265 будет hevc, а для h263 - h263) соответственно убирая из имени кодека точки и записывая всё маленькими буквами получаем «omxexynosavcdec», вот теперь мы и определились с именем плагина - декодера «amcviddec-omxexynosavcdec».
Далее необходимо установить права в манифесте приложения:
Плагины в «Android.mk»:
LOCAL_PATH: = $ (вызвать my-dir)
включают в себя $ (CLEAR_VARS) LOCAL_MODULE: = gstvideoget LOCAL_SRC_FILES: = gstvideoget.c LOCAL_SHARED_LIBRARIES: = gstreamer_android C ++ _ общие LOCAL_LDLIBS: = -llog -landroid включают $ (BUILD_SHARED_LIBRARY) IfNDef GSTREAMER_ROOT_ANDROID $ (! ошибка GSTREAMER_ROOT_ANDROID не определен) ENDIF ifeq ($ (TARGET_ARCH_ABI), armeabi-v7a) GSTREAMER_ROOT: = $ (GSTREAMER_ROOT_ANDROID) / armv7 else ifeq ($ (TARGET_ARCH_ABI), arm64-v8a) GSTREAMER_ROOT: = $ (GSTREAMER_ROOT) (GSTREAMER_ROOT): = $ (GSTREAMER_ROOT): = $ (GSTREAM_ROOT): = $ (GSTREAM_ROOT): = $ (GSTREAM_ROOT): = $ (GSTREAM_86) = $ (GSTREAMER_ROOT_ANDROID) / x86 else ifeq ($ (TARGET_ARCH_ABI), x86_64) GSTREAMER_ROOT: = $ (GSTREAMER_ROOT_ANDROID) / x86_64 else $ (ошибка Целевая арка ABI (GSTREAMER_ROOT_ANDROID) / x86_64 else $ (ошибка Целевая арка ABI (GSTREAMER_ROOT_ANDROID): доля / GST-андроида / NDK-сборки включают $ (GSTREAMER_NDK_BUILD_PATH) /plugins.mk GSTREAMER_PLUGINS: = $ (GSTREAMER_PLUGINS_CORE) $ (GSTREAMER_PLUGINS_PLAYBACK) $ (GSTREAMER_PLUGINS_CODECS) $ (GSTREAMER_PLUGINS_NET) $ (GSTREAMER_PLUGINS_SYS) $ (GSTREAMER_PL UGINS_CODECS_RESTRICTED) $ (GSTREAMER_CODECS_GPL) $ (GSTREAMER_PLUGINS_ENCODING) $ (GSTREAMER_PLUGINS_VIS) $ (GSTREAMER_PLUGINS_EFFECTS) $ (GSTREAMER_PLUGINS_NET_RESTRICTED) GSTREAMER_EXTRA_DEPS: = GStreamer-проигрыватель-1,0 GStreamer-видео-1,0-бойкий 2.0 включает $ (GSTREAMER_NDK_BUILD_PATH) /gstreamer-1.0.mk
Содержимое «Application.mk» (https://developer.android.com/ndk/guides/cpp-support):
APP_ABI: = allAPP_STL: = c ++ _ общий
Послесловие: возможно плагинов слишком много (при компиляции размер папок проекта вырастает до 1, 9 Гбайт), но у меня конвейер не стартует при другом раскладе, может у вас некоторые плагины с помощью не нужны - надо тестировать.
Рекомендуемые:
Загрузка и использование Android Studio с Kotlin: 4 шага
Загрузка и использование Android Studio с Kotlin: Привет, я надеюсь, что у вас все хорошо во время этой пандемии. В этом руководстве я научу вас, как загрузить Android Studio и запустить ваше первое приложение с помощью Kotlin. В конце этого руководства вы узнаете, как загрузить и создать простое приложение с помощью Andro
Создание переносного трекера движения (BLE от Arduino до пользовательского приложения Android Studio): 4 шага
Создайте носимый трекер движения (BLE от Arduino до пользовательского приложения Android Studio): Bluetooth Low Energy (BLE) - это форма связи Bluetooth с низким энергопотреблением. Носимые устройства, такие как умная одежда, которую я помогаю создавать в Predictive Wear, должны по возможности ограничивать потребление энергии, чтобы продлить срок службы батареи, и часто используют BLE
Как создать приложение для Android с помощью Android Studio: 8 шагов (с изображениями)
Как создать приложение для Android с помощью Android Studio: это руководство научит вас основам создания приложения для Android с помощью среды разработки Android Studio. По мере того как устройства Android становятся все более распространенными, спрос на новые приложения будет только расти. Android Studio проста в использовании (
Мгновенное спасение внеэкранной Windows (Windows и Linux): 4 шага
Мгновенное спасение за пределами экрана Windows (Windows и Linux): когда программа перемещается за пределы экрана - возможно, на второй монитор, который больше не подключен, - вам нужен быстрый и простой способ переместить ее на текущий монитор. Это то, что я делаю -ПРИМЕЧАНИЕ --- Я размыл изображения для конфиденциальности
Учебники по Windows, эпизод 1 - Эмуляция оконных рамок Windows Aero: 3 шага
Учебные пособия по Windows, эпизод 1 - Эмуляция оконных рамок Windows Aero: последнее обновление 17 декабря 2009 г. Это руководство по Windows даст вам пошаговое руководство по эмуляции оконных рамок Windows Aero в ОС Windows ниже Vista ИЛИ вы можете использовать это руководство для эмулировать Windows Aero на машинах с inc