删除无用文件
This commit is contained in:
		
							parent
							
								
									acc9f03109
								
							
						
					
					
						commit
						cb276de665
					
				| @ -1,424 +0,0 @@ | ||||
| /* | ||||
|  * Copyright (c) 2023 Hunan OpenValley Digital Industry Development Co., Ltd. | ||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|  * you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  * | ||||
|  *     http://www.apache.org/licenses/LICENSE-2.0
 | ||||
|  * | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, | ||||
|  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|  * See the License for the specific language governing permissions and | ||||
|  * limitations under the License. | ||||
|  */ | ||||
| 
 | ||||
| // import camera from '@ohos.multimedia.camera';
 | ||||
| import deviceInfo from '@ohos.deviceInfo'; | ||||
| import fileIo from '@ohos.file.fs'; | ||||
| import image from '@ohos.multimedia.image'; | ||||
| import media from '@ohos.multimedia.media'; | ||||
| import mediaLibrary from '@ohos.multimedia.mediaLibrary'; | ||||
| import Logger from '../utils/Logger'; | ||||
| import MediaModel from './MediaModel'; | ||||
| 
 | ||||
| 
 | ||||
| const FOUR = 4; // format
 | ||||
| const EIGHT = 8; // capacity
 | ||||
| const FOUR_THOUSAND_AND_SIXTY_NINE = 4096; // buffer大小
 | ||||
| 
 | ||||
| const cameraMode = { | ||||
|   modePhoto: 0, // 拍照模式
 | ||||
|   modeVideo: 1, // 录像模式
 | ||||
| }; | ||||
| 
 | ||||
| const cameraWH = { | ||||
|   width: 480, | ||||
|   height: 360, | ||||
| }; | ||||
| 
 | ||||
| /** | ||||
|  * 分辨率 | ||||
|  */ | ||||
| export enum VideoFrame { | ||||
|   VIDEOFRAME_1920_1080, | ||||
|   VIDEOFRAME_1280_720, | ||||
|   VIDEOFRAME_800_600, | ||||
| }; | ||||
| 
 | ||||
| type VideoFrameWH = { | ||||
|   width: number; | ||||
|   height: number; | ||||
| }; | ||||
| 
 | ||||
| const TAG = '[CameraModel]'; | ||||
| 
 | ||||
| export default class CameraService { | ||||
|   private mediaModel: MediaModel = undefined; | ||||
|   private fileAsset: mediaLibrary.FileAsset = undefined; | ||||
|   private cameraMgr: camera.CameraManager = undefined; | ||||
|   private camerasArray: Array<camera.CameraDevice> = undefined; | ||||
|   private cameraInput: camera.CameraInput = undefined; | ||||
|   private previewOutput: camera.PreviewOutput = undefined; | ||||
|   private photoOutPut: camera.PhotoOutput = undefined; | ||||
|   private capSession: camera.CaptureSession = undefined; | ||||
|   private videoOutput: camera.VideoOutput = undefined; | ||||
|   private capability: camera.CameraOutputCapability = undefined; | ||||
| 
 | ||||
|   private avRecorder: media.AVRecorder = undefined; | ||||
|   private receiver: image.ImageReceiver = undefined; | ||||
|   private photoPath: string = ''; | ||||
|   private fd: number = -1; | ||||
|   private takePictureHandle: (photoUri: string) => void = undefined; | ||||
|   private currentMode:number = cameraMode.modePhoto; | ||||
| 
 | ||||
|   private videoFrameWH: VideoFrameWH = { | ||||
|     width: 480, | ||||
|     height: 360, | ||||
|   }; // 视频分辨率
 | ||||
|   private imageRotation: camera.ImageRotation = camera.ImageRotation.ROTATION_0; // 图片旋转角度
 | ||||
| 
 | ||||
|   private videoProfile: media.VideoRecorderProfile = { | ||||
|     audioChannels: 2, | ||||
|     audioCodec: media.CodecMimeType.AUDIO_AAC, | ||||
|     audioBitrate: 48000, | ||||
|     audioSampleRate: 48000, | ||||
|     fileFormat: media.ContainerFormatType.CFT_MPEG_4, | ||||
|     videoBitrate: 48000, | ||||
|     videoCodec: media.CodecMimeType.VIDEO_MPEG4, | ||||
|     videoFrameWidth: 480, | ||||
|     videoFrameHeight: 360, | ||||
|     videoFrameRate: 30, | ||||
|   }; | ||||
|   private videoSourceType: number = 0; | ||||
| 
 | ||||
|   constructor() { | ||||
|     this.mediaModel = MediaModel.getMediaInstance(); | ||||
|     this.receiver = image.createImageReceiver( | ||||
|       cameraWH.width, | ||||
|       cameraWH.height, | ||||
|       FOUR, | ||||
|       EIGHT | ||||
|     ); | ||||
|     Logger.info(TAG, 'createImageReceiver'); | ||||
|     this.receiver.on('imageArrival', () => { | ||||
|       Logger.info(TAG, 'imageArrival'); | ||||
|       this.receiver.readNextImage((err, image) => { | ||||
|         Logger.info(TAG, 'readNextImage'); | ||||
|         if (err || image === undefined) { | ||||
|           Logger.error(TAG, 'failed to get valid image'); | ||||
|           return; | ||||
|         } | ||||
|         image.getComponent(FOUR, (errMsg, img) => { | ||||
|           Logger.info(TAG, 'getComponent'); | ||||
|           if (errMsg || img === undefined) { | ||||
|             Logger.info(TAG, 'failed to get valid buffer'); | ||||
|             return; | ||||
|           } | ||||
|           let buffer = new ArrayBuffer(FOUR_THOUSAND_AND_SIXTY_NINE); | ||||
|           if (img.byteBuffer) { | ||||
|             buffer = img.byteBuffer; | ||||
|           } else { | ||||
|             Logger.error(TAG, 'img.byteBuffer is undefined'); | ||||
|           } | ||||
|           this.saveImage(buffer, image); | ||||
|         }); | ||||
|       }); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   /** | ||||
|    * 设置分辨率 | ||||
|    * @param videoFrame | ||||
|    */ | ||||
|   setVideoFrameWH(videoFrame: VideoFrame): void { | ||||
|     switch (videoFrame) { | ||||
|       case VideoFrame.VIDEOFRAME_800_600: | ||||
|         this.videoFrameWH = { | ||||
|           width: 800, | ||||
|           height: 600, | ||||
|         }; | ||||
|         Logger.info( | ||||
|           TAG, | ||||
|           `setVideoFrameWH videoFrameWH:${JSON.stringify(this.videoFrameWH)}` | ||||
|         ); | ||||
|         break; | ||||
|       case VideoFrame.VIDEOFRAME_1280_720: | ||||
|         this.videoFrameWH = { | ||||
|           width: 1280, | ||||
|           height: 720, | ||||
|         }; | ||||
|         Logger.info( | ||||
|           TAG, | ||||
|           `setVideoFrameWH videoFrameWH:${JSON.stringify(this.videoFrameWH)}` | ||||
|         ); | ||||
|         break; | ||||
|       case VideoFrame.VIDEOFRAME_1920_1080: | ||||
|         this.videoFrameWH = { | ||||
|           width: 1920, | ||||
|           height: 1080, | ||||
|         }; | ||||
|         Logger.info( | ||||
|           TAG, | ||||
|           `setVideoFrameWH videoFrameWH:${JSON.stringify(this.videoFrameWH)}` | ||||
|         ); | ||||
|         break; | ||||
|     } | ||||
|   } | ||||
|   /** | ||||
|    * 设置图片旋转角度 | ||||
|    * @param imageRotation | ||||
|    */ | ||||
|   setImageRotation(imageRotation: camera.ImageRotation): void { | ||||
|     this.imageRotation = imageRotation; | ||||
|   } | ||||
| 
 | ||||
|   /** | ||||
|    * 保存图片 | ||||
|    * @param buffer | ||||
|    * @param img | ||||
|    */ | ||||
|   async saveImage(buffer: ArrayBuffer, img: image.Image): Promise<void> { | ||||
|     Logger.info(TAG, 'savePicture'); | ||||
|     this.fileAsset = await this.mediaModel.createAndGetUri(mediaLibrary.MediaType.IMAGE); | ||||
|     this.photoPath = this.fileAsset.uri; | ||||
|     Logger.info(TAG, `this.photoUri = ${this.photoPath}`); | ||||
|     this.fd = await this.mediaModel.getFdPath(this.fileAsset); | ||||
|     Logger.info(TAG, `this.fd = ${this.fd}`); | ||||
|     await fileIo.write(this.fd, buffer); | ||||
|     await this.fileAsset.close(this.fd); | ||||
|     await img.release(); | ||||
|     Logger.info(TAG, 'save image done'); | ||||
|     if (this.takePictureHandle) { | ||||
|       this.takePictureHandle(this.photoPath); | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   /** | ||||
|    * 初始化相机 | ||||
|    * @param surfaceId | ||||
|    */ | ||||
|   async initCamera(surfaceId: string): Promise<void> { | ||||
|     Logger.info(TAG, `initCamera surfaceId:${surfaceId}`); | ||||
|     await this.cameraRelease(); | ||||
|     Logger.info(TAG, `deviceInfo.deviceType = ${deviceInfo.deviceType}`); | ||||
|     if (deviceInfo.deviceType === 'default') { | ||||
|       Logger.info(TAG, `deviceInfo.deviceType default 1 = ${deviceInfo.deviceType}`); | ||||
|       this.videoSourceType = 1; | ||||
|       Logger.info(TAG, `deviceInfo.deviceType default 2 = ${deviceInfo.deviceType}`); | ||||
|     } else { | ||||
|       Logger.info(TAG, `deviceInfo.deviceType other 1 = ${deviceInfo.deviceType}`); | ||||
|       this.videoSourceType = 0; | ||||
|       Logger.info(TAG, `deviceInfo.deviceType other 2 = ${deviceInfo.deviceType}`); | ||||
|     } | ||||
|     Logger.info(TAG, 'getCameraManager begin'); | ||||
|     try { | ||||
|       Logger.info(TAG, 'getCameraManager try begin'); | ||||
|       this.cameraMgr = camera.getCameraManager(globalThis.cameraContext); | ||||
|       Logger.info(TAG, 'getCameraManager try end'); | ||||
|     } catch (e) { | ||||
|       Logger.info(TAG, `getCameraManager catch e:${JSON.stringify(e)}`); | ||||
|       Logger.info(TAG, `getCameraManager catch code:${JSON.stringify(e.code)}`); | ||||
|       Logger.info(TAG, `getCameraManager catch message:${JSON.stringify(e.message)}`); | ||||
|     } | ||||
|     Logger.info(TAG, 'getCameraManager end'); | ||||
|     Logger.info(TAG, `getCameraManager ${JSON.stringify(this.cameraMgr)}`); | ||||
|     this.camerasArray = this.cameraMgr.getSupportedCameras(); | ||||
|     Logger.info(TAG, `get cameras ${this.camerasArray.length}`); | ||||
|     if (this.camerasArray.length === 0) { | ||||
|       Logger.info(TAG, 'cannot get cameras'); | ||||
|       return; | ||||
|     } | ||||
| 
 | ||||
|     let mCamera = this.camerasArray[0]; | ||||
|     this.cameraInput = this.cameraMgr.createCameraInput(mCamera); | ||||
|     this.cameraInput.open(); | ||||
|     Logger.info(TAG, 'createCameraInput'); | ||||
|     this.capability = this.cameraMgr.getSupportedOutputCapability(mCamera); | ||||
|     let previewProfile = this.capability.previewProfiles[0]; | ||||
|     this.previewOutput = this.cameraMgr.createPreviewOutput( | ||||
|       previewProfile, | ||||
|       surfaceId | ||||
|     ); | ||||
|     Logger.info(TAG, 'createPreviewOutput'); | ||||
|     let rSurfaceId = await this.receiver.getReceivingSurfaceId(); | ||||
|     let photoProfile = this.capability.photoProfiles[0]; | ||||
|     this.photoOutPut = this.cameraMgr.createPhotoOutput( | ||||
|       photoProfile, | ||||
|       rSurfaceId | ||||
|     ); | ||||
|     this.capSession = this.cameraMgr.createCaptureSession(); | ||||
|     Logger.info(TAG, 'createCaptureSession'); | ||||
|     this.capSession.beginConfig(); | ||||
|     Logger.info(TAG, 'beginConfig'); | ||||
|     this.capSession.addInput(this.cameraInput); | ||||
|     this.capSession.addOutput(this.previewOutput); | ||||
|     this.capSession.addOutput(this.photoOutPut); | ||||
|     await this.capSession.commitConfig(); | ||||
|     await this.capSession.start(); | ||||
|     Logger.info(TAG, 'captureSession start'); | ||||
|   } | ||||
| 
 | ||||
|   setTakePictureHandleCallback(callback): void { | ||||
|     this.takePictureHandle = callback; | ||||
|   } | ||||
| 
 | ||||
|   /** | ||||
|    * 拍照 | ||||
|    */ | ||||
|   async takePicture(): Promise<void> { | ||||
|     Logger.info(TAG, 'takePicture'); | ||||
|     if (this.currentMode === cameraMode.modeVideo) { | ||||
|       this.currentMode = cameraMode.modePhoto; | ||||
|     } | ||||
|     Logger.info(TAG, `takePicture imageRotation:${this.imageRotation}`); | ||||
|     let photoSettings = { | ||||
|       rotation: this.imageRotation, | ||||
|       quality: camera.QualityLevel.QUALITY_LEVEL_MEDIUM, | ||||
|       location: { | ||||
|         // 位置信息,经纬度
 | ||||
|         latitude: 12.9698, | ||||
|         longitude: 77.75, | ||||
|         altitude: 1000, | ||||
|       }, | ||||
|       mirror: false, | ||||
|     }; | ||||
|     await this.photoOutPut.capture(photoSettings); | ||||
|     Logger.info(TAG, 'takePicture done'); | ||||
|     AppStorage.Set('isRefresh', true); | ||||
|   } | ||||
| 
 | ||||
|   /** | ||||
|    * 开始录像 | ||||
|    */ | ||||
|   async startVideo(): Promise<void> { | ||||
|     Logger.info(TAG, 'startVideo begin'); | ||||
|     Logger.info(TAG, 'startVideo 1'); | ||||
|     await this.capSession.stop(); | ||||
|     Logger.info(TAG, 'startVideo 2'); | ||||
|     this.capSession.beginConfig(); | ||||
|     Logger.info(TAG, 'startVideo 3'); | ||||
|     if (this.currentMode === cameraMode.modePhoto) { | ||||
|       this.currentMode = cameraMode.modeVideo; | ||||
|       if (this.photoOutPut) { | ||||
|         this.capSession.removeOutput(this.photoOutPut); | ||||
|         this.photoOutPut.release(); | ||||
|       } | ||||
|     } else { | ||||
|       if (this.videoOutput) { | ||||
|         try { | ||||
|           Logger.info(TAG, 'startVideo 4'); | ||||
|           this.capSession.removeOutput(this.videoOutput); | ||||
|           Logger.info(TAG, 'startVideo 5'); | ||||
|         } catch (e) { | ||||
|           Logger.info(TAG, `startVideo catch e:${JSON.stringify(e)}`); | ||||
|           Logger.info(TAG, `startVideo catch code:${JSON.stringify(e.code)}`); | ||||
|           Logger.info(TAG, `startVideo catch message:${JSON.stringify(e.message)}`); | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|     if (this.videoOutput) { | ||||
|       try { | ||||
|         Logger.info(TAG, 'startVideo 6'); | ||||
|         this.capSession.removeOutput(this.videoOutput); | ||||
|         Logger.info(TAG, 'startVideo 7'); | ||||
|       } catch (e) { | ||||
|         Logger.info(TAG, `startVideo catch e:${JSON.stringify(e)}`); | ||||
|         Logger.info(TAG, `startVideo catch code:${JSON.stringify(e.code)}`); | ||||
|         Logger.info(TAG, `startVideo catch message:${JSON.stringify(e.message)}`); | ||||
|       } | ||||
|       try { | ||||
|         Logger.info(TAG, 'startVideo release 1'); | ||||
|         await this.videoOutput.release(); | ||||
|         Logger.info(TAG, 'startVideo release 2'); | ||||
|       } catch (e) { | ||||
|         Logger.info(TAG, `startVideo catch e:${JSON.stringify(e)}`); | ||||
|         Logger.info(TAG, `startVideo catch code:${JSON.stringify(e.code)}`); | ||||
|         Logger.info(TAG, `startVideo catch message:${JSON.stringify(e.message)}`); | ||||
|       } | ||||
|     } | ||||
|     Logger.info(TAG, 'startVideo 8'); | ||||
|     this.fileAsset = await this.mediaModel.createAndGetUri(mediaLibrary.MediaType.VIDEO); | ||||
|     Logger.info(TAG, `startVideo fileAsset:${this.fileAsset}`); | ||||
|     this.fd = await this.mediaModel.getFdPath(this.fileAsset); | ||||
|     Logger.info(TAG, `startVideo fd:${this.fd}`); | ||||
|     media.createAVRecorder(async (error, recorder) => { | ||||
|       Logger.info(TAG, `startVideo into createAVRecorder:${recorder}`); | ||||
|       if (recorder != null) { | ||||
|         Logger.info(TAG, `startVideo into recorder:${recorder}`); | ||||
|         this.avRecorder = recorder; | ||||
|         Logger.info(TAG, `startVideo createAVRecorder success:${this.avRecorder}`); | ||||
|         // 当前录像配置
 | ||||
|         let currConfig = { | ||||
|           audioSourceType: 1, | ||||
|           videoSourceType: this.videoSourceType, | ||||
|           profile: this.videoProfile, | ||||
|           url: `fd://${this.fd}`, | ||||
|           rotation: 0 | ||||
|         }; | ||||
|         Logger.info(TAG, `startVideo into recorder:${recorder}`); | ||||
|         await this.avRecorder.prepare(currConfig); | ||||
|         Logger.info(TAG, `startVideo videoConfig:${JSON.stringify(currConfig)}`); | ||||
|         let videoId = await this.avRecorder.getInputSurface(); | ||||
|         let videoProfile = this.capability.videoProfiles[0]; | ||||
|         Logger.info(TAG, `startVideo capability.videoProfiles[]=: ${JSON.stringify(this.capability.videoProfiles)}`); | ||||
|         Logger.info(TAG, `startVideo videoProfile:${JSON.stringify(videoProfile)}`); | ||||
|         this.videoOutput = this.cameraMgr.createVideoOutput(videoProfile, videoId); | ||||
|         Logger.info(TAG, `startVideo videoOutput:${this.videoOutput}`); | ||||
|         this.capSession.addOutput(this.videoOutput); | ||||
|         Logger.info(TAG, 'startVideo addOutput'); | ||||
|         await this.capSession.commitConfig(); | ||||
|         Logger.info(TAG, 'startVideo commitConfig'); | ||||
|         await this.capSession.start(); | ||||
|         Logger.info(TAG, 'startVideo commitConfig capSession'); | ||||
|         await this.videoOutput.start(); | ||||
|         Logger.info(TAG, 'startVideo commitConfig videoOutput'); | ||||
|         try { | ||||
|           Logger.info(TAG, 'startVideo avRecorder.start 1'); | ||||
|           await this.avRecorder.start(); | ||||
|           Logger.info(TAG, 'startVideo avRecorder.start 2'); | ||||
|         } catch (e) { | ||||
|           Logger.info(TAG, `startVideo catch e:${JSON.stringify(e)}`); | ||||
|         } | ||||
| 
 | ||||
|         Logger.info(TAG, 'startVideo end'); | ||||
| 
 | ||||
|       } else { | ||||
|         Logger.info(TAG, `startVideo createAVRecorder fail, error:${error}`); | ||||
|       } | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   /** | ||||
|    * 停止录像 | ||||
|    */ | ||||
|   async stopVideo(): Promise<void> { | ||||
|     Logger.info(TAG, 'stopVideo called'); | ||||
|     await this.avRecorder.stop(); | ||||
|     await this.avRecorder.release(); | ||||
|     await this.videoOutput.stop(); | ||||
|     await this.fileAsset.close(this.fd); | ||||
|   } | ||||
| 
 | ||||
|   /** | ||||
|    * 资源释放 | ||||
|    */ | ||||
|   async cameraRelease(): Promise<void> { | ||||
|     Logger.info(TAG, 'releaseCamera'); | ||||
|     if (this.cameraInput) { | ||||
|       await this.cameraInput.close(); | ||||
|     } | ||||
|     if (this.previewOutput) { | ||||
|       await this.previewOutput.release(); | ||||
|     } | ||||
|     if (this.photoOutPut) { | ||||
|       await this.photoOutPut.release(); | ||||
|     } | ||||
|     if (this.videoOutput) { | ||||
|       await this.videoOutput.release(); | ||||
|     } | ||||
|     if (this.capSession) { | ||||
|       await this.capSession.release(); | ||||
|     } | ||||
|   } | ||||
| } | ||||
| @ -1,424 +0,0 @@ | ||||
| /* | ||||
|  * Copyright (c) 2023 Hunan OpenValley Digital Industry Development Co., Ltd. | ||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|  * you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  * | ||||
|  *     http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  * | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, | ||||
|  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|  * See the License for the specific language governing permissions and | ||||
|  * limitations under the License. | ||||
|  */ | ||||
| 
 | ||||
| import camera from '@ohos.multimedia.camera'; | ||||
| import deviceInfo from '@ohos.deviceInfo'; | ||||
| import fileIo from '@ohos.file.fs'; | ||||
| import image from '@ohos.multimedia.image'; | ||||
| import media from '@ohos.multimedia.media'; | ||||
| import mediaLibrary from '@ohos.multimedia.mediaLibrary'; | ||||
| import Logger from '../utils/Logger'; | ||||
| import MediaModel from './MediaModel'; | ||||
| 
 | ||||
| 
 | ||||
| const FOUR = 4; // format | ||||
| const EIGHT = 8; // capacity | ||||
| const FOUR_THOUSAND_AND_SIXTY_NINE = 4096; // buffer大小 | ||||
| 
 | ||||
| const cameraMode = { | ||||
|   modePhoto: 0, // 拍照模式 | ||||
|   modeVideo: 1, // 录像模式 | ||||
| }; | ||||
| 
 | ||||
| const cameraWH = { | ||||
|   width: 480, | ||||
|   height: 360, | ||||
| }; | ||||
| 
 | ||||
| /** | ||||
|  * 分辨率 | ||||
|  */ | ||||
| export enum VideoFrame { | ||||
|   VIDEOFRAME_1920_1080, | ||||
|   VIDEOFRAME_1280_720, | ||||
|   VIDEOFRAME_800_600, | ||||
| }; | ||||
| 
 | ||||
| type VideoFrameWH = { | ||||
|   width: number; | ||||
|   height: number; | ||||
| }; | ||||
| 
 | ||||
| const TAG = '[CameraModel]'; | ||||
| 
 | ||||
| export default class CameraService { | ||||
|   private mediaModel: MediaModel = undefined; | ||||
|   private fileAsset: mediaLibrary.FileAsset = undefined; | ||||
|   private cameraMgr: camera.CameraManager | ||||
|   private camerasArray: Array<camera.CameraDevice> = undefined; | ||||
|   private cameraInput: camera.CameraInput = undefined; | ||||
|   private previewOutput: camera.PreviewOutput = undefined; | ||||
|   private photoOutPut: camera.PhotoOutput = undefined; | ||||
|   private capSession: camera.CaptureSession = undefined; | ||||
|   private videoOutput: camera.VideoOutput = undefined; | ||||
|   private capability: camera.CameraOutputCapability = undefined; | ||||
| 
 | ||||
|   private avRecorder: media.AVRecorder = undefined; | ||||
|   private receiver: image.ImageReceiver = undefined; | ||||
|   private photoPath: string = ''; | ||||
|   private fd: number = -1; | ||||
|   private takePictureHandle: (photoUri: string) => void = undefined; | ||||
|   private currentMode:number = cameraMode.modePhoto; | ||||
| 
 | ||||
|   private videoFrameWH: VideoFrameWH = { | ||||
|     width: 480, | ||||
|     height: 360, | ||||
|   }; // 视频分辨率 | ||||
|   private imageRotation: camera.ImageRotation = camera.ImageRotation.ROTATION_0; // 图片旋转角度 | ||||
| 
 | ||||
|   private videoProfile: media.VideoRecorderProfile = { | ||||
|     audioChannels: 2, | ||||
|     audioCodec: media.CodecMimeType.AUDIO_AAC, | ||||
|     audioBitrate: 48000, | ||||
|     audioSampleRate: 48000, | ||||
|     fileFormat: media.ContainerFormatType.CFT_MPEG_4, | ||||
|     videoBitrate: 48000, | ||||
|     videoCodec: media.CodecMimeType.VIDEO_MPEG4, | ||||
|     videoFrameWidth: 480, | ||||
|     videoFrameHeight: 360, | ||||
|     videoFrameRate: 30, | ||||
|   }; | ||||
|   private videoSourceType: number = 0; | ||||
| 
 | ||||
|   constructor() { | ||||
|     this.mediaModel = MediaModel.getMediaInstance(); | ||||
|     this.receiver = image.createImageReceiver( | ||||
|       cameraWH.width, | ||||
|       cameraWH.height, | ||||
|       FOUR, | ||||
|       EIGHT | ||||
|     ); | ||||
|     Logger.info(TAG, 'createImageReceiver'); | ||||
|     this.receiver.on('imageArrival', () => { | ||||
|       Logger.info(TAG, 'imageArrival'); | ||||
|       this.receiver.readNextImage((err, image) => { | ||||
|         Logger.info(TAG, 'readNextImage'); | ||||
|         if (err || image === undefined) { | ||||
|           Logger.error(TAG, 'failed to get valid image'); | ||||
|           return; | ||||
|         } | ||||
|         image.getComponent(FOUR, (errMsg, img) => { | ||||
|           Logger.info(TAG, 'getComponent'); | ||||
|           if (errMsg || img === undefined) { | ||||
|             Logger.info(TAG, 'failed to get valid buffer'); | ||||
|             return; | ||||
|           } | ||||
|           let buffer = new ArrayBuffer(FOUR_THOUSAND_AND_SIXTY_NINE); | ||||
|           if (img.byteBuffer) { | ||||
|             buffer = img.byteBuffer; | ||||
|           } else { | ||||
|             Logger.error(TAG, 'img.byteBuffer is undefined'); | ||||
|           } | ||||
|           this.saveImage(buffer, image); | ||||
|         }); | ||||
|       }); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   /** | ||||
|    * 设置分辨率 | ||||
|    * @param videoFrame | ||||
|    */ | ||||
|   setVideoFrameWH(videoFrame: VideoFrame): void { | ||||
|     switch (videoFrame) { | ||||
|       case VideoFrame.VIDEOFRAME_800_600: | ||||
|         this.videoFrameWH = { | ||||
|           width: 800, | ||||
|           height: 600, | ||||
|         }; | ||||
|         Logger.info( | ||||
|           TAG, | ||||
|           `setVideoFrameWH videoFrameWH:${JSON.stringify(this.videoFrameWH)}` | ||||
|         ); | ||||
|         break; | ||||
|       case VideoFrame.VIDEOFRAME_1280_720: | ||||
|         this.videoFrameWH = { | ||||
|           width: 1280, | ||||
|           height: 720, | ||||
|         }; | ||||
|         Logger.info( | ||||
|           TAG, | ||||
|           `setVideoFrameWH videoFrameWH:${JSON.stringify(this.videoFrameWH)}` | ||||
|         ); | ||||
|         break; | ||||
|       case VideoFrame.VIDEOFRAME_1920_1080: | ||||
|         this.videoFrameWH = { | ||||
|           width: 1920, | ||||
|           height: 1080, | ||||
|         }; | ||||
|         Logger.info( | ||||
|           TAG, | ||||
|           `setVideoFrameWH videoFrameWH:${JSON.stringify(this.videoFrameWH)}` | ||||
|         ); | ||||
|         break; | ||||
|     } | ||||
|   } | ||||
|   /** | ||||
|    * 设置图片旋转角度 | ||||
|    * @param imageRotation | ||||
|    */ | ||||
|   setImageRotation(imageRotation: camera.ImageRotation): void { | ||||
|     this.imageRotation = imageRotation; | ||||
|   } | ||||
| 
 | ||||
|   /** | ||||
|    * 保存图片 | ||||
|    * @param buffer | ||||
|    * @param img | ||||
|    */ | ||||
|   async saveImage(buffer: ArrayBuffer, img: image.Image): Promise<void> { | ||||
|     Logger.info(TAG, 'savePicture'); | ||||
|     this.fileAsset = await this.mediaModel.createAndGetUri(mediaLibrary.MediaType.IMAGE); | ||||
|     this.photoPath = this.fileAsset.uri; | ||||
|     Logger.info(TAG, `this.photoUri = ${this.photoPath}`); | ||||
|     this.fd = await this.mediaModel.getFdPath(this.fileAsset); | ||||
|     Logger.info(TAG, `this.fd = ${this.fd}`); | ||||
|     await fileIo.write(this.fd, buffer); | ||||
|     await this.fileAsset.close(this.fd); | ||||
|     await img.release(); | ||||
|     Logger.info(TAG, 'save image done'); | ||||
|     if (this.takePictureHandle) { | ||||
|       this.takePictureHandle(this.photoPath); | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   /** | ||||
|    * 初始化相机 | ||||
|    * @param surfaceId | ||||
|    */ | ||||
|   async initCamera(surfaceId: string): Promise<void> { | ||||
|     Logger.info(TAG, `initCamera surfaceId:${surfaceId}`); | ||||
|     await this.cameraRelease(); | ||||
|     Logger.info(TAG, `deviceInfo.deviceType = ${deviceInfo.deviceType}`); | ||||
|     if (deviceInfo.deviceType === 'default') { | ||||
|       Logger.info(TAG, `deviceInfo.deviceType default 1 = ${deviceInfo.deviceType}`); | ||||
|       this.videoSourceType = 1; | ||||
|       Logger.info(TAG, `deviceInfo.deviceType default 2 = ${deviceInfo.deviceType}`); | ||||
|     } else { | ||||
|       Logger.info(TAG, `deviceInfo.deviceType other 1 = ${deviceInfo.deviceType}`); | ||||
|       this.videoSourceType = 0; | ||||
|       Logger.info(TAG, `deviceInfo.deviceType other 2 = ${deviceInfo.deviceType}`); | ||||
|     } | ||||
|     Logger.info(TAG, 'getCameraManager begin'); | ||||
|     try { | ||||
|       Logger.info(TAG, 'getCameraManager try begin'); | ||||
|       this.cameraMgr = camera.getCameraManager(globalThis.cameraContext); | ||||
|       Logger.info(TAG, 'getCameraManager try end'); | ||||
|     } catch (e) { | ||||
|       Logger.info(TAG, `getCameraManager catch e:${JSON.stringify(e)}`); | ||||
|       Logger.info(TAG, `getCameraManager catch code:${JSON.stringify(e.code)}`); | ||||
|       Logger.info(TAG, `getCameraManager catch message:${JSON.stringify(e.message)}`); | ||||
|     } | ||||
|     Logger.info(TAG, 'getCameraManager end'); | ||||
|     Logger.info(TAG, `getCameraManager ${JSON.stringify(this.cameraMgr)}`); | ||||
|     this.camerasArray = this.cameraMgr.getSupportedCameras(); | ||||
|     Logger.info(TAG, `get cameras ${this.camerasArray.length}`); | ||||
|     if (this.camerasArray.length === 0) { | ||||
|       Logger.info(TAG, 'cannot get cameras'); | ||||
|       return; | ||||
|     } | ||||
| 
 | ||||
|     let mCamera = this.camerasArray[0]; | ||||
|     this.cameraInput = this.cameraMgr.createCameraInput(mCamera); | ||||
|     this.cameraInput.open(); | ||||
|     Logger.info(TAG, 'createCameraInput'); | ||||
|     this.capability = this.cameraMgr.getSupportedOutputCapability(mCamera); | ||||
|     let previewProfile = this.capability.previewProfiles[0]; | ||||
|     this.previewOutput = this.cameraMgr.createPreviewOutput( | ||||
|       previewProfile, | ||||
|       surfaceId | ||||
|     ); | ||||
|     Logger.info(TAG, 'createPreviewOutput'); | ||||
|     let rSurfaceId = await this.receiver.getReceivingSurfaceId(); | ||||
|     let photoProfile = this.capability.photoProfiles[0]; | ||||
|     this.photoOutPut = this.cameraMgr.createPhotoOutput( | ||||
|       photoProfile, | ||||
|       rSurfaceId | ||||
|     ); | ||||
|     this.capSession = this.cameraMgr.createCaptureSession(); | ||||
|     Logger.info(TAG, 'createCaptureSession'); | ||||
|     this.capSession.beginConfig(); | ||||
|     Logger.info(TAG, 'beginConfig'); | ||||
|     this.capSession.addInput(this.cameraInput); | ||||
|     this.capSession.addOutput(this.previewOutput); | ||||
|     this.capSession.addOutput(this.photoOutPut); | ||||
|     await this.capSession.commitConfig(); | ||||
|     await this.capSession.start(); | ||||
|     Logger.info(TAG, 'captureSession start'); | ||||
|   } | ||||
| 
 | ||||
|   setTakePictureHandleCallback(callback): void { | ||||
|     this.takePictureHandle = callback; | ||||
|   } | ||||
| 
 | ||||
|   /** | ||||
|    * 拍照 | ||||
|    */ | ||||
|   async takePicture(): Promise<void> { | ||||
|     Logger.info(TAG, 'takePicture'); | ||||
|     if (this.currentMode === cameraMode.modeVideo) { | ||||
|       this.currentMode = cameraMode.modePhoto; | ||||
|     } | ||||
|     Logger.info(TAG, `takePicture imageRotation:${this.imageRotation}`); | ||||
|     let photoSettings = { | ||||
|       rotation: this.imageRotation, | ||||
|       quality: camera.QualityLevel.QUALITY_LEVEL_MEDIUM, | ||||
|       location: { | ||||
|         // 位置信息,经纬度 | ||||
|         latitude: 12.9698, | ||||
|         longitude: 77.75, | ||||
|         altitude: 1000, | ||||
|       }, | ||||
|       mirror: false, | ||||
|     }; | ||||
|     await this.photoOutPut.capture(photoSettings); | ||||
|     Logger.info(TAG, 'takePicture done'); | ||||
|     AppStorage.Set('isRefresh', true); | ||||
|   } | ||||
| 
 | ||||
|   /** | ||||
|    * 开始录像 | ||||
|    */ | ||||
|   async startVideo(): Promise<void> { | ||||
|     Logger.info(TAG, 'startVideo begin'); | ||||
|     Logger.info(TAG, 'startVideo 1'); | ||||
|     await this.capSession.stop(); | ||||
|     Logger.info(TAG, 'startVideo 2'); | ||||
|     this.capSession.beginConfig(); | ||||
|     Logger.info(TAG, 'startVideo 3'); | ||||
|     if (this.currentMode === cameraMode.modePhoto) { | ||||
|       this.currentMode = cameraMode.modeVideo; | ||||
|       if (this.photoOutPut) { | ||||
|         this.capSession.removeOutput(this.photoOutPut); | ||||
|         this.photoOutPut.release(); | ||||
|       } | ||||
|     } else { | ||||
|       if (this.videoOutput) { | ||||
|         try { | ||||
|           Logger.info(TAG, 'startVideo 4'); | ||||
|           this.capSession.removeOutput(this.videoOutput); | ||||
|           Logger.info(TAG, 'startVideo 5'); | ||||
|         } catch (e) { | ||||
|           Logger.info(TAG, `startVideo catch e:${JSON.stringify(e)}`); | ||||
|           Logger.info(TAG, `startVideo catch code:${JSON.stringify(e.code)}`); | ||||
|           Logger.info(TAG, `startVideo catch message:${JSON.stringify(e.message)}`); | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|     if (this.videoOutput) { | ||||
|       try { | ||||
|         Logger.info(TAG, 'startVideo 6'); | ||||
|         this.capSession.removeOutput(this.videoOutput); | ||||
|         Logger.info(TAG, 'startVideo 7'); | ||||
|       } catch (e) { | ||||
|         Logger.info(TAG, `startVideo catch e:${JSON.stringify(e)}`); | ||||
|         Logger.info(TAG, `startVideo catch code:${JSON.stringify(e.code)}`); | ||||
|         Logger.info(TAG, `startVideo catch message:${JSON.stringify(e.message)}`); | ||||
|       } | ||||
|       try { | ||||
|         Logger.info(TAG, 'startVideo release 1'); | ||||
|         await this.videoOutput.release(); | ||||
|         Logger.info(TAG, 'startVideo release 2'); | ||||
|       } catch (e) { | ||||
|         Logger.info(TAG, `startVideo catch e:${JSON.stringify(e)}`); | ||||
|         Logger.info(TAG, `startVideo catch code:${JSON.stringify(e.code)}`); | ||||
|         Logger.info(TAG, `startVideo catch message:${JSON.stringify(e.message)}`); | ||||
|       } | ||||
|     } | ||||
|     Logger.info(TAG, 'startVideo 8'); | ||||
|     this.fileAsset = await this.mediaModel.createAndGetUri(mediaLibrary.MediaType.VIDEO); | ||||
|     Logger.info(TAG, `startVideo fileAsset:${this.fileAsset}`); | ||||
|     this.fd = await this.mediaModel.getFdPath(this.fileAsset); | ||||
|     Logger.info(TAG, `startVideo fd:${this.fd}`); | ||||
|     media.createAVRecorder(async (error, recorder) => { | ||||
|       Logger.info(TAG, `startVideo into createAVRecorder:${recorder}`); | ||||
|       if (recorder != null) { | ||||
|         Logger.info(TAG, `startVideo into recorder:${recorder}`); | ||||
|         this.avRecorder = recorder; | ||||
|         Logger.info(TAG, `startVideo createAVRecorder success:${this.avRecorder}`); | ||||
|         // 当前录像配置 | ||||
|         let currConfig = { | ||||
|           audioSourceType: 1, | ||||
|           videoSourceType: this.videoSourceType, | ||||
|           profile: this.videoProfile, | ||||
|           url: `fd://${this.fd}`, | ||||
|           rotation: 0 | ||||
|         }; | ||||
|         Logger.info(TAG, `startVideo into recorder:${recorder}`); | ||||
|         await this.avRecorder.prepare(currConfig); | ||||
|         Logger.info(TAG, `startVideo videoConfig:${JSON.stringify(currConfig)}`); | ||||
|         let videoId = await this.avRecorder.getInputSurface(); | ||||
|         let videoProfile = this.capability.videoProfiles[0]; | ||||
|         Logger.info(TAG, `startVideo capability.videoProfiles[]=: ${JSON.stringify(this.capability.videoProfiles)}`); | ||||
|         Logger.info(TAG, `startVideo videoProfile:${JSON.stringify(videoProfile)}`); | ||||
|         this.videoOutput = this.cameraMgr.createVideoOutput(videoProfile, videoId); | ||||
|         Logger.info(TAG, `startVideo videoOutput:${this.videoOutput}`); | ||||
|         this.capSession.addOutput(this.videoOutput); | ||||
|         Logger.info(TAG, 'startVideo addOutput'); | ||||
|         await this.capSession.commitConfig(); | ||||
|         Logger.info(TAG, 'startVideo commitConfig'); | ||||
|         await this.capSession.start(); | ||||
|         Logger.info(TAG, 'startVideo commitConfig capSession'); | ||||
|         await this.videoOutput.start(); | ||||
|         Logger.info(TAG, 'startVideo commitConfig videoOutput'); | ||||
|         try { | ||||
|           Logger.info(TAG, 'startVideo avRecorder.start 1'); | ||||
|           await this.avRecorder.start(); | ||||
|           Logger.info(TAG, 'startVideo avRecorder.start 2'); | ||||
|         } catch (e) { | ||||
|           Logger.info(TAG, `startVideo catch e:${JSON.stringify(e)}`); | ||||
|         } | ||||
| 
 | ||||
|         Logger.info(TAG, 'startVideo end'); | ||||
| 
 | ||||
|       } else { | ||||
|         Logger.info(TAG, `startVideo createAVRecorder fail, error:${error}`); | ||||
|       } | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   /** | ||||
|    * 停止录像 | ||||
|    */ | ||||
|   async stopVideo(): Promise<void> { | ||||
|     Logger.info(TAG, 'stopVideo called'); | ||||
|     await this.avRecorder.stop(); | ||||
|     await this.avRecorder.release(); | ||||
|     await this.videoOutput.stop(); | ||||
|     await this.fileAsset.close(this.fd); | ||||
|   } | ||||
| 
 | ||||
|   /** | ||||
|    * 资源释放 | ||||
|    */ | ||||
|   async cameraRelease(): Promise<void> { | ||||
|     Logger.info(TAG, 'releaseCamera'); | ||||
|     if (this.cameraInput) { | ||||
|       await this.cameraInput.close(); | ||||
|     } | ||||
|     if (this.previewOutput) { | ||||
|       await this.previewOutput.release(); | ||||
|     } | ||||
|     if (this.photoOutPut) { | ||||
|       await this.photoOutPut.release(); | ||||
|     } | ||||
|     if (this.videoOutput) { | ||||
|       await this.videoOutput.release(); | ||||
|     } | ||||
|     if (this.capSession) { | ||||
|       await this.capSession.release(); | ||||
|     } | ||||
|   } | ||||
| } | ||||
| @ -1,173 +0,0 @@ | ||||
| /* | ||||
|  * Copyright (c) 2023 Hunan OpenValley Digital Industry Development Co., Ltd. | ||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|  * you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  * | ||||
|  *     http://www.apache.org/licenses/LICENSE-2.0
 | ||||
|  * | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, | ||||
|  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|  * See the License for the specific language governing permissions and | ||||
|  * limitations under the License. | ||||
|  */ | ||||
| 
 | ||||
| import mediaLibrary from '@ohos.multimedia.mediaLibrary'; | ||||
| import DateTimeUtil from '../utils/DateTimeUtil'; | ||||
| import Logger from '../utils/Logger'; | ||||
| 
 | ||||
| const TAG = '[MediaModel]'; | ||||
| 
 | ||||
| type FileInfo = { | ||||
|   prefix: string; | ||||
|   suffix: string; | ||||
|   directory: number; | ||||
| }; | ||||
| 
 | ||||
| export default class MediaModel { | ||||
|   private mediaLibraryTest: mediaLibrary.MediaLibrary = undefined; | ||||
|   private static mediaInstance: MediaModel = undefined; | ||||
| 
 | ||||
|   constructor() { | ||||
|     this.mediaLibraryTest = mediaLibrary.getMediaLibrary(globalThis.cameraContext); | ||||
|   } | ||||
| 
 | ||||
|   public static getMediaInstance(): MediaModel { | ||||
|     if (this.mediaInstance === undefined) { | ||||
|       this.mediaInstance = new MediaModel(); | ||||
|     } | ||||
|     return this.mediaInstance; | ||||
|   } | ||||
| 
 | ||||
|   async createAndGetUri(mediaType: mediaLibrary.MediaType): Promise<mediaLibrary.FileAsset> { | ||||
|     let dateTimeUtil: DateTimeUtil = new DateTimeUtil(); | ||||
|     let info: FileInfo = this.getInfoFromMediaType(mediaType); | ||||
|     let name: string = `${dateTimeUtil.getDate()}_${dateTimeUtil.getTime()}`; | ||||
|     let displayName: string = `${info.prefix}${name}${info.suffix}`; | ||||
|     Logger.info(TAG, `displayName = ${displayName},mediaType = ${mediaType}`); | ||||
|     let publicPath: string = await this.mediaLibraryTest.getPublicDirectory( | ||||
|       info.directory | ||||
|     ); | ||||
|     Logger.info(TAG, `publicPath = ${publicPath}`); | ||||
|     let fileAsset: mediaLibrary.FileAsset = await this.mediaLibraryTest.createAsset( | ||||
|       mediaType, | ||||
|       displayName, | ||||
|       publicPath | ||||
|     ); | ||||
|     return fileAsset; | ||||
|   } | ||||
| 
 | ||||
|   async getFile(dataUri: mediaLibrary.FileAsset): Promise<mediaLibrary.FileAsset> { | ||||
|     let fileKeyObj = mediaLibrary.FileKey; | ||||
|     if (dataUri !== undefined) { | ||||
|       let args = dataUri.id.toString(); | ||||
|       let fetchOp = { | ||||
|         selections: `${fileKeyObj.ID}=?`, | ||||
|         selectionArgs: [args], | ||||
|       }; | ||||
|       const fetchFileResult: mediaLibrary.FetchFileResult = await this.mediaLibraryTest.getFileAssets( | ||||
|         fetchOp | ||||
|       ); | ||||
|       Logger.info( | ||||
|         TAG, | ||||
|         `fetchFileResult.getCount() = ${fetchFileResult.getCount()}` | ||||
|       ); | ||||
|       const fileAssets = await fetchFileResult.getAllObject(); | ||||
|       let fileAsset: mediaLibrary.FileAsset = fileAssets[0]; | ||||
|       return fileAsset; | ||||
|     } | ||||
|     return null; | ||||
|   } | ||||
| 
 | ||||
|   async getFdPath(fileAsset: mediaLibrary.FileAsset): Promise<number> { | ||||
|     let fd: number = await fileAsset.open('Rw'); | ||||
|     Logger.info(TAG, `fd = ${fd}`); | ||||
|     return fd; | ||||
|   } | ||||
| 
 | ||||
|   async getFileAssetsFromMediaType(mediaType: number): Promise<Array<mediaLibrary.FileAsset>> { | ||||
|     Logger.info(TAG, `getFileAssetsFromType,mediaType = ${mediaType}`); | ||||
|     let fileKeyObj = mediaLibrary.FileKey; | ||||
|     let fileAssets: Array<mediaLibrary.FileAsset> = []; | ||||
| 
 | ||||
|     try { | ||||
|       let fetchOp = { | ||||
|         selections: `${fileKeyObj.MEDIA_TYPE}=?`, | ||||
|         selectionArgs: [`${mediaType}`], | ||||
|       }; | ||||
|       const fetchFileResult: mediaLibrary.FetchFileResult = await this.mediaLibraryTest.getFileAssets( | ||||
|         fetchOp | ||||
|       ); | ||||
|       Logger.info(TAG, `getFileAssetsFromType,fetchFileResult.count = ${fetchFileResult.getCount()}`); | ||||
|       if (fetchFileResult.getCount() > 0) { | ||||
|         fileAssets = await fetchFileResult.getAllObject(); | ||||
|       } | ||||
|     } catch (err) { | ||||
|       console.info(`LSQ: err ${JSON.stringify(err)}`); | ||||
|     } | ||||
|     return fileAssets; | ||||
|   } | ||||
| 
 | ||||
|   onDateChange(callback: () => void): void { | ||||
|     this.mediaLibraryTest.on('albumChange', () => { | ||||
|       Logger.info(TAG, 'albumChange called'); | ||||
|       callback(); | ||||
|     }); | ||||
|     this.mediaLibraryTest.on('imageChange', () => { | ||||
|       Logger.info(TAG, 'imageChange called'); | ||||
|       callback(); | ||||
|     }); | ||||
|     this.mediaLibraryTest.on('audioChange', () => { | ||||
|       Logger.info(TAG, 'audioChange called'); | ||||
|       callback(); | ||||
|     }); | ||||
|     this.mediaLibraryTest.on('videoChange', () => { | ||||
|       Logger.info(TAG, 'videoChange called'); | ||||
|       callback(); | ||||
|     }); | ||||
|     this.mediaLibraryTest.on('fileChange', () => { | ||||
|       Logger.info(TAG, 'fileChange called'); | ||||
|       callback(); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   offDateChange(): void { | ||||
|     this.mediaLibraryTest.off('albumChange'); | ||||
|     this.mediaLibraryTest.off('imageChange'); | ||||
|     this.mediaLibraryTest.off('audioChange'); | ||||
|     this.mediaLibraryTest.off('videoChange'); | ||||
|     this.mediaLibraryTest.off('fileChange'); | ||||
|   } | ||||
| 
 | ||||
|   getInfoFromMediaType(mediaType: mediaLibrary.MediaType): FileInfo { | ||||
|     let fileInfo: FileInfo = { | ||||
|       prefix: '', | ||||
|       suffix: '', | ||||
|       directory: 0 | ||||
|     }; | ||||
|     switch (mediaType) { | ||||
|       case mediaLibrary.MediaType.FILE: | ||||
|         fileInfo.prefix = 'FILE_'; | ||||
|         fileInfo.suffix = '.txt'; | ||||
|         fileInfo.directory = mediaLibrary.DirectoryType.DIR_DOCUMENTS; | ||||
|         break; | ||||
|       case mediaLibrary.MediaType.IMAGE: | ||||
|         fileInfo.prefix = 'IMG_'; | ||||
|         fileInfo.suffix = '.jpg'; | ||||
|         fileInfo.directory = mediaLibrary.DirectoryType.DIR_IMAGE; | ||||
|         break; | ||||
|       case mediaLibrary.MediaType.VIDEO: | ||||
|         fileInfo.prefix = 'VID_'; | ||||
|         fileInfo.suffix = '.mp4'; | ||||
|         fileInfo.directory = mediaLibrary.DirectoryType.DIR_VIDEO; | ||||
|         break; | ||||
|       case mediaLibrary.MediaType.AUDIO: | ||||
|         fileInfo.prefix = 'AUD_'; | ||||
|         fileInfo.suffix = '.wav'; | ||||
|         fileInfo.directory = mediaLibrary.DirectoryType.DIR_AUDIO; | ||||
|         break; | ||||
|     } | ||||
|     return fileInfo; | ||||
|   } | ||||
| } | ||||
| @ -1,254 +0,0 @@ | ||||
| //@ts-ignore
 | ||||
| import camera from '@ohos.multimedia.camera'; | ||||
| import image from '@ohos.multimedia.image' | ||||
| import buffer from '@ohos.buffer'; | ||||
| import call from '@ohos.telephony.call'; | ||||
| 
 | ||||
| 
 | ||||
| export class cameraService { | ||||
|   constructor(surfaceId) { | ||||
|     this.surfaceId = surfaceId | ||||
|   } | ||||
|   private surfaceId: any = null; | ||||
|   private cameraObj: any = null; | ||||
|   private cameraManager: any = null; | ||||
|   // 相机会话
 | ||||
|   private captureSession: any = null; | ||||
|   // 相机输入流
 | ||||
|   private cameraInput: any = null; | ||||
|   // 预览输出流
 | ||||
|   private previewOutput: any = null; | ||||
|   // 拍照输出流
 | ||||
|   private photoOutput: any = null; | ||||
|   // 照片接收对象
 | ||||
|   private imageRecever: any = null; | ||||
|   private imageSrc: String; | ||||
|   async releaseSource() { | ||||
|      // 停止当前会话
 | ||||
|      await this.captureSession.stop() | ||||
|      // 释放相机输入流
 | ||||
|     await this.cameraInput.close() | ||||
|      // 释放预览输出流
 | ||||
|     await this.previewOutput.release() | ||||
|      // 释放拍照输出流
 | ||||
|     await this.photoOutput.release() | ||||
|      // 释放会话
 | ||||
|     await this.captureSession.release() | ||||
|      // 会话置空
 | ||||
|     this.captureSession = null | ||||
|   } | ||||
| 
 | ||||
|   async initCamera(callBack){ | ||||
|     let cameraManager = await camera.getCameraManager(globalThis.context) | ||||
|     if (!cameraManager) { | ||||
|       console.error("jiangsong camera.getCameraManager error") | ||||
|       return; | ||||
|     } | ||||
|     // 监听相机状态变化
 | ||||
|     cameraManager.on('cameraStatus', (err, cameraStatusInfo) => { | ||||
|       // console.info(`jiangsong camera : ${cameraStatusInfo.camera.cameraId}`);
 | ||||
|       // console.info(`jiangsong status: ${cameraStatusInfo.status}`);
 | ||||
|     }) | ||||
| 
 | ||||
|     // 获取相机列表
 | ||||
|     let cameraArray = await cameraManager.getSupportedCameras(); | ||||
|     if (cameraArray.length <= 0) { | ||||
|       console.error("jiangsong cameraManager.getSupportedCameras error") | ||||
|       return; | ||||
|     } | ||||
| 
 | ||||
|     for (let index = 0; index < cameraArray.length; index++) { | ||||
|       console.info('cameraId : ' + cameraArray[index].cameraId);                          // 获取相机ID
 | ||||
|       console.info('cameraPosition : ' + cameraArray[index].cameraPosition);              // 获取相机位置
 | ||||
|       console.info('cameraType : ' + cameraArray[index].cameraType);                      // 获取相机类型
 | ||||
|       console.info('connectionType : ' + cameraArray[index].connectionType);              // 获取相机连接类型
 | ||||
|     } | ||||
| 
 | ||||
|     // 创建相机输入流
 | ||||
|     try { | ||||
|       this.cameraInput = cameraManager.createCameraInput(cameraArray[0]); | ||||
|     } catch (error) { | ||||
|       console.error('jiangsong Failed to createCameraInput errorCode = ' + error.code); | ||||
|     } | ||||
| 
 | ||||
|     // 监听cameraInput错误信息
 | ||||
|     let cameraDevice = cameraArray[0]; | ||||
|     this.cameraInput.on('error', cameraDevice, (error) => { | ||||
|       console.info(`jiangsong Camera input error code: ${error.code}`); | ||||
|     }) | ||||
| 
 | ||||
|     // 打开相机
 | ||||
|     await this.cameraInput.open((err) => { | ||||
|       if (err) { | ||||
|         console.error(`jiangsong Failed to open the camera. ${err.code}`); | ||||
|         return; | ||||
|       } | ||||
|       console.log('jiangsong Callback returned with camera opened.'); | ||||
|     }); | ||||
|     // 获取相机设备支持的输出流能力
 | ||||
|     let cameraOutputCap = await cameraManager.getSupportedOutputCapability(cameraArray[0]); | ||||
|     if (!cameraOutputCap) { | ||||
|       console.error("jiangsong cameraManager.getSupportedOutputCapability error") | ||||
|       return; | ||||
|     } | ||||
|     console.info("outputCapability: " + JSON.stringify(cameraOutputCap)); | ||||
| 
 | ||||
|     let previewProfilesArray = cameraOutputCap.previewProfiles; | ||||
|     if (!previewProfilesArray) { | ||||
|       console.error("jiangsong createOutput previewProfilesArray == null || undefined") | ||||
|     } | ||||
| 
 | ||||
|     let photoProfilesArray = cameraOutputCap.photoProfiles; | ||||
|     if (!photoProfilesArray) { | ||||
|       console.error("jiangsong createOutput photoProfilesArray == null || undefined") | ||||
|     } | ||||
| 
 | ||||
| 
 | ||||
|     // 创建预览输出流,其中参数 surfaceId 参考上文 XComponent 组件,预览流为XComponent组件提供的surface
 | ||||
|     try { | ||||
|       this.previewOutput = cameraManager.createPreviewOutput(previewProfilesArray[0], this.surfaceId) | ||||
|     } catch (error) { | ||||
|       console.error("jiangsong Failed to create the PreviewOutput instance.") | ||||
|     } | ||||
| 
 | ||||
|     // 监听预览输出错误信息
 | ||||
|     this.previewOutput.on('error', (error) => { | ||||
|       console.info(`jiangosng Preview output error code: ${error.code}`); | ||||
|     }) | ||||
| 
 | ||||
|     // 创建ImageReceiver对象,并设置照片参数:分辨率大小是根据前面 photoProfilesArray 获取的当前设备所支持的拍照分辨率大小去设置
 | ||||
|     this.imageRecever = await image.createImageReceiver(1920, 1080, 4, 8); | ||||
| 
 | ||||
|     this.imageRecever.on('imageArrival',async () => { | ||||
| 
 | ||||
|       console.info(`jiangsong imageArrival `); | ||||
|       let img = await this.imageRecever.readLatestImage() | ||||
|       let component = await img.getComponent(4) | ||||
|       let buf = buffer.from(component.byteBuffer); | ||||
|       let str = buf.toString('base64') | ||||
| 
 | ||||
|       console.log('jiangsong getComponent buf str. ') | ||||
|       if(callBack) { | ||||
|         callBack(str) | ||||
|       } | ||||
|     }) | ||||
|     // 获取照片显示SurfaceId
 | ||||
|     let photoSurfaceId = await this.imageRecever.getReceivingSurfaceId() | ||||
|     // 创建拍照输出流
 | ||||
|     try { | ||||
|       this.photoOutput = cameraManager.createPhotoOutput(photoProfilesArray[0], photoSurfaceId) | ||||
|     } catch (error) { | ||||
|       console.error('jiangsong Failed to createPhotoOutput errorCode = ' + error.code); | ||||
|     } | ||||
|     //创建会话
 | ||||
|     try { | ||||
|       this.captureSession = cameraManager.createCaptureSession() | ||||
|     } catch (error) { | ||||
|       console.error('jiangsong Failed to create the CaptureSession instance. errorCode = ' + error.code); | ||||
|     } | ||||
| 
 | ||||
|     // 监听session错误信息
 | ||||
|     this.captureSession.on('error', (error) => { | ||||
|       console.info(`jiangsong Capture session error code: ${error.code}`); | ||||
|     }) | ||||
| 
 | ||||
|     // 开始配置会话
 | ||||
|     try { | ||||
|       this.captureSession.beginConfig() | ||||
|     } catch (error) { | ||||
|       console.error('jiangsong Failed to beginConfig. errorCode = ' + error.code); | ||||
|     } | ||||
| 
 | ||||
|     // 向会话中添加相机输入流
 | ||||
|     try { | ||||
|       this.captureSession.addInput(this.cameraInput) | ||||
|     } catch (error) { | ||||
|       console.error('jiangsong Failed to addInput. errorCode = ' + error.code); | ||||
|     } | ||||
| 
 | ||||
|     // 向会话中添加预览输出流
 | ||||
|     try { | ||||
|       this.captureSession.addOutput(this.previewOutput) | ||||
|     } catch (error) { | ||||
|       console.error('jiangsong Failed to addOutput(previewOutput). errorCode = ' + error.code); | ||||
|     } | ||||
| 
 | ||||
|     // 向会话中添加拍照输出流
 | ||||
|     try { | ||||
|       this.captureSession.addOutput(this.photoOutput) | ||||
|     } catch (error) { | ||||
|       console.error('jiangsong Failed to addOutput(photoOutput). errorCode = ' + error.code); | ||||
|     } | ||||
| 
 | ||||
|     // 提交会话配置
 | ||||
|     await this.captureSession.commitConfig() | ||||
| 
 | ||||
|     // 启动会话
 | ||||
|     await this.captureSession.start().then(() => { | ||||
|       console.info('jiangsong Promise returned to indicate the session start success.'); | ||||
|     }) | ||||
|     // 判断设备是否支持闪光灯
 | ||||
|     let flashStatus | ||||
|     try { | ||||
|       flashStatus = this.captureSession.hasFlash() | ||||
|     } catch (error) { | ||||
|       console.error('jiangsong Failed to hasFlash. errorCode = ' + error.code); | ||||
|     } | ||||
|     console.info('jiangsong Promise returned with the flash light support status:' + flashStatus); | ||||
| 
 | ||||
|     if (flashStatus) { | ||||
|       // 判断是否支持自动闪光灯模式
 | ||||
|       let flashModeStatus | ||||
|       try { | ||||
|         let status = this.captureSession.isFlashModeSupported(camera.FlashMode.FLASH_MODE_AUTO) | ||||
|         flashModeStatus = status | ||||
|       } catch (error) { | ||||
|         console.error('jiangsong Failed to check whether the flash mode is supported. errorCode = ' + error.code); | ||||
|       } | ||||
|       if(flashModeStatus) { | ||||
|         // 设置自动闪光灯模式
 | ||||
|         try { | ||||
|           this.captureSession.setFlashMode(camera.FlashMode.FLASH_MODE_AUTO) | ||||
|         } catch (error) { | ||||
|           console.error('jiangsong Failed to set the flash mode. errorCode = ' + error.code); | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   takePhoto() { | ||||
|     let settings = { | ||||
|       quality: camera.QualityLevel.QUALITY_LEVEL_HIGH,                                     // 设置图片质量高
 | ||||
|       rotation: camera.ImageRotation.ROTATION_0                                            // 设置图片旋转角度0
 | ||||
|     } | ||||
| 
 | ||||
|     // 使用当前拍照设置进行拍照
 | ||||
|     this.photoOutput.capture(settings, async (err) => { | ||||
|       if (err) { | ||||
|         console.error(`jiangsong Failed to capture the photo ${err.message}` + JSON.stringify(err)); | ||||
|         return; | ||||
|       } | ||||
| 
 | ||||
|       console.info('jiangsong Callback invoked to indicate the photo capture request success.' + JSON.stringify(this.imageRecever)) | ||||
|       // console.info('jiangsong Callback invoked to indicate the photo capture request success.');
 | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   async getPhoto() { | ||||
|       // try {
 | ||||
|       //   let img = await this.imageRecever.readLatestImage()
 | ||||
|       //   // console.log('jiangsong readLatestImage success.' + JSON.stringify(img.clipRect));
 | ||||
|       //   let component = await img.getComponent(4)
 | ||||
|       //   let buf = buffer.from(component.byteBuffer);
 | ||||
|       //   let str = buf.toString('base64')
 | ||||
|       //   console.log('jiangsong getComponent buf str. ' + str.length + '--' + str.slice(0, 100))
 | ||||
|       //   this.imageSrc = str;
 | ||||
|       //   return str;
 | ||||
|       // } catch (e) {
 | ||||
|       //   this.sleep(1000);
 | ||||
|       //   return await this.getPhoto()
 | ||||
|       // }
 | ||||
|   } | ||||
|   sleep = (delay) => new Promise((resolve) => setTimeout(resolve, delay)) | ||||
| 
 | ||||
| } | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user