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

OSCHINA-MIRROR/openharmony-multimedia_camera_framework

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

Камера

Введение

Репозиторий camera_standard позволяет вашему приложению предоставлять функции камеры. Вы можете получить доступ к устройству камеры и развивать новые функции через открытые API. Общие операции включают просмотр, съемку фото и запись видео.

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

  • Съемка фотографии

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

  • Превью

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

  • Запись видео

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

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

Архитектура камеры

Структура директорий

Структура директория репозитория следующая:

/foundation/multimedia/camera_framework  # Код камеры
├── frameworks                          # Код фреймворка
│   ├── native                          # Внутренняя реализация Native API
│   │   ├── camera                      # Реализация фреймворка камеры
│   │   └── metadata                    # Реализация метаданных
│   └── js                              # Внешняя реализация JS API
│       └── camera_napi                 # Реализация Camera NAPI
├── interfaces                          # Интерфейсы
│   ├── inner_api                       # Внутренние Native API
│   └── kits                            # Внешние JS API
├── 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();
  5. Добавьте вход камеры в сессию захвата.

    result = captureSession->AddInput(cameraInput);
    ```6. Создайте превью-выход с помощью поверхности, полученой из менеджера окон для отображения на экране. Ширина и высота превью можно настроить на одно из поддерживаемых разрешений камеры. Для сохранения в файл следует использовать шаги создания поверхности и регистрации слушателя для обновлений буфера, как указано выше для съемки фотографии.

    int32_t previewWidth = 640; int32_t previewHeight = 480; previewSurface->SetUserData(CameraManager::surfaceFormat, std::to_string(OHOS_CAMERA_FORMAT_YCRCB_420_SP)); sptr previewOutput = camManagerObj->CreateCustomPreviewOutput(previewSurface, previewWidth, previewHeight);

  6. Добавьте превью-выход в сессию захвата.

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

    result = captureSession->CommitConfig();
  8. Запустите превью.

    result = captureSession->Start();
  9. Остановите превью, когда это необходимо.

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

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

    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. Создайте видео-выход с помощью поверхности, полученой из регистратора для MUX с аудио и сохранения файла. Чтобы сохранить только видеобуфер в файл, следует использовать шаги создания поверхности и регистрации слушателя для обновлений буфера, как указано выше для съемки фотографии. Разрешение видео можно настроить на одно из поддерживаемых разрешений камеры и регистратора при установке конфигураций регистратора.

    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();

Для переключения между устройствами камеры

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

  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. Создайте видео-выход с поверхностью.

    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. Снимите фотографию.

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

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

    cameraInput2->Release();

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

Режим вспышки можно настроить перед съемкой фотографии или записи видео.1. Установите режим вспышки для съемки фотографии:

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

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

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

Вовлечённые репозитории

multimedia_camera_framework

Комментарии ( 0 )

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

Введение

Временно отсутствует описание. Развернуть Свернуть
Apache-2.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