1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/openharmony-multimedia_camera_framework

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
README_zh.md 21 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Отправлено 02.03.2025 22:11 d75a8f2

Камера компонент

Обзор

Компонент камеры поддерживает разработку бизнеса с использованием камеры. Разработчики могут использовать открытые интерфейсы для доступа к аппаратной части камеры, её управления и создания новых функций. Самыми распространенными операциями являются просмотр, фотографирование и видеозапись.

Основные понятия

  • Фотография

    Эта функция предназначена для съёмки и получения фотографий.

  • Просмотр

    Эта функция позволяет после запуска камеры повторно получать кадры видео в буферной области. Поддерживается предварительный просмотр кадров перед фотографированием или видеозаписью.

  • Видеозапись

    Эта функция предназначена для получения кадров видео в буферной области во время записи видео до его завершения.

Рисунок 1 Архитектурная диаграмма компонента камеры

Архитектурная диаграмма компонента камеры

Содержание

Структура каталога хранилищ следующая:

/foundation/multimedia/camera_framework   # Бизнес-код компонента камеры
├── frameworks                           # Код фреймворков
│   ├── native                           # Реализация внутренних интерфейсов
│   │   ├── camera                       # Реализация фреймворка камеры
│   │   └── metadata                     # Реализация метаданных
│   └── js                               # Реализация внешних интерфейсов
│       └── camera_napi                  # Реализация NAPI камеры
├── interfaces                           # Интерфейсы
│   ├── inner_api                        # Внутренние интерфейсы
│   └── kits                             # Внешние интерфейсы
├── LICENSE                              # Лицензионные соглашения
├── ohos.build                           # Файлы сборки
├── sa_profile                           # Профили сервисов
└── services                             # Сервисные коды
    ├── camera_service                   # Реализация сервиса камеры
    └── etc                              # Конфигурационные файлы сервиса камеры

Инструкция использования

Фотография

Шаги для фотографирования:

  1. Создайте слушатель конечного потребителя буфера (CaptureSurfaceListener) для сохранения изображения.

    class CaptureSurfaceListener : public IBufferConsumerListener {
    public:
        int32_t mode_;
        sptr<Surface> surface_;
    
        void OnBufferAvailable() override
        {
            int32_t flushFence = 0;
            int64_t timestamp = 0;
            OHOS::Rect damage; // инициализируйте повреждение
    
            OHOS::sptr<OHOS::SurfaceBuffer> buffer = nullptr;
            surface_->AcquireBuffer(buffer, flushFence, timestamp, damage);
            if (buffer != nullptr) {
                void* addr = buffer->GetVirAddr();
                int32_t size = buffer->GetSize();
    
                // Сохраните буфер (addr) в файл.
    
                surface_->ReleaseBuffer(buffer, -1);
            }
        }
    };
  2. Получите экземпляр менеджера камер и список объектов камер.

    sptr<CameraManager> camManagerObj = CameraManager::GetInstance();
    std::vector<sptr<CameraInfo>> cameraObjList = camManagerObj->GetCameras();
  3. Используйте объект камеры для создания входа камеры для открытия камеры.

    sptr<CaptureInput> cameraInput = camManagerObj->CreateCameraInput(cameraObjList[0]);
  4. Создайте сессию захвата.

    sptr<CaptureSession> captureSession = camManagerObj->CreateCaptureSession();
  5. Начните настройку сессии захвата.

    int32_t result = captureSession->BeginConfig();
  6. Добавьте вход камеры в сессию захвата.

    result = captureSession->AddInput(cameraInput);
  7. Создайте поверхность потребителя и зарегистрируйте слушатель для отслеживания обновлений буфера. Ширина и высота фотографии можно настроить на поддерживаемое разрешение 1280x960.

    sptr<Surface> photoSurface = Surface::CreateSurfaceAsConsumer();
    int32_t photoWidth = 1280;
    int32_t photoHeight = 960;
    photoSurface->SetDefaultWidthAndHeight(photoWidth, photoHeight);
    photoSurface->SetUserData(CameraManager::surfaceFormat, std::to_string(OHOS_CAMERA_FORMAT_JPEG));
    sptr<CaptureSurfaceListener> capturelistener = new(std::nothrow) CaptureSurfaceListener();
    capturelistener->mode_ = MODE_PHOTO;
    capturelistener->surface_ = photoSurface;
    photoSurface->RegisterConsumerListener((sptr<IBufferConsumerListener> &)capturelistener);
  8. Используйте созданную поверхность для создания выхода фотографии.

    sptr<CaptureOutput> photoOutput = camManagerObj->CreatePhotoOutput(photoSurface);
  9. Добавьте выход фотографии в сессию захвата.

    result = captureSession->AddOutput(photoOutput);
  10. Примите настройки в сессии захвата.

    result = captureSession->CommitConfig();
  11. Выполните фотографию.

    result = ((sptr<PhotoOutput> &)photoOutput)->Capture();
  12. Освободите ресурсы сессии захвата.

    captureSession->Release();
  13. Освободите вход камеры для закрытия камеры.

    cameraInput->Release();

Начало и завершение просмотра

Шаги для начала и завершения просмотра:

  1. Получите экземпляр менеджера камер и список объектов камер.

    sptr<CameraManager> camManagerObj = CameraManager::GetInstance();
    std::vector<sptr<CameraInfo>> cameraObjList = camManagerObj->GetCameras();
  2. Используйте объект камеры для создания входа камеры для открытия камеры.

    sptr<CaptureInput> cameraInput = camManagerObj->CreateCameraInput(cameraObjList[0]);
  3. Создайте сессию захвата.

    sptr<CaptureSession> captureSession = camManagerObj->CreateCaptureSession();
  4. Начните настройку сессии захвата.

    int32_t result = captureSession->BeginConfig();
    ```6. Используйте поверхность, полученную из менеджера окон, чтобы создать выход просмотра для отрисовки на экране. Ширина и высота просмотра можно настроить на поддерживаемое разрешение 640x480 или 832x480. Если требуется сохранить в файл, используйте шаги, указанные для фотографии, чтобы создать поверхность, зарегистрировать слушатель для отслеживания обновлений буфера.
    ```cpp
    int32_t previewWidth = 640;
    int32_t previewHeight = 480;
    previewSurface->SetUserData(CameraManager::surfaceFormat, std::to_string(OHOS_CAMERA_FORMAT_YCRCB_420_SP));
    sptr<CaptureOutput> previewOutput = camManagerObj->CreateCustomPreviewOutput(previewSurface, previewWidth, previewHeight);
  5. Добавьте выход просмотра в сессию захвата.

    result = captureSession->AddOutput(previewOutput);
  6. Примите настройки в сессии захвата.

    result = captureSession->CommitConfig();
  7. Начните просмотр.

    result = captureSession->Start();
  8. При необходимости завершите просмотр.

    result = captureSession->Stop();
  9. Освободите ресурсы сессии захвата.

    captureSession->Release();
  10. Освободите вход камеры для закрытия камеры.

    cameraInput->Release();

Видеозапись

Шаги для видеозаписи:

  1. Получите экземпляр менеджера камер и список объектов камер.

    sptr<CameraManager> camManagerObj = CameraManager::GetInstance();
    std::vector<sptr<CameraInfo>> cameraObjList = camManagerObj->GetCameras();
  2. Используйте объект камеры для создания входа камеры для открытия камеры.

    sptr<CaptureInput> cameraInput = camManagerObj->CreateCameraInput(cameraObjList[0]);
  3. Создайте сессию захвата.

    sptr<CaptureSession> captureSession = camManagerObj->CreateCaptureSession();
  4. Начните настройку сессии захвата.

    int32_t result = captureSession->BeginConfig();
  5. Добавьте вход камеры в сессию захвата.

    result = captureSession->AddInput(cameraInput);
  6. Используйте поверхность для создания выхода видео, который будет объединяться с аудио и сохраняться в файл. Поверхность получается через Recorder. Если требуется сохранить данные видео-буфера в файл, используйте шаги, указанные для фотографии, чтобы создать поверхность, зарегистрировать слушатель для отслеживания обновлений буфера. Разрешение видео можно настроить внутри Recorder на поддерживаемое разрешение 1280x720 или 640x360.

    videoSurface->SetUserData(CameraManager::surfaceFormat, std::to_string(OHOS_CAMERA_FORMAT_YCRCB_420_SP));
    sptr<CaptureOutput> videoOutput = camManagerObj->CreateVideoOutput(videoSurface);
  7. Добавьте выход видео в сессию захвата.

    result = captureSession->AddOutput(videoOutput);
  8. Примите настройки в сессии захвата.

    result = captureSession->CommitConfig();
  9. Начните запись видео.

    result = ((sptr<VideoOutput> &)videoOutput)->Start();
  10. При необходимости завершите запись.

    result = ((sptr<VideoOutput> &)videoOutput)->Stop();
  11. Освободите ресурсы сессии захвата.

    captureSession->Release();
  12. Освободите вход камеры для закрытия камеры.

    cameraInput->Release();

Переключение нескольких устройств камеры

Далее приведена демонстрация того, как переключаться между несколькими устройствами камеры. Вначале в сессии захвата имеется одно видеоустройство вывода (video output). Если пользователь хочет переключиться на другую камеру, существующие устройства входа и выхода должны быть удалены и заменены новыми устройствами входа и выхода (в данном примере используется фотоустройство вывода).

  1. Получите экземпляр менеджера камер и список объектов камер.

    sptr<CameraManager> camManagerObj = CameraManager::GetInstance();
    std::vector<sptr<CameraInfo>> cameraObjList = camManagerObj->GetCameras();
  2. Создайте устройство входа камеры с использованием объекта камеры.

    sptr<CaptureInput> cameraInput = camManagerObj->CreateCameraInput(cameraObjList[0]);
  3. Создайте сессию захвата.

    sptr<CaptureSession> captureSession = camManagerObj->CreateCaptureSession();
  4. Начните конфигурацию сессии захвата.

    int32_t result = captureSession->BeginConfig();
  5. Добавьте устройство входа камеры в сессию захвата.

    result = captureSession->AddInput(cameraInput);
  6. Создайте видеоустройство вывода через Surface.

    sptr<CaptureOutput> videoOutput = camManagerObj->CreateVideoOutput(videoSurface);
  7. Добавьте видеоустройство вывода в сессию захвата.

    result = captureSession->AddOutput(videoOutput);
  8. Подтвердите конфигурацию сессии захвата.

    result = captureSession->CommitConfig();
  9. Начните запись видео.

    result = ((sptr<VideoOutput> &)videoOutput)->Start();
  10. Остановите запись при необходимости.

    result = ((sptr<VideoOutput> &)videoOutput)->Stop();
  11. Переопределите конфигурацию сессии и удалите устройства входа и выхода.

    int32_t result = captureSession->BeginConfig();
  12. Удалите устройство входа камеры из нового конфигурационного файла сессии.

    int32_t result = captureSession->RemoveInput(cameraInput);
  13. Удалите устройство выхода камеры.

    int32_t result = captureSession->RemoveOutput(videoOutput);
  14. Создайте новое устройство входа камеры и добавьте его в сессию захвата.

    sptr<CaptureInput> cameraInput2 = camManagerObj->CreateCameraInput(cameraObjList[1]);
    result = captureSession->AddInput(cameraInput2);
  15. Создайте устройство вывода фотографий. После успешного создания добавьте устройство вывода фотографий в сессию захвата. Создайте поверхность потребителя и зарегистрируйте слушатель для отслеживания обновлений буферов нового устройства вывода фотографий. Эта поверхность используется для нового устройства вывода фотографий.

    // Получите поверхность
    sptr<Surface> photoSurface = Surface::CreateSurfaceAsConsumer();
    int32_t photoWidth = 1280;
    int32_t photoHeight = 960;
    photoSurface->SetDefaultWidthAndHeight(photoWidth, photoHeight);
    photoSurface->SetUserData(CameraManager::surfaceFormat, std::to_string(OHOS_CAMERA_FORMAT_JPEG));
    sptr<CaptureSurfaceListener> capturelistener = new(std::nothrow) CaptureSurfaceListener();
    capturelistener->mode_ = MODE_PHOTO;
    capturelistener->surface_ = photoSurface;
    photoSurface->RegisterConsumerListener((sptr<IBufferConsumerListener> &)capturelistener);
    
    // Создайте устройство вывода фотографий
    sptr<CaptureOutput> photoOutput = camManagerObj->CreatePhotoOutput(photoSurface);
    
    // Добавьте устройство вывода в сессию захвата
    result = captureSession->AddOutput(photoOutput);
  16. Подтвердите конфигурацию сессии захвата.

    result = captureSession->CommitConfig();
  17. Освободите устройство входа камеры, которое было удалено из сессии.

    cameraInput->Release();
    ```18. Сделайте фотографию.
    
    
    ```cpp
    result = ((sptr<PhotoOutput>&) photoOutput)->Capture();
  18. Освободите ресурсы сессии захвата.

    captureSession->Release();
  19. Освободите устройство входа камеры, чтобы закрыть камеру.

    cameraInput2->Release();

Настройка вспышки

Перед фотографированием и видеозаписью можно установить вспышку в устройстве входа камеры.

  1. Установите вспышку во время фотографирования.

    cameraInput->LockForControl();
    cameraInput->SetFlashMode(OHOS_CAMERA_FLASH_MODE_OPEN);
    cameraInput->UnlockForControl();
  2. Установите вспышку во время видеозаписи.

    cameraInput->LockForControl();
    cameraInput->SetFlashMode(OHOS_CAMERA_FLASH_MODE_ALWAYS_OPEN);
    cameraInput->UnlockForControl();
  3. Отключите вспышку.

    cameraInput->LockForControl();
    cameraInput->SetFlashMode(OHOS_CAMERA_FLASH_MODE_CLOSE);
    cameraInput->UnlockForControl();

Связанные репозитории

multimedia_camera_framework

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/openharmony-multimedia_camera_framework.git
git@api.gitlife.ru:oschina-mirror/openharmony-multimedia_camera_framework.git
oschina-mirror
openharmony-multimedia_camera_framework
openharmony-multimedia_camera_framework
master