Репозиторий camera_standard позволяет вашему приложению предоставлять функции камеры. Вы можете получить доступ к устройству камеры и развивать новые функции через открытые API. Общие операции включают просмотр, съемку фото и запись видео.
Съемка фотографии
Эта функция используется для съемки фотографии.
Превью
Эта функция повторно захватывает несколько кадров в буфере после запуска камеры. Она используется для предварительного просмотра объекта перед съемкой фото или началом записи видео.
Запись видео
Эта функция повторно захватывает несколько кадров в буфере после начала записи и продолжает до момента остановки записи. Она используется для записи видео.
Структура директория репозитория следующая:
/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 # Конфигурация инициализации сервиса камеры
Шаги для съемки фотографии:
Создайте слушатель потребителя буфера (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();
Добавьте вход камеры в сессию захвата.
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);
Добавьте превью-выход в сессию захвата.
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);
Создайте видео-выход с помощью поверхности, полученой из регистратора для MUX с аудио и сохранения файла. Чтобы сохранить только видеобуфер в файл, следует использовать шаги создания поверхности и регистрации слушателя для обновлений буфера, как указано выше для съемки фотографии. Разрешение видео можно настроить на одно из поддерживаемых разрешений камеры и регистратора при установке конфигураций регистратора.
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();
Ниже приведены шаги, демонстрирующие, как переключаться между устройствами камеры. Вначале к сессии захвата добавляется видео-выход. Если пользователь хочет переключиться между камерами, существующий входной и выходной потоки должны быть удалены, а затем добавлен новый входной и выходной потоки (например, фото-выход в данном случае).
Получите экземпляр менеджера камеры и получите список объектов камеры.
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);
Создайте видео-выход с поверхностью.
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();
Снимите фотографию.
result = ((sptr<PhotoOutput> &)photoOutput)->Capture();
Освободите ресурсы сессии захвата.
captureSession->Release();
Освободите вход камеры, чтобы закрыть камеру.
cameraInput2->Release();
Режим вспышки можно настроить перед съемкой фотографии или записи видео.1. Установите режим вспышки для съемки фотографии:
```
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 )