Пример проекта для работы с Fly camera#

Для использования камеры предоставляется QML плагин.

Скачать можно по ссылке - fly-camera-demo.zip

Примечание

Классы FFVideoCapture и DeviceControl предоставляются библиотекой libffcamera.so из пакета fly-camera.

Эти классы могут быть импортированы в qml-файлах.

Проверка возможности работы камеры#

Установить пакеты v4l-utils, ffmpeg, gstreamer1.0-tools:

sudo apt install v4l-utils ffmpeg gstreamer1.0-tools

Устройства с архитектурой amd64#

Чтобы проверить возможность работы fly-camera нужно записать видео с помощью ffmpeg.

Примечание

Подробнее: https://trac.ffmpeg.org/wiki/Capture/Webcam#Linux.

  1. Вывести список камер:

v4l2-ctl --list-devices
  1. Вывести список поддерживаемых форматов для конкретной камеры:

ffmpeg -f v4l2 -list_formats all -i /dev/video2
  1. Вывести расширенную информацию о поддерживаемых форматах:

v4l2-ctl --list-formats-ext
  1. Записать видео с камеры (указав поддерживаемое разрешение, формат и частоту кадров):

ffmpeg -f v4l2 -framerate 25 -input_format mjpeg -video_size 640x480 -i /dev/video2 output.mkv

Если в результате выполнения команды был записан проигрываемый видео-файл output.mkv, то устройство и ОС готовы к работе с fly-camerafly-camera-demo).

Устройства с архитектурой arm64#

Чтобы проверить возможность работы fly-camera нужно записать видео с помощью gstreamer.

  1. Вывести список камер:

v4l2-ctl --list-devices
  1. Найти подходящие кодеки (начать поиск стоит с кодеков начинающихся на mpp):

gst-inspect-1.0 -a | grep ^mpp | grep Name

Если подходящие кодеки не найдены, то установить пакеты плагинов gstreamer с нужными кодеками (например gstreamer1.0-rockchip1).

Отдавать предпочтение нужно кодекам с аппаратным ускорением.

Если вы не можете найти нужный кодек, повторите поиск после выполнения команды:

rm -fr .cache/gstreamer-1.0

Записать видео с камеры (указав подходящий кодек, например, mpph264enc):

gst-launch-1.0 v4l2src device=/dev/video22 num-buffers=128 ! video/x-raw,framerate=30/1 ! mpph264enc ! filesink location=output.mkv

Если в результате выполнения команды был записан проигрываемый видео-файл output.mkv, то устройство и ОС готовы к работе с fly-camerafly-camera-demo).

Подготовка#

Перед использованием примера установите на устройство пакет fly-camera:

sudo apt install fly-camera

Для получения расширенного доступа к возможностям устройства, установите на устройство пакет libfly-camera-plugin:

sudo apt install libfly-camera-plugin

Примечание

Либо другой пакет, подходящий для конкретного устройства, например libfly-camera-plugin-kvadrat и т.д.).

Класс FFVideoCapture#

Класс используется для записи фото и видео, а так же как источник картинки для видоискателя.

Свойства#

Список свойств, которые могут быть вызваны из qml-файлов

Q_PROPERTY(QAbstractVideoSurface *videoSurface READ videoSurface WRITE setVideoSurface)

Q_PROPERTY(QUrl outputFile READ outputFile NOTIFY outputFileChanged)

Q_PROPERTY(QString videoInputDevice READ videoInputDevice WRITE setVideoInputDevice NOTIFY videoInputDeviceChanged)

Q_PROPERTY(QString audioInputDevice READ audioInputDevice WRITE setAudioInputDevice NOTIFY audioInputDeviceChanged)

Q_PROPERTY(qint64 duration READ duration NOTIFY durationChanged)

Q_PROPERTY(bool recording READ recording NOTIFY recordingChanged)

Q_PROPERTY(bool paused READ paused NOTIFY pausedChanged)

Q_PROPERTY(bool running READ running NOTIFY runningChanged)

Q_PROPERTY(int currentFrameRate READ currentFrameRate NOTIFY currentFrameRateChanged)

Q_PROPERTY(QSize imageResolution READ imageResolution WRITE setImageResolution NOTIFY imageResolutionChanged)

Q_PROPERTY(QSize videoResolution READ videoResolution WRITE setVideoResolution NOTIFY videoResolutionChanged)

Q_PROPERTY(int frameRate READ frameRate WRITE setFrameRate NOTIFY frameRateChanged)

Q_PROPERTY(QStringList supportedFrameRates READ supportedFrameRates NOTIFY supportedFrameRatesChanged)

Q_PROPERTY(int orientation READ orientation WRITE setOrientation NOTIFY orientationChanged)

Q_PROPERTY(bool invertVertically READ invertVertically WRITE setInvertVertically NOTIFY invertVerticallyChanged)

Q_PROPERTY(bool invertHorizontally READ invertHorizontally WRITE setInvertHorizontally NOTIFY invertHorizontallyChanged)

Q_PROPERTY(float aspectRatio READ aspectRatio WRITE setAspectRatio NOTIFY aspectRatioChanged)

Q_PROPERTY(bool vaapiEnabled READ vaapiEnabled WRITE setVaapiEnabled NOTIFY vaapiEnabledChanged)

Q_PROPERTY(QJSValue audioInputDevices READ audioInputDevices NOTIFY inputDevicesChanged)

Q_PROPERTY(QJSValue videoInputDevices READ videoInputDevices NOTIFY inputDevicesChanged)

Q_PROPERTY(QImage currentFrame READ currentFrame NOTIFY currentFrameChanged)

Методы#

Список функций, которые могут быть вызваны из qml-файлов:

  • Запуск видоискателя камеры (нужно выполнять при старте приложения и при изменении настроек) вместе c записью видео (если *record*=**true**):

    Q_INVOKABLE bool startCamera(bool record = false);

  • Завершение записи видео:

    Q_INVOKABLE void stop();

  • Пауза записи видео:

    Q_INVOKABLE void pause();

  • Сделать фотографию:

    Q_INVOKABLE void captureImage();

  • Возвращает список поддерживаемых разрешений экрана, но не более максимального разрешения (если задано):

    Q_INVOKABLE QStringList resolutions(const QSize &resolutionRestriction = QSize()) const;

Класс DeviceControl#

Класс используется для доступа к аппаратным возможностям устройств.

Аппаратные возможности у каждого устройства свои - их реализация предоставляется библиотеками в папке /usr/lib/x86_64-linux-gnu/fly-camera/plugins.

Примечание

Например, базовый функционал для устройств работающих с драйверами video4linux2, предоставляется библиотекой libfly-camera-plugin-v4l2.so из пакета libfly-camera-plugin.

Можно установить несколько пакетов с реализациями, при этом будет выбрана одна максимально подходящая для конкретного устройства.

Свойства#

Список свойств, которые могут быть вызваны из qml-файлов:

Q_PROPERTY(float brightness READ brightness WRITE setBrightness NOTIFY brightnessChanged)

Q_PROPERTY(bool autoFocus READ autoFocus WRITE setAutoFocus NOTIFY autoFocusChanged)

Q_PROPERTY(float focusPosition READ focusPosition WRITE setFocusPosition NOTIFY focusPositionChanged)

Q_PROPERTY(QPointF focusArea READ focusArea WRITE setFocusArea NOTIFY focusAreaChanged)

Q_PROPERTY(CameraPlugin::AreaFocus::Mode focusAreaMode READ focusAreaMode CONSTANT)

Q_PROPERTY(bool hasVaapiFeature READ hasVaapiFeature CONSTANT)

Q_PROPERTY(bool hasFocusFeature READ hasFocusFeature CONSTANT)

Q_PROPERTY(bool hasAutoFocusFeature READ hasAutoFocusFeature CONSTANT)

Q_PROPERTY(bool hasAreaFocusFeature READ hasAreaFocusFeature CONSTANT)

Q_PROPERTY(bool hasBrightnessFeature READ hasBrightnessFeature CONSTANT)

Q_PROPERTY(QSize frontCameraImageResolutionMax READ frontCameraImageResolutionMax CONSTANT)

Q_PROPERTY(QSize frontCameraVideoResolutionMax READ frontCameraVideoResolutionMax CONSTANT)

Q_PROPERTY(QSize backCameraImageResolutionMax READ backCameraImageResolutionMax CONSTANT)

Q_PROPERTY(QSize backCameraVideoResolutionMax READ backCameraVideoResolutionMax CONSTANT)

Методы#

Список функций, которые могут быть вызваны из qml-файлов:

Q_INVOKABLE void update();

Q_INVOKABLE void setDevice(const QString &device);

Q_INVOKABLE void setFrame(const QImage &frame);

Сборка#

Настройте chroot, войдите в него, установите необходимые зависимости и в каталоге fly-camera-demo выполните команду:

dpkg-buildpackage -us -uc -ui -j$(nproc)

В результате получится пакет fly-camera-demo.

Примечание

Например: fly-camera-demo_1.0.0_arm64.deb.

Установка#

Скопируйте пакет на устройство и установите его.

Для этого можно использовать команду dpkg.

Примечание

Например:

sudo dpkg -i fly-camera-demo_1.0.0_arm64.deb

Запуск#

Перед запуском программы задайте параметры camera, front_face_id и display_name_list в файле /etc/xdg/rusbitech/fly-camera-demo.conf.

Например:

camera=/dev/video33
front_face_id=/dev/video42
display_name_list=/dev/video42:Selfie Camera, /dev/video33:Main Camera

Примечание

Как определить камеры смотри раздел Проверка возможности работы камеры.