电子说
相机组件支持相机业务的开发,开发者可以通过已开放的接口实现相机硬件的访问、操作和新功能开发,最常见的操作如:预览、拍照和录像等。
图 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 # 相机服务配置
拍照的步骤:
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; // initialize the 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();
// Save the buffer(addr) to a file.
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);
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);
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);
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)。如果用户想要切换其他 照相机,现存的相机输入和输出需要先移除并加入新的相机输入和输出(示例中使用的是photo 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);
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- >RemoveOutut(videoOutput);
sptr< CaptureInput > cameraInput2 = camManagerObj- >CreateCameraInput(cameraObjList[1]);
result = captureSession- >AddInput(cameraInput2);
// Get the surface
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);
// Create the Photo Output
sptr< CaptureOutput > photoOutput = camManagerObj- >CreatePhotoOutput(photoSurface);
// Add the output to the capture session
result = captureSession- >AddOutput(photoOutput);
result = captureSession- >CommitConfig();
cameraInput- >Release();
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条评论
快来发表一下你的评论吧 !