diff --git a/entry/src/main/ets/pages/VideoConfig.ets b/entry/src/main/ets/pages/VideoConfig.ets index f01dfbb0..e3ae7d91 100644 --- a/entry/src/main/ets/pages/VideoConfig.ets +++ b/entry/src/main/ets/pages/VideoConfig.ets @@ -55,11 +55,12 @@ struct Index { TopLogo({ outFlag: $outFlag }) Flex({ justifyContent: FlexAlign.SpaceBetween }) { Flex({ wrap: FlexWrap.Wrap, direction: FlexDirection.Row }) { - ForEach(this.videoArr, (item: VideoItemType, index) => { + ForEach(this.videoArr, (item: VideoItemType) => { Video({ src: this.openFlag ? - `rtsp://${this.param.userName}:${this.param.pwd}@${this.param.ip}:${this.param.port}/h264/ch${this.getTdValueByTd(item.td)}/main/av_stream` : - '', + // `rtsp://${this.param.userName}:${this.param.pwd}@${this.param.ip}:${this.param.port}/h264/ch${this.param[item.td]}/main/av_stream` : '', + `rtsp://${this.param.userName}:${this.param.pwd}@${this.param.ip}:${this.param.port}/h264/ch${Reflect.get(this.param, + 'port')}/main/av_stream` : '', currentProgressRate: this.curRate, controller: item.controller }) @@ -103,11 +104,11 @@ struct Index { this.videoStartFlag = true // for (let i = 1; i <= 4; i++) { // if (this.param['videoRecord'+i]) { - // await this.getFileHandleCode(i) + // await this.getfilehandleCode(i) // } // } for (let i = 1; i <= 4; i++) { - if (this.getVideoRecordValue(i)) { + if (Reflect.get(this.param, 'videoRecord' + i)) { await this.getFileHandleCode(i); } } @@ -124,18 +125,19 @@ struct Index { .margin({ bottom: 10 * this.ratio }) .onClick(() => { // for (let i = 1; i <= 4; i++) { + // console.log('rocord_handle', i, JSON.stringify(this.rocordHandleObj)) // if (this.rocordHandleObj['rocord_handle'+i]) { - // endRecordVideo(this.rocordHandleObj['rocord_handle'+i]) + // endRecordVideo(this.rocordHandleObj) // this.rocordHandleObj['rocord_handle'+i] = 0 // } // } for (let i = 1; i <= 4; i++) { - const handle: ESObject = this.getRecordHandle(i); - if (handle) { - endRecordVideo(handle); - this.setRecordHandle(i, 0); + if (Reflect.get(this.rocordHandleObj, 'rocord_handle' + i)) { + Reflect.set(this.rocordHandleObj, 'rocord_handle' + i, 0); } } + endRecordVideo(this.rocordHandleObj); + promptAction.showToast({ message: '录像结束', duration: 3000 @@ -356,7 +358,11 @@ struct Index { .onChange((value: string) => { this.param.ip = value }) - TextInput({ text: this.getTdValueByIndex((Number(index) + 1)), controller: this.inputController }) + // TextInput({ text: this.param['td'+(Number(index) + 1)], controller: this.inputController }) + TextInput({ + text: Reflect.get(this.param, 'td' + (Number(index) + 1)), + controller: this.inputController + }) .type(InputType.Normal) .borderRadius(2) .width(96 * this.ratio) @@ -366,7 +372,7 @@ struct Index { .fontSize(this.inputFontSize * this.ratio) .onChange((value: string) => { // this.param['td'+(Number(index) + 1)] = value - this.setTdValue(Number(index) + 1, value) + Reflect.set(this.param, 'td' + (Number(index) + 1), value); }) TextInput({ text: this.param.userName, controller: this.inputController }) .type(InputType.Normal) @@ -583,8 +589,8 @@ struct Index { } aboutToAppear() { - const radio = AppStorage.get('ratio') as number - this.ratio = radio + // this.ratio = globalThis.ratio + this.ratio = AppStorage.get('ratio') this.openFlag = true const fileUtil = new FileUtil(this.context) this.fileUtil = fileUtil @@ -592,105 +598,13 @@ struct Index { } async getFileHandleCode(td: number): Promise { - return new Promise(async (resolve, reject) => { - const record_handle: ESObject = await startRecordVideo(this.param, td, this.context, 'lp'); - this.setRecordHandle(td, record_handle); - resolve(); - }); - } + return new Promise(async (resolve, reject) => { + const record_handle = await startRecordVideo(this.param, td, this.context, 'lp') + // this.rocordHandleObj['rocord_handle'+td] = record_handle + Reflect.set(this.rocordHandleObj, 'rocord_handle' + td, record_handle); + resolve() + }) - getRecordHandle(index: number): ESObject { - switch (index) { - case 1: - return this.rocordHandleObj.rocord_handle1; - case 2: - return this.rocordHandleObj.rocord_handle2; - case 3: - return this.rocordHandleObj.rocord_handle3; - case 4: - return this.rocordHandleObj.rocord_handle4; - default: - return null; - } - } - - getVideoRecordValue(index: number): boolean { - switch (index) { - case 1: - return this.param.videoRecord1; - case 2: - return this.param.videoRecord2; - case 3: - return this.param.videoRecord3; - case 4: - return this.param.videoRecord4; - default: - return false; - } - } - - getTdValueByTd(td: string): string { - switch (td) { - case 'td1': - return this.param.td1; - case 'td2': - return this.param.td2; - case 'td3': - return this.param.td3; - case 'td4': - return this.param.td4; - default: - return ''; - } - } - - getTdValueByIndex(index: number): string { - switch (index) { - case 1: - return this.param.td1; - case 2: - return this.param.td2; - case 3: - return this.param.td3; - case 4: - return this.param.td4; - default: - return ''; - } - } - - setTdValue(index: number, value: string): void { - switch (index) { - case 1: - this.param.td1 = value; - break; - case 2: - this.param.td2 = value; - break; - case 3: - this.param.td3 = value; - break; - case 4: - this.param.td4 = value; - break; - } - } - - setRecordHandle(td: number, record_handle: ESObject): void { - switch (td) { - case 1: - this.rocordHandleObj.rocord_handle1 = record_handle; - break; - case 2: - this.rocordHandleObj.rocord_handle2 = record_handle; - break; - case 3: - this.rocordHandleObj.rocord_handle3 = record_handle; - break; - case 4: - this.rocordHandleObj.rocord_handle4 = record_handle; - break; - } } outClick() { diff --git a/entry/src/main/ets/pages/judgeSDK/judge.ets b/entry/src/main/ets/pages/judgeSDK/judge.ets index 508aec0d..23b58d14 100644 --- a/entry/src/main/ets/pages/judgeSDK/judge.ets +++ b/entry/src/main/ets/pages/judgeSDK/judge.ets @@ -13,7 +13,6 @@ import JudgeTask from './utils/judgeTask'; import { judgeConfig } from './utils/judgeConfig'; import UsbService from '../../service/usbService'; import { KF, LANE } from '../judgeSDK/api/judgeSDK.d'; -import { endRecordVideo, saveStartRecordVideo } from '../../service/videoService'; import { Array2Byte, convertGpsCoord2, @@ -53,6 +52,7 @@ import { examJudgeVersion } from './api/index'; import { writeObjectOut } from '../../api/judge'; +import { saveStartRecordVideo } from '../../utils/Video'; const judgeTag = 'SURENJUN_JUDGE' @@ -260,40 +260,6 @@ export default class Judge { private isExamEnd: boolean // 是否发送udp private isUdpEnd: boolean = false - // 处理udp plc信号 - handleUdp = async (msg) => { - console.info('plc信号', msg) - // const { fileLog, getPlcData, usbService, isUdpEnd, isExamEnd, judgeUI } = this - const stachArr = msg.split(',') - if (stachArr[0] != '#DN_GD' || this.isUdpEnd) { - return - } - const plcData = await this.getPlcData(msg); - // 4.过程数据 - await this.fileLog.setExamJudgeData(plcData) - //检测到有无锡所设备接入,需要发送特定的数据,供检测 - if (this.usbService.isWXUSBDevice) { - const str = await senorToWXDataStr(msg); - this.usbService.sendUSB(str) - } - const param350 = this.judgeUI.judgeConfigObj['350'] - this.judgeUI.sd = ((param350 == 0 ? plcData.gps.sd : plcData.sensor.cs) as number * 1.852).toFixed(0) + '' - this.judgeUI.dw = (Math.floor(plcData.sensor.dw as number) || 0) + '' - //TODO 暂时关闭差分检测异常 - // await this.checkDwzt(plcData.gps.dwzt,plcData.gps.jdzt); - if (!this.isExamEnd) { - await examJudgeRealExam(plcData) - } - let udpIndex = AppStorage.get('udpIndex') as number; - let [prevJd, preWd] = [0, 0] - if (udpIndex % 5 === 0 && !this.isUdpEnd) { - // TODO UPD缺失 - // const judgeUdp = globalThis.judgeUdp - // const bytes = await this.getMessageHeartbeat(this.isExamEnd); - // judgeUdp.send(bytes) - } - AppStorage.setOrCreate('udpIndex', udpIndex++) - } //是否手动结束考试 private isManual: boolean //UDP服务序列号 @@ -480,6 +446,40 @@ export default class Judge { return tempData } + // 处理udp plc信号 + handleUdp = async (msg) => { + console.info('plc信号', msg) + // const { fileLog, getPlcData, usbService, isUdpEnd, isExamEnd, judgeUI } = this + const stachArr = msg.split(',') + if (stachArr[0] != '#DN_GD' || this.isUdpEnd) { + return + } + const plcData = await this.getPlcData(msg); + // 4.过程数据 + await this.fileLog.setExamJudgeData(plcData) + //检测到有无锡所设备接入,需要发送特定的数据,供检测 + if (this.usbService.isWXUSBDevice) { + const str = await senorToWXDataStr(msg); + this.usbService.sendUSB(str) + } + const param350 = this.judgeUI.judgeConfigObj['350'] + this.judgeUI.sd = ((param350 == 0 ? plcData.gps.sd : plcData.sensor.cs) as number * 1.852).toFixed(0) + '' + this.judgeUI.dw = (Math.floor(plcData.sensor.dw as number) || 0) + '' + //TODO 暂时关闭差分检测异常 + // await this.checkDwzt(plcData.gps.dwzt,plcData.gps.jdzt); + if (!this.isExamEnd) { + await examJudgeRealExam(plcData) + } + let udpIndex = AppStorage.get('udpIndex') as number; + let [prevJd, preWd] = [0, 0] + if (udpIndex % 5 === 0 && !this.isUdpEnd) { + // TODO UPD缺失 + // const judgeUdp = globalThis.judgeUdp + // const bytes = await this.getMessageHeartbeat(this.isExamEnd); + // judgeUdp.send(bytes) + } + AppStorage.setOrCreate('udpIndex', udpIndex++) + } // 处理轨迹plc信号 handleTrajectoryUdp = async (strArr) => { // const { fileLog, setJudgeItem, setJudgeMark, endExam } = this; @@ -523,67 +523,6 @@ export default class Judge { private isTrajectoryOpen: boolean; // 调代理接口是否断网了 private isJudgeDisConnect: boolean; - // 考试过程照片 - uploadProgressPhoto = async (ksxm) => { - const time = await getCurrentTime(); - const { judgeUI, plcData, getPhoto, fileLog, filePath } = this; - const photoBase64 = await getPhoto(); - const carInfo = AppStorage.get('carInfo'); - const { examSubject, plateNo, carNo } = carInfo; - const { lsh, idCard, serialNumber, projectsObj, ksdd, judgeConfigObj } = judgeUI; - const { sensor, gps } = plcData - const project = projectsObj[ksxm] - - const data = { - xtlb: '17', - jkxlh: serialNumber, - jkid: '17C54', - drvexam: { - lsh, - kskm: examSubject, - ksxm: project.projectCodeCenter, - sfzmhm: idCard, - kchp: encodeURI(plateNo), - zpsj: time, - zp: photoBase64, - cs: Math.floor((judgeConfigObj['350'] == 0 ? gps.sd : sensor.cs) * 1.852), - ksdd: encodeURI(ksdd) - } - }; - const { code } = await this.sendWriteObjectOut(data, filePath); - if (code === 2300007) { - this.isJudgeDisConnect = true - } - promptWxCode('17C54', code) - console.info(judgeTag, '上传照片 end') - } - private artSubject3ProjectsCodesArr: number[] = [3, 9, 4, 10, 12, 11] - private lane: LANE = { - road: '', num: 0, count: 0 - } - private videoData: any - private disConnectNum: number = 0; - //调用监管接口 - sendWriteObjectOut = async (data, filePath) => { - const temp = await writeObjectOut(data, filePath); - console.log("wzj", JSON.stringify(temp)) - //断网&网络超时次数计算 - if (temp.code == 2300007 || temp.code == 2300028) { - this.disConnectNum += 1; - if (this.disConnectNum < 5) { - return await this.sendWriteObjectOut(data, filePath) - } - } - - if (this.disConnectNum >= 5) { - console.info('surenjun', '123') - this.judgeUI.errorMsg = '当前的考试过程信息网络传输异常,程序点击确认将重启!'; - this.judgeUI.disConnectErrorOpen = true - } - - this.disConnectNum = 0 - return temp - } // 项目开始接口同步 beginProject = async (ksxm) => { const carInfo = AppStorage.get('carInfo'); @@ -656,6 +595,67 @@ export default class Judge { console.info(judgeTag, '项目结束 end') promptWxCode('17C55', code) } + private artSubject3ProjectsCodesArr: number[] = [3, 9, 4, 10, 12, 11] + private lane: LANE = { + road: '', num: 0, count: 0 + } + private videoData: any + private disConnectNum: number = 0; + //调用监管接口 + sendWriteObjectOut = async (data, filePath) => { + const temp = await writeObjectOut(data, filePath); + console.log("wzj", JSON.stringify(temp)) + //断网&网络超时次数计算 + if (temp.code == 2300007 || temp.code == 2300028) { + this.disConnectNum += 1; + if (this.disConnectNum < 5) { + return await this.sendWriteObjectOut(data, filePath) + } + } + + if (this.disConnectNum >= 5) { + console.info('surenjun', '123') + this.judgeUI.errorMsg = '当前的考试过程信息网络传输异常,程序点击确认将重启!'; + this.judgeUI.disConnectErrorOpen = true + } + + this.disConnectNum = 0 + return temp + } + // 考试过程照片 + uploadProgressPhoto = async (ksxm) => { + const time = await getCurrentTime(); + const { judgeUI, plcData, getPhoto, fileLog, filePath } = this; + const photoBase64 = await getPhoto(); + const carInfo = AppStorage.get('carInfo'); + const { examSubject, plateNo, carNo } = carInfo; + const { lsh, idCard, serialNumber, projectsObj, ksdd, judgeConfigObj } = judgeUI; + const { sensor, gps } = plcData + const project = projectsObj[ksxm] + + const data = { + xtlb: '17', + jkxlh: serialNumber, + jkid: '17C54', + drvexam: { + lsh, + kskm: examSubject, + ksxm: project.projectCodeCenter, + sfzmhm: idCard, + kchp: encodeURI(plateNo), + zpsj: time, + zp: photoBase64, + cs: Math.floor((judgeConfigObj['350'] == 0 ? gps.sd : sensor.cs) * 1.852), + ksdd: encodeURI(ksdd) + } + }; + const { code } = await this.sendWriteObjectOut(data, filePath); + if (code === 2300007) { + this.isJudgeDisConnect = true + } + promptWxCode('17C54', code) + console.info(judgeTag, '上传照片 end') + } constructor(judgeUI) { this.serialIndex = 1; @@ -1252,7 +1252,6 @@ export default class Judge { const bytes = await this.getMessageHeartbeat(true); globalThis.judgeUdp.send(bytes) } - await endExam() } catch (e) { console.info(judgeTag, JSON.stringify(e)) // setTimeout(() => { @@ -1260,6 +1259,7 @@ export default class Judge { // router.back(); // }, 3000) } + await endExam() }); } diff --git a/entry/src/main/ets/pages/judgeSDK/utils/voiceAnnouncements.ts b/entry/src/main/ets/pages/judgeSDK/utils/voiceAnnouncements.ts index 3bcffcb8..0f8cbaaf 100644 --- a/entry/src/main/ets/pages/judgeSDK/utils/voiceAnnouncements.ts +++ b/entry/src/main/ets/pages/judgeSDK/utils/voiceAnnouncements.ts @@ -3,6 +3,7 @@ import Prompt from '@system.prompt'; import url from '@ohos.url'; import fileuri from "@ohos.file.fileuri"; import mediaLibrary from '@ohos.multimedia.mediaLibrary'; +import common from '@ohos.app.ability.common'; const TAG = 'VoiceAnnounce' @@ -125,7 +126,7 @@ class AVPlayer { resolve() }); try { - const context = AppStorage.get('context') + const context: common.UIAbilityContext = AppStorage.get('context') this.avPlayer.fdSrc = await context.resourceManager.getRawFd(name); } catch (e) { Prompt.showToast({ @@ -175,7 +176,6 @@ class AVPlayer { // 注册avplayer回调函数 setAVPlayerCallback(callBack) { - this.avPlayer.on('error', (err) => { this.avPlayer && this.avPlayer.stop() this.avPlayer && this.avPlayer.reset() diff --git a/entry/src/main/ets/utils/MediaPlayer.ets b/entry/src/main/ets/utils/MediaPlayer.ets new file mode 100644 index 00000000..7ed99995 --- /dev/null +++ b/entry/src/main/ets/utils/MediaPlayer.ets @@ -0,0 +1,291 @@ +import media from '@ohos.multimedia.media'; +import common from '@ohos.app.ability.common'; +import fs from '@ohos.file.fs'; + +export enum PlayStatus { + /** + * 闲置状态, Player刚被创建或者调用了reset方法之后, 进入该状态, 触发idle回调事件 + */ + Idle, + /** + * 资源初始化, 调用setSource进入该状态, 触发initialized回调事件 + */ + Init, + /** + * 已准备状态, 在Init状态调用prepare方法后进入该状态, 触发prepared回调事件 + */ + Prepared, + /** + * 正在播放状态, Prepared/Paused/Completed状态调用play方法进入该状态, 触发playing回调事件 + */ + Playing, + /** + * 暂停状态, 在Playing状态调用pause方法进入该状态, 触发paused回调事件 + */ + Paused, + /** + * 播放至结尾状态, loop为false时播放到结尾进入该状态, 此时调用play会进入Playing状态和重播, 调用stop进入Stopped状态, 触发completed回调 + */ + Completed, + /** + * 停止状态, Prepared/Playing/Paused/Completed状态调用stop方法进入该状态, 触发stopped回调 + */ + Stopped, + /** + * 销毁状态, 调用release方法后进入该状态, 触发released回调 + */ + Released, + /** + * 错误状态, 当播放引擎发生不可逆的错误进入该状态, 可以调用reset重置, 也可以调用release销毁重建, 触发error回调 + */ + Error +} + +interface PlayerOption { + mode: "audio" | "video" + loop: boolean +} + +export type PlayerSourceType = "network" | "raw" | "local" + +type PlayerEvent = media.AVPlayerState | "status" + +interface PlayerSourceOption { + /** + * 资源类型 默认为network:网络类型, raw:app预置到resource/rawfile的文件, local:应用沙箱内文件 + */ + type?: PlayerSourceType + /** + * type为network时, 传入网络url type为raw时, 传入相对路径 type为local时, 传入沙箱相对路径 + */ + url: string +} + +export class MediaPlayer { + private context: common.UIAbilityContext + private player?: media.AVPlayer + private option: PlayerOption = { + mode: "video", + loop: false + } + private callback: Map = new Map() + + constructor(context: common.UIAbilityContext, option?: Partial) { + this.context = context + this.option.mode = option?.mode || "video" + this.option.loop = option?.loop || false + } + + private _status: PlayStatus = PlayStatus.Idle + + /** + * 获取当前播放器状态 + * @returns + */ + get status() { + return this._status + } + + /** + * 获取媒体资源长度 + * @returns + */ + get duration() { + return this.player?.duration ?? 0 + } + + /** + * 获取媒体资源当前播放进度 + * @returns + */ + get current() { + return this.player?.currentTime ?? 0 + } + + /** + * 设置avplayer输出控件id 仅播放视频需要 + * @param id + */ + set surfaceId(id: string) { + this.player!.surfaceId = id + } + + /** + * 设置播放音量 + * @param volume + */ + set volume(volume: number) { + this.player?.setVolume(volume) + } + + /** + * 设置是否循环播放 + * @param loop + */ + set loop(loop: boolean) { + if ([PlayStatus.Prepared, PlayStatus.Playing, PlayStatus.Paused, PlayStatus.Completed].includes(this._status)) { + this.player!.loop = loop + } + this.option.loop = loop + } + + async create() { + this.player = await media.createAVPlayer() + this.registerPlayerCallback() + } + + /** + * 设置播放资源 + * @param option + */ + async setSource(option: PlayerSourceOption) { + let fdPath = 'fd://'; + if (option.type === "raw") { + let fileDescriptor = await this.context.resourceManager.getRawFd(option.url) + this.player!.fdSrc = fileDescriptor + } else if (option.type === "local") { + let path = this.context.filesDir + option.url; + let file = fs.openSync(path) + this.player!.url = fdPath + file.fd + } else { + this.player!.url = option.url + } + } + + async prepare() { + await this.player?.prepare() + } + + async play() { + await this.player?.play() + } + + async pause() { + await this.player?.pause() + } + + async stop() { + await this.player?.stop() + } + + async reset() { + await this.player?.reset() + } + + async release() { + await this.player?.release() + this.callback.clear() + } + + seek(time: number, mode?: media.SeekMode) { + this.player?.seek(time, mode || media.SeekMode.SEEK_PREV_SYNC) + } + + speed(speed: media.PlaybackSpeed) { + this.player?.setSpeed(speed) + } + + on(type: PlayerEvent, cb: Function) { + if (!this.callback.has(type)) { + this.callback.set(type, []) + } + this.callback.get(type)?.push(cb) + } + + once(type: PlayerEvent, cb: Function) { + let onceFn = () => { + cb() + this.off(type, onceFn) + } + this.on(type, onceFn) + } + + off(type: PlayerEvent, cb: Function) { + if (!this.callback.has(type)) { + return + } + let cbs = this.callback.get(type) + cbs = cbs?.filter(el => el != cb) + } + + private registerPlayerCallback() { + this.player?.on("stateChange", (state, reason) => { + switch (state) { + case "idle": { + this._status = PlayStatus.Idle + this.callback.get("idle")?.forEach(cb => { + cb() + }) + break + } + case "initialized": { + this._status = PlayStatus.Init + this.callback.get("initialized")?.forEach(cb => { + cb() + }) + this.prepare() + break + } + case "prepared": { + this._status = PlayStatus.Prepared + this.loop = this.option.loop + this.callback.get("prepared")?.forEach(cb => { + + cb() + }) + break + } + case "playing": { + this._status = PlayStatus.Playing + this.loop = this.option.loop + this.callback.get("playing")?.forEach(cb => { + cb() + }) + break + } + case "paused": { + this._status = PlayStatus.Paused + this.loop = this.option.loop + this.callback.get("paused")?.forEach(cb => { + cb() + }) + break + } + case "completed": { + this._status = PlayStatus.Completed + this.loop = this.option.loop + this.callback.get("completed")?.forEach(cb => { + cb() + }) + break + } + case "stopped": { + this._status = PlayStatus.Stopped + this.callback.get("stopped")?.forEach(cb => { + cb() + }) + break + } + case "released": { + this._status = PlayStatus.Released + this.callback.get("released")?.forEach(cb => { + cb() + }) + break + } + case "error": { + this._status = PlayStatus.Error + this.callback.get("error")?.forEach(cb => { + cb() + }) + break + } + default: + break + } + this.callback.get("status")?.forEach(cb => { + cb(this._status, reason) + }) + }) + } +} \ No newline at end of file diff --git a/entry/src/main/ets/utils/Video.ets b/entry/src/main/ets/utils/Video.ets index f04ff315..ae7cd26c 100644 --- a/entry/src/main/ets/utils/Video.ets +++ b/entry/src/main/ets/utils/Video.ets @@ -1,13 +1,16 @@ -import photoAccessHelper from '@ohos.file.photoAccessHelper'; -import dataSharePredicates from '@ohos.data.dataSharePredicates'; -import { dateFormat, getCurrentTime } from '../common/utils/tools'; +import mediaLibrary from '@ohos.multimedia.mediaLibrary' +import photoAccessHelper from '@ohos.file.photoAccessHelper' +import dataSharePredicates from '@ohos.data.dataSharePredicates' +import { dateFormat, getCurrentTime, isSevenDaysAgo } from '../utils/tools' +// import rtsp_server from '@ohos.rtsprecord'; import record from '@ohos.rtsprecord'; -import { FileHelper } from '../common/service/FileHelper'; -import FileUtil from '../common/utils/File'; -import { GlobalConfig } from '../config'; +import { FileHelper } from './FileHelper'; +import FileUtil from '../utils/File'; +import { GlobalConfig } from '../../config'; import promptAction from '@ohos.promptAction'; +import { GetCurrentTime, IsDaysAgo } from './Common'; +import { RecordHandleType, VideoConfig } from '../model'; import common from '@ohos.app.ability.common'; -import { IsDaysAgo } from './Common'; const rtsp_server = record.createServer(); //开始录屏 @@ -25,24 +28,22 @@ const FILE_ASSET_FETCH_COLUMNS = [ photoAccessHelper.PhotoKeys.ORIENTATION, photoAccessHelper.PhotoKeys.FAVORITE, photoAccessHelper.PhotoKeys.TITLE, -// photoAccessHelper.PhotoKeys.POSITION, -// photoAccessHelper.PhotoKeys.DATE_TRASHED, -// photoAccessHelper.PhotoKeys.HIDDEN -]; + photoAccessHelper.PhotoKeys.POSITION, + photoAccessHelper.PhotoKeys.DATE_TRASHED, + photoAccessHelper.PhotoKeys.HIDDEN]; // const rtsp_server = record.createServer(); -export async function startRecordVideo(param, td, context, dir, path?, index?) { - return new Promise(async (reslove, reject) => { - // const date=dateFormat(new Date).split(' ')[0] - - // const folderPath = await fileUtil.initFolder(`/PLC/${date}/${dir}`); - var video_uri = `rtsp://${param.userName}:${param.pwd}@${param.ip}:${param.port}/h264/ch${td}/main/av_stream`; +export async function startRecordVideo(param: VideoConfig, td: number, context: common.UIAbilityContext, dir: string, + path?: string, + index?: number): Promise { + return new Promise(async (resolve, reject) => { + let video_uri = `rtsp://${param.userName}:${param.pwd}@${param.ip}:${param.port}/h264/ch${td}/main/av_stream`; if (rtsp_server != null) { console.log(`Rtsprecord startRecordVideo begin,video_uri`, video_uri); const num = Math.floor(Math.random() * 10000) - let fileName - const time = await getCurrentTime() + let fileName: string + const time = await GetCurrentTime() const date = time.split(' ')[0] if (!path) { fileName = `${date}_movie_record${num}.mp4` @@ -50,39 +51,42 @@ export async function startRecordVideo(param, td, context, dir, path?, index?) { fileName = `${date}_${path}_${index || num}.mp4` } - var recordResult = rtsp_server.startRecordVideo(context, video_uri, fileName, date, dir); + let recordResult = rtsp_server.startRecordVideo(context, video_uri, fileName, date); const handleId = recordResult.dataInt; - reslove(handleId) + resolve(handleId) } else { console.log(`Rtsprecord startRecordVideo rtsp_server isnull`); - reslove(0) + resolve(0) } console.log(`Rtsprecord startRecordVideo end`); }) - } //结束录屏 -export async function endRecordVideo(record_handleObj) { - for (let key in record_handleObj) { - if (rtsp_server != null && record_handleObj[key] > 0) { - console.log(`Rtsprecord endRecordVideo begin`); - var recordResult = rtsp_server.endRecordVideo(record_handleObj[key]); - console.log(`Rtsprecord endRecordVideo record_handle` + record_handleObj[key].dataInt + ` filename:` + - record_handleObj[key].fileName); +export async function endRecordVideo(record_handleObj: RecordHandleType) { + const handleIds = [ + record_handleObj.rocord_handle1, + record_handleObj.rocord_handle2, + record_handleObj.rocord_handle3, + record_handleObj.rocord_handle4 + ]; + for (const handleId of handleIds) { + if (rtsp_server != null && handleId > 0) { + console.log(`Rtsprecord endRecordVideo begin`); + const recordResult = rtsp_server.endRecordVideo(handleId); + console.log(`Rtsprecord endRecordVideo record_handle` + recordResult.dataInt + ` filename:` + + recordResult.fileName); } else { console.log(`Rtsprecord endRecordVideo handleId isnull`); } } - } export async function saveStartRecordVideo(path) { return new Promise(async (reslove, reject) => { - const context = AppStorage.get('context') - const fileUtil = new FileUtil(context) + const fileUtil = new FileUtil(globalThis.context) const fileHelper = new FileHelper(); const date = dateFormat(new Date).split(' ')[0] fileHelper.createAlbum(date); @@ -106,56 +110,6 @@ export async function saveStartRecordVideo(path) { }) } -async function getfilehandleCode(td, param, dir, path, index) { - return new Promise(async (reslove, reject) => { - console.log('pathpath1', path) - const context = AppStorage.get('context') - - const record_handle = await startRecordVideo(param, td, context, dir, path, index) - // this.rocordHandleObj['rocord_handle'+td] = record_handle - reslove(record_handle) - }) - -} - - -export async function getUserAlbumItemByDisplayName(displayName: string, day?, - type?): Promise { - let fetchResult = null - let album: photoAccessHelper.Album = null - try { - console.log('getUserAlbumItemByDisplayName'); - let predicates = new dataSharePredicates.DataSharePredicates(); - predicates.equalTo(photoAccessHelper.AlbumKeys.ALBUM_NAME, displayName) - let fetchOptions = { - fetchColumns: [], - predicates: predicates - }; - const context = AppStorage.get('context') - const userFileMgr = photoAccessHelper.getPhotoAccessHelper(context); - - fetchResult = - await userFileMgr.getAlbums(photoAccessHelper.AlbumType.USER, photoAccessHelper.AlbumSubtype.USER_GENERIC, - fetchOptions); - console.log('get getUserAlbumItemByDisplayName, count: ' + JSON.stringify(fetchResult)); - if (fetchResult.getCount() > 0) { - const albums = await fetchResult.getLastObject(); - console.log('get getUserAlbumItemByDisplayName album111', albums.albumName) - - if (IsDaysAgo(albums.albumName, day)) { - deleteAllFileByPiC(albums.albumName, type) - } - console.log('get getUserAlbumItemByDisplayName album',) - } - } catch (err) { - console.log('get Album getUserAlbumItemByDisplayName fetchResult failed with err: ' + err); - } finally { - if (fetchResult != null) { - fetchResult.close(); - } - } - return album; -} /** *拍照 @@ -181,9 +135,8 @@ interface takePhotoParam { */ const fileHelper = new FileHelper(); -export async function delPic(day: number, type: number) { - const context: common.UIAbilityContext = AppStorage.get('context') - let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(context); +export async function delPic(day, type) { + let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(globalThis.context); console.info('albumGetAssetsDemoCallback'); let predicates: dataSharePredicates.DataSharePredicates = new dataSharePredicates.DataSharePredicates(); let albumFetchOptions: photoAccessHelper.FetchOptions = { @@ -210,18 +163,13 @@ export async function delPic(day: number, type: number) { } export async function takePhoto(param, context, dir, flag = 1, callback?) { - var video_uri = `rtsp://${param.userName}:${param.pwd}@${param.ip}:${param.port}/h264/ch${param.pztd}/main/av_stream`; - // var video_uri = `rtsp://admin:openharmony1@192.168.1.66:554/Streaming/Channels/3`; + let video_uri = `rtsp://${param.userName}:${param.pwd}@${param.ip}:${param.port}/h264/ch${param.pztd}/main/av_stream`; const num = Math.floor(Math.random() * 10000) const fileName = `picture_record${num}.jpg` - console.log('baoyihubaoyihu', video_uri, flag) - console.log(`baoyihu Rtsprecord baohaowen getVideoSnapshot fileName:` + fileName); - // var snapResult = rtsp_server.getVideoSnapshot(context, video_uri, '', dir); if (flag == 0) { rtsp_server.detectVideoSnapshotSize(video_uri, fileName, (err, snapResult) => { - console.log("baohaowen_detectLoop round end size1:" + snapResult.fileSize); callback({ fileSize: snapResult.fileSize, errorCode: snapResult.errorCode }) }); } else { @@ -251,12 +199,6 @@ export async function takePhoto(param, context, dir, flag = 1, callback?) { } } -export async function deleteAllPicturesFn() { - fileHelper.deleteAllPictures(); - const context = AppStorage.get('context') - deleteAllVideos(context, photoAccessHelper.AlbumType.USER, photoAccessHelper.AlbumSubtype.VIDEO) - -} //type:1 是图片 2是视频 export async function deleteAllFileByPiC(dirName, type = 1) {