Пример проекта для работы с 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.
Вывести список камер:
v4l2-ctl --list-devices
Вывести список поддерживаемых форматов для конкретной камеры:
ffmpeg -f v4l2 -list_formats all -i /dev/video2
Вывести расширенную информацию о поддерживаемых форматах:
v4l2-ctl --list-formats-ext
Записать видео с камеры (указав поддерживаемое разрешение, формат и частоту кадров):
ffmpeg -f v4l2 -framerate 25 -input_format mjpeg -video_size 640x480 -i /dev/video2 output.mkv
Если в результате выполнения команды был записан проигрываемый видео-файл output.mkv, то устройство и ОС готовы к работе с fly-camera (и fly-camera-demo).
Устройства с архитектурой arm64#
Чтобы проверить возможность работы fly-camera нужно записать видео с помощью gstreamer.
Вывести список камер:
v4l2-ctl --list-devices
Найти подходящие кодеки (начать поиск стоит с кодеков начинающихся на
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-camera (и fly-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
Примечание
Как определить камеры смотри раздел Проверка возможности работы камеры.