Компонент камеры поддерживает разработку бизнеса с использованием камеры. Разработчики могут использовать открытые интерфейсы для доступа к аппаратной части камеры, её управления и создания новых функций. Самыми распространенными операциями являются просмотр, фотографирование и видеозапись.
Фотография
Эта функция предназначена для съёмки и получения фотографий.
Просмотр
Эта функция позволяет после запуска камеры повторно получать кадры видео в буферной области. Поддерживается предварительный просмотр кадров перед фотографированием или видеозаписью.
Видеозапись
Эта функция предназначена для получения кадров видео в буферной области во время записи видео до его завершения.
Рисунок 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 # Конфигурационные файлы сервиса камеры
Шаги для фотографирования:
Создайте слушатель конечного потребителя буфера (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);
}
}
};
Получите экземпляр менеджера камер и список объектов камер.
sptr<CameraManager> camManagerObj = CameraManager::GetInstance();
std::vector<sptr<CameraInfo>> cameraObjList = camManagerObj->GetCameras();
Используйте объект камеры для создания входа камеры для открытия камеры.
sptr<CaptureInput> cameraInput = camManagerObj->CreateCameraInput(cameraObjList[0]);
Создайте сессию захвата.
sptr<CaptureSession> captureSession = camManagerObj->CreateCaptureSession();
Начните настройку сессии захвата.
int32_t result = captureSession->BeginConfig();
Добавьте вход камеры в сессию захвата.
result = captureSession->AddInput(cameraInput);
Создайте поверхность потребителя и зарегистрируйте слушатель для отслеживания обновлений буфера. Ширина и высота фотографии можно настроить на поддерживаемое разрешение 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);
Используйте созданную поверхность для создания выхода фотографии.
sptr<CaptureOutput> photoOutput = camManagerObj->CreatePhotoOutput(photoSurface);
Добавьте выход фотографии в сессию захвата.
result = captureSession->AddOutput(photoOutput);
Примите настройки в сессии захвата.
result = captureSession->CommitConfig();
Выполните фотографию.
result = ((sptr<PhotoOutput> &)photoOutput)->Capture();
Освободите ресурсы сессии захвата.
captureSession->Release();
Освободите вход камеры для закрытия камеры.
cameraInput->Release();
Шаги для начала и завершения просмотра:
Получите экземпляр менеджера камер и список объектов камер.
sptr<CameraManager> camManagerObj = CameraManager::GetInstance();
std::vector<sptr<CameraInfo>> cameraObjList = camManagerObj->GetCameras();
Используйте объект камеры для создания входа камеры для открытия камеры.
sptr<CaptureInput> cameraInput = camManagerObj->CreateCameraInput(cameraObjList[0]);
Создайте сессию захвата.
sptr<CaptureSession> captureSession = camManagerObj->CreateCaptureSession();
Начните настройку сессии захвата.
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);
Добавьте выход просмотра в сессию захвата.
result = captureSession->AddOutput(previewOutput);
Примите настройки в сессии захвата.
result = captureSession->CommitConfig();
Начните просмотр.
result = captureSession->Start();
При необходимости завершите просмотр.
result = captureSession->Stop();
Освободите ресурсы сессии захвата.
captureSession->Release();
Освободите вход камеры для закрытия камеры.
cameraInput->Release();
Шаги для видеозаписи:
Получите экземпляр менеджера камер и список объектов камер.
sptr<CameraManager> camManagerObj = CameraManager::GetInstance();
std::vector<sptr<CameraInfo>> cameraObjList = camManagerObj->GetCameras();
Используйте объект камеры для создания входа камеры для открытия камеры.
sptr<CaptureInput> cameraInput = camManagerObj->CreateCameraInput(cameraObjList[0]);
Создайте сессию захвата.
sptr<CaptureSession> captureSession = camManagerObj->CreateCaptureSession();
Начните настройку сессии захвата.
int32_t result = captureSession->BeginConfig();
Добавьте вход камеры в сессию захвата.
result = captureSession->AddInput(cameraInput);
Используйте поверхность для создания выхода видео, который будет объединяться с аудио и сохраняться в файл. Поверхность получается через Recorder. Если требуется сохранить данные видео-буфера в файл, используйте шаги, указанные для фотографии, чтобы создать поверхность, зарегистрировать слушатель для отслеживания обновлений буфера. Разрешение видео можно настроить внутри Recorder на поддерживаемое разрешение 1280x720 или 640x360.
videoSurface->SetUserData(CameraManager::surfaceFormat, std::to_string(OHOS_CAMERA_FORMAT_YCRCB_420_SP));
sptr<CaptureOutput> videoOutput = camManagerObj->CreateVideoOutput(videoSurface);
Добавьте выход видео в сессию захвата.
result = captureSession->AddOutput(videoOutput);
Примите настройки в сессии захвата.
result = captureSession->CommitConfig();
Начните запись видео.
result = ((sptr<VideoOutput> &)videoOutput)->Start();
При необходимости завершите запись.
result = ((sptr<VideoOutput> &)videoOutput)->Stop();
Освободите ресурсы сессии захвата.
captureSession->Release();
Освободите вход камеры для закрытия камеры.
cameraInput->Release();
Далее приведена демонстрация того, как переключаться между несколькими устройствами камеры. Вначале в сессии захвата имеется одно видеоустройство вывода (video output). Если пользователь хочет переключиться на другую камеру, существующие устройства входа и выхода должны быть удалены и заменены новыми устройствами входа и выхода (в данном примере используется фотоустройство вывода).
Получите экземпляр менеджера камер и список объектов камер.
sptr<CameraManager> camManagerObj = CameraManager::GetInstance();
std::vector<sptr<CameraInfo>> cameraObjList = camManagerObj->GetCameras();
Создайте устройство входа камеры с использованием объекта камеры.
sptr<CaptureInput> cameraInput = camManagerObj->CreateCameraInput(cameraObjList[0]);
Создайте сессию захвата.
sptr<CaptureSession> captureSession = camManagerObj->CreateCaptureSession();
Начните конфигурацию сессии захвата.
int32_t result = captureSession->BeginConfig();
Добавьте устройство входа камеры в сессию захвата.
result = captureSession->AddInput(cameraInput);
Создайте видеоустройство вывода через Surface.
sptr<CaptureOutput> videoOutput = camManagerObj->CreateVideoOutput(videoSurface);
Добавьте видеоустройство вывода в сессию захвата.
result = captureSession->AddOutput(videoOutput);
Подтвердите конфигурацию сессии захвата.
result = captureSession->CommitConfig();
Начните запись видео.
result = ((sptr<VideoOutput> &)videoOutput)->Start();
Остановите запись при необходимости.
result = ((sptr<VideoOutput> &)videoOutput)->Stop();
Переопределите конфигурацию сессии и удалите устройства входа и выхода.
int32_t result = captureSession->BeginConfig();
Удалите устройство входа камеры из нового конфигурационного файла сессии.
int32_t result = captureSession->RemoveInput(cameraInput);
Удалите устройство выхода камеры.
int32_t result = captureSession->RemoveOutput(videoOutput);
Создайте новое устройство входа камеры и добавьте его в сессию захвата.
sptr<CaptureInput> cameraInput2 = camManagerObj->CreateCameraInput(cameraObjList[1]);
result = captureSession->AddInput(cameraInput2);
Создайте устройство вывода фотографий. После успешного создания добавьте устройство вывода фотографий в сессию захвата. Создайте поверхность потребителя и зарегистрируйте слушатель для отслеживания обновлений буферов нового устройства вывода фотографий. Эта поверхность используется для нового устройства вывода фотографий.
// Получите поверхность
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);
Подтвердите конфигурацию сессии захвата.
result = captureSession->CommitConfig();
Освободите устройство входа камеры, которое было удалено из сессии.
cameraInput->Release();
```18. Сделайте фотографию.
```cpp
result = ((sptr<PhotoOutput>&) photoOutput)->Capture();
Освободите ресурсы сессии захвата.
captureSession->Release();
Освободите устройство входа камеры, чтобы закрыть камеру.
cameraInput2->Release();
Перед фотографированием и видеозаписью можно установить вспышку в устройстве входа камеры.
Установите вспышку во время фотографирования.
cameraInput->LockForControl();
cameraInput->SetFlashMode(OHOS_CAMERA_FLASH_MODE_OPEN);
cameraInput->UnlockForControl();
Установите вспышку во время видеозаписи.
cameraInput->LockForControl();
cameraInput->SetFlashMode(OHOS_CAMERA_FLASH_MODE_ALWAYS_OPEN);
cameraInput->UnlockForControl();
Отключите вспышку.
cameraInput->LockForControl();
cameraInput->SetFlashMode(OHOS_CAMERA_FLASH_MODE_CLOSE);
cameraInput->UnlockForControl();
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )