fix: 视频优化
This commit is contained in:
		
							parent
							
								
									36490c4797
								
							
						
					
					
						commit
						690f28381f
					
				| @ -76,17 +76,11 @@ struct Index { | ||||
|   } | ||||
| 
 | ||||
|   async onPageShow(): Promise<void> { | ||||
|     this.baseInfo = AppStorage.get<BaseInfoType>('baseInfo')! | ||||
|     await UseAuth(this.context) | ||||
|     this.avPlayer.playAudio(['welcome.wav']) | ||||
|     this.baseInfo = AppStorage.get<BaseInfoType>('baseInfo')! | ||||
|     this.initParams() | ||||
|     AppStorage.setOrCreate('singlePlay', false) | ||||
|     this.context.resourceManager.getRawFileContent("welcome.wav") | ||||
|       .then(() => { | ||||
|         this.avPlayer.playAudio(['welcome.wav']) | ||||
|       }) | ||||
|       .catch((error: BusinessError) => { | ||||
|         console.log("getRawFileContent promise error is " + error); | ||||
|       }); | ||||
|     this.num = 0 | ||||
|     AppStorage.setOrCreate('lsh', '1111111111111') | ||||
|   } | ||||
|  | ||||
| @ -1,12 +1,18 @@ | ||||
| import { VideoConfigData } from '../mock' | ||||
| import { VideoConfig, VideoItemType } from '../model' | ||||
| import { RecordHandleType, VideoConfig, VideoItemType } from '../model' | ||||
| import FileUtils from '../utils/FileUtils' | ||||
| import HeaderComponent from './compontents/Header' | ||||
| import VideoConfigComponent from './VideoConfig/Config' | ||||
| import common from '@ohos.app.ability.common' | ||||
| import { GlobalConfig } from '../config' | ||||
| import Prompt from '@system.prompt' | ||||
| import { endRecordVideo, startRecordVideo, takePhoto } from '../utils/Video' | ||||
| 
 | ||||
| @Entry | ||||
| @Component | ||||
| struct VideoConfigPage { | ||||
|   @State videoConfig: VideoConfig = VideoConfigData | ||||
|   @State oldVideoConfig: VideoConfig = VideoConfigData | ||||
|   @State curRate: PlaybackSpeed = PlaybackSpeed.Speed_Forward_1_00_X | ||||
|   @State openFlag: boolean = true | ||||
|   // 是否自动播放 | ||||
| @ -15,11 +21,29 @@ struct VideoConfigPage { | ||||
|   // 弹窗 | ||||
|   dialogController: CustomDialogController = new CustomDialogController({ | ||||
|     builder: VideoConfigComponent({ | ||||
|       videoConfig: this.videoConfig | ||||
|       videoConfig: this.videoConfig, | ||||
|       back: () => { | ||||
|         console.log("返回") | ||||
|         this.videoConfig = this.oldVideoConfig | ||||
|       }, | ||||
|       save: (config: VideoConfig) => { | ||||
|         console.log("保存", config) | ||||
|         this.videoConfig = config | ||||
|         this.saveVideoConfig() | ||||
|       }, | ||||
|     }), | ||||
|     alignment: DialogAlignment.Bottom, | ||||
|     customStyle: true | ||||
|   }) | ||||
|   @State recordHandleObj: RecordHandleType = { | ||||
|     rocord_handle1: 0, | ||||
|     rocord_handle2: 0, | ||||
|     rocord_handle3: 0, | ||||
|     rocord_handle4: 0 | ||||
|   } | ||||
|   // 文件操作 | ||||
|   private fileUtil: FileUtils | ||||
|   private context = getContext(this) as common.UIAbilityContext; | ||||
|   // 视频控制器 | ||||
|   private controller1: VideoController = new VideoController() | ||||
|   private controller2: VideoController = new VideoController() | ||||
| @ -33,6 +57,37 @@ struct VideoConfigPage { | ||||
|     { td: 'td4', controller: this.controller4, src: '' }, | ||||
|   ] | ||||
| 
 | ||||
|   aboutToAppear(): void { | ||||
|     this.fileUtil = new FileUtils(this.context) | ||||
|     this.readVideoConfig() | ||||
|   } | ||||
| 
 | ||||
|   // 读取视频配置 | ||||
|   async readVideoConfig() { | ||||
|     const data = await this.fileUtil.readFile(GlobalConfig.commonFileWriteAddress + '/config/config3.txt'); | ||||
|     this.videoConfig = JSON.parse(data) | ||||
|     this.oldVideoConfig = JSON.parse(data); | ||||
|   } | ||||
| 
 | ||||
|   // 保存视频配置 | ||||
|   async saveVideoConfig() { | ||||
|     const folderPath = await this.fileUtil.initFolder(`/config`); | ||||
|     console.log(this.oldVideoConfig.videoNum, this.videoConfig.videoNum, "查看") | ||||
|     this.fileUtil.addFile(`${folderPath}/config3.txt`, JSON.stringify(this.videoConfig)) | ||||
|   } | ||||
| 
 | ||||
|   async getFileHandleCode(td: number): Promise<Boolean> { | ||||
|     return new Promise(async (resolve, reject) => { | ||||
|       try { | ||||
|         const record_handle = await startRecordVideo(this.videoConfig, td, this.context, 'lp') | ||||
|         Reflect.set(this.recordHandleObj, 'rocord_handle' + td, record_handle) | ||||
|         resolve(true) | ||||
|       } catch (error) { | ||||
|         reject(false) | ||||
|       } | ||||
|     }) | ||||
|   } | ||||
| 
 | ||||
|   build() { | ||||
|     Flex({ | ||||
|       justifyContent: FlexAlign.SpaceBetween, | ||||
| @ -80,22 +135,65 @@ struct VideoConfigPage { | ||||
|           // 录像 | ||||
|           ButtonComponent({ | ||||
|             type: "1", | ||||
|             click: () => { | ||||
|               this.dialogController.open() | ||||
|             click: async () => { | ||||
|               if (!this.videoConfig.videoRecord4 && !this.videoConfig.videoRecord3 && !this.videoConfig.videoRecord2 && !this.videoConfig.videoRecord1) { | ||||
|                 Prompt.showToast({ | ||||
|                   message: '请选择录像通道', | ||||
|                   duration: 3000 | ||||
|                 }) | ||||
|                 return | ||||
|               } | ||||
| 
 | ||||
|               for (let i = 1; i <= 4; i++) { | ||||
|                 if (Reflect.get(this.videoConfig, 'videoRecord' + i)) { | ||||
|                   await this.getFileHandleCode(i) | ||||
|                 } | ||||
|               } | ||||
|               //   录像开始 | ||||
|               Prompt.showToast({ | ||||
|                 message: '录像开始!', | ||||
|                 duration: 3000 | ||||
|               }) | ||||
| 
 | ||||
|             } | ||||
|           }) | ||||
|           // 停止 | ||||
|           ButtonComponent({ | ||||
|             type: "2", | ||||
|             click: () => { | ||||
|               this.dialogController.open() | ||||
|               for (let i = 1; i <= 4; i++) { | ||||
|                 if (Reflect.get(this.recordHandleObj, 'rocord_handle' + i) !== 0) { | ||||
|                   endRecordVideo(Reflect.get(this.recordHandleObj, 'rocord_handle' + i)) | ||||
|                   Reflect.set(this.recordHandleObj, 'rocord_handle' + i, 0) | ||||
|                 } | ||||
|               } | ||||
|               Prompt.showToast({ | ||||
|                 message: '录像已停止!', | ||||
|                 duration: 3000 | ||||
|               }) | ||||
|             } | ||||
|           }) | ||||
|           // 抓图 | ||||
|           ButtonComponent({ | ||||
|             type: "3", | ||||
|             click: () => { | ||||
|               this.dialogController.open() | ||||
|             click: async () => { | ||||
|               const arr = ['1', '2', '3', '4'] | ||||
|               if (!arr.includes(this.videoConfig.pztd)) { | ||||
|                 Prompt.showToast({ | ||||
|                   message: '请填写正确的拍照通道', | ||||
|                   duration: 3000 | ||||
|                 }) | ||||
|                 return | ||||
|               } | ||||
|               try { | ||||
|                 await takePhoto(this.videoConfig, this.context, 'pz/') | ||||
|                 Prompt.showToast({ | ||||
|                   message: '抓图完成', | ||||
|                   duration: 3000 | ||||
|                 }) | ||||
|               } catch (error) { | ||||
|                 console.log("抓图失败", error) | ||||
|               } | ||||
|             } | ||||
|           }) | ||||
|         } | ||||
|  | ||||
| @ -8,6 +8,8 @@ import TextInputComponent from './TextInput'; | ||||
| @CustomDialog | ||||
| export default struct VideoConfigComponent { | ||||
|   @Prop videoConfig: VideoConfig | ||||
|   save?: (value: VideoConfig) => void; | ||||
|   back?: () => void; | ||||
|   private controller?: CustomDialogController; | ||||
| 
 | ||||
|   build() { | ||||
| @ -20,9 +22,11 @@ export default struct VideoConfigComponent { | ||||
|         Row() { | ||||
|           Image($r('app.media.fh')).height(55).objectFit(ImageFit.Contain).onClick(() => { | ||||
|             this.controller?.close() | ||||
|             this.back?.(); | ||||
|           }) | ||||
|           Image($r('app.media.bc')).height(55).objectFit(ImageFit.Contain).onClick(() => { | ||||
|             console.log(JSON.stringify(this.videoConfig)) | ||||
|             this.controller?.close() | ||||
|             this.save?.(this.videoConfig); | ||||
|           }) | ||||
|         } | ||||
|       }.padding({ | ||||
| @ -93,16 +97,36 @@ export default struct VideoConfigComponent { | ||||
|           Column() { | ||||
|             titleComponent() | ||||
|             blockComponent({ | ||||
|               label: "第一路" | ||||
|               label: "第一路", | ||||
|               num: 1, | ||||
|               videoConfig: this.videoConfig, | ||||
|               change: (value: VideoConfig) => { | ||||
|                 this.videoConfig = value; | ||||
|               } | ||||
|             }) | ||||
|             blockComponent({ | ||||
|               label: "第二路" | ||||
|               label: "第二路", | ||||
|               num: 2, | ||||
|               videoConfig: this.videoConfig, | ||||
|               change: (value: VideoConfig) => { | ||||
|                 this.videoConfig = value; | ||||
|               } | ||||
|             }) | ||||
|             blockComponent({ | ||||
|               label: "第三路" | ||||
|               label: "第三路", | ||||
|               num: 3, | ||||
|               videoConfig: this.videoConfig, | ||||
|               change: (value: VideoConfig) => { | ||||
|                 this.videoConfig = value; | ||||
|               } | ||||
|             }) | ||||
|             blockComponent({ | ||||
|               label: "第四路" | ||||
|               label: "第四路", | ||||
|               num: 4, | ||||
|               videoConfig: this.videoConfig, | ||||
|               change: (value: VideoConfig) => { | ||||
|                 this.videoConfig = value; | ||||
|               } | ||||
|             }) | ||||
|           }.width("75%") | ||||
| 
 | ||||
| @ -215,6 +239,9 @@ export default struct VideoConfigComponent { | ||||
| @Component | ||||
| struct blockComponent { | ||||
|   @State label: string = "第一路" | ||||
|   @Prop videoConfig: VideoConfig | ||||
|   @State num: number = 1 | ||||
|   change?: (value: VideoConfig) => void; | ||||
| 
 | ||||
|   build() { | ||||
|     Row() { | ||||
| @ -224,28 +251,49 @@ struct blockComponent { | ||||
| 
 | ||||
|       // IP地址 | ||||
|       TextInputComponent({ | ||||
|         value: "", | ||||
|         widthValue: 200 | ||||
|         value: this.videoConfig.ip, | ||||
|         widthValue: 200, | ||||
|         change: (value: string) => { | ||||
|           this.videoConfig.ip = value; | ||||
|           this.change?.(this.videoConfig); | ||||
|         } | ||||
|       }) | ||||
| 
 | ||||
|       // 通道号 | ||||
|       TextInputComponent({ | ||||
|         value: "", | ||||
|         widthValue: 100 | ||||
|         value: Reflect.get(this.videoConfig, `td${this.num}`) || '', | ||||
|         widthValue: 100, | ||||
|         change: (value: string) => { | ||||
|           Reflect.set(this.videoConfig, `td${this.num}`, value); | ||||
|           this.change?.(this.videoConfig); | ||||
|         } | ||||
|       }) | ||||
|       // 用户名 | ||||
|       TextInputComponent({ | ||||
|         value: "", | ||||
|         widthValue: 200 | ||||
|         value: this.videoConfig.userName, | ||||
|         widthValue: 200, | ||||
|         change: (value: string) => { | ||||
|           this.videoConfig.userName = value; | ||||
|           this.change?.(this.videoConfig); | ||||
|         } | ||||
|       }) | ||||
|       // 密码 | ||||
|       TextInputComponent({ | ||||
|         value: "", | ||||
|         widthValue: 200 | ||||
|         value: this.videoConfig.pwd, | ||||
|         widthValue: 200, | ||||
|         change: (value: string) => { | ||||
|           this.videoConfig.pwd = value; | ||||
|           this.change?.(this.videoConfig); | ||||
|         } | ||||
|       }) | ||||
|       // 端口号 | ||||
|       TextInputComponent({ | ||||
|         value: "", | ||||
|         widthValue: 100 | ||||
|         value: this.videoConfig.port, | ||||
|         widthValue: 100, | ||||
|         change: (value: string) => { | ||||
|           this.videoConfig.port = value; | ||||
|           this.change?.(this.videoConfig); | ||||
|         } | ||||
|       }) | ||||
|     }.margin({ | ||||
|       top: 10 | ||||
| @ -264,14 +312,6 @@ struct partitionSpace { | ||||
| 
 | ||||
| @Component | ||||
| struct titleComponent { | ||||
|   @Styles | ||||
|   commStyle(){ | ||||
|     .width(220) | ||||
|     .height(69) | ||||
|     .backgroundImage($r('app.media.button_nor')) | ||||
|     .backgroundImageSize({ width: '100%', height: '100%' }) | ||||
|   } | ||||
| 
 | ||||
|   build() { | ||||
|     Row() { | ||||
|       Row() { | ||||
|  | ||||
| @ -29,6 +29,7 @@ export default class VoiceAnnounce { | ||||
|   async playAudio(urls: string[], shit?: boolean, callbackFn?: Function) { | ||||
|     const isStopped = this.isStopped; | ||||
|     const queue = this.queue; | ||||
|     console.log(TAG, "播放") | ||||
| 
 | ||||
|     const tempUrls: Queue[] = urls.map((url, index) => { | ||||
|       const callback: Function | undefined = (index === urls.length - 1) ? callbackFn : undefined | ||||
| @ -94,6 +95,7 @@ class AVPlayer { | ||||
| 
 | ||||
|   // 以下为使用资源管理接口获取打包在HAP内的媒体资源文件并通过fdSrc属性进行播放示例 | ||||
|   async play(name: string, callback: Function): Promise<boolean> { | ||||
|     console.log(TAG, 'play => 开始播放语音') | ||||
|     try { | ||||
|       //检查SD中的语音 | ||||
|       // console.info('surenjun name',name) | ||||
| @ -128,7 +130,7 @@ class AVPlayer { | ||||
|       this.endCallback = callback | ||||
|       this.avPlayer = await media.createAVPlayer(); | ||||
|       return new Promise(async (resolve, reject) => { | ||||
|         await this.setAVPlayerCallback(() => { | ||||
|         this.setAVPlayerCallback(() => { | ||||
|           resolve(true) | ||||
|         }); | ||||
|         try { | ||||
| @ -148,8 +150,7 @@ class AVPlayer { | ||||
| 
 | ||||
|   async queryFile(displayName: string): Promise<mediaLibrary.FileAsset> { | ||||
|     return new Promise(async (resolve, reject) => { | ||||
|       const context = AppStorage.get<common.UIAbilityContext>('context') | ||||
|       const mediaLib = mediaLibrary.getMediaLibrary(context); | ||||
|       const mediaLib = mediaLibrary.getMediaLibrary(this.context); | ||||
|       let fileResult = await mediaLib.getFileAssets({ | ||||
|         selections: `media_type=?  AND display_name = ?`, | ||||
|         selectionArgs: [`${mediaLibrary.MediaType.AUDIO}`, displayName], | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user