网络摄像头
This commit is contained in:
parent
52953bda36
commit
a5debed8f9
95
entry/src/main/ets/common/service/networkCamera.ts
Normal file
95
entry/src/main/ets/common/service/networkCamera.ts
Normal file
@ -0,0 +1,95 @@
|
||||
import http from '@ohos.net.http';
|
||||
import buffer from '@ohos.buffer';
|
||||
import image from '@ohos.multimedia.image';
|
||||
|
||||
const TAG = 'CameraService';
|
||||
|
||||
export async function ObtainNetworkCameraImages(ip: string,userName: string, pwd: string): Promise<string | null> {
|
||||
// const url = "http://192.168.1.125/snapshot.cgi?stream=1&username=admin&password=123456";
|
||||
const url = `http://${ip}/snapshot.cgi?stream=1&username=${userName}&password=${pwd}`;
|
||||
let httpRequest = http.createHttp();
|
||||
console.log(TAG, url)
|
||||
try {
|
||||
console.info(TAG, 'Starting image request...');
|
||||
const response = await httpRequest.request(url, {
|
||||
method: http.RequestMethod.GET,
|
||||
connectTimeout: 10000,
|
||||
readTimeout: 10000,
|
||||
expectDataType: http.HttpDataType.ARRAY_BUFFER,
|
||||
});
|
||||
|
||||
if (response.responseCode === 200) {
|
||||
let arrayBuffer = response.result as ArrayBuffer;
|
||||
|
||||
// 裁剪左半部分
|
||||
const croppedBase64 = await cropLeftHalf(arrayBuffer);
|
||||
|
||||
return croppedBase64;
|
||||
} else {
|
||||
console.error(TAG, `HTTP Error: ${response.responseCode}`);
|
||||
return null;
|
||||
}
|
||||
} catch (error) {
|
||||
console.error(TAG, 'An error occurred while fetching the image.', JSON.stringify(error));
|
||||
return null;
|
||||
} finally {
|
||||
httpRequest.destroy();
|
||||
}
|
||||
}
|
||||
|
||||
async function cropLeftHalf(arrayBuffer: ArrayBuffer): Promise<string> {
|
||||
let imageSource: image.ImageSource | null = null;
|
||||
let pixelMap: image.PixelMap | null = null;
|
||||
|
||||
try {
|
||||
// 1. 创建ImageSource
|
||||
imageSource = image.createImageSource(arrayBuffer);
|
||||
|
||||
// 2. 获取图片信息
|
||||
const imageInfo = await imageSource.getImageInfo();
|
||||
console.info(TAG, `Original image size: ${imageInfo.size.width}x${imageInfo.size.height}`);
|
||||
|
||||
// 3. 计算并定义左半部分的裁剪区域
|
||||
const leftHalfWidth = Math.floor(imageInfo.size.width / 2);
|
||||
const cropRegion: image.Region = {
|
||||
size: {
|
||||
width: leftHalfWidth,
|
||||
height: imageInfo.size.height
|
||||
},
|
||||
x: leftHalfWidth,
|
||||
y: 0
|
||||
};
|
||||
|
||||
// 创建解码选项,并将裁剪区域放入其中
|
||||
const decodingOptions: image.DecodingOptions = {
|
||||
desiredRegion: cropRegion
|
||||
};
|
||||
|
||||
// 4. 创建像素映射并进行裁剪
|
||||
pixelMap = await imageSource.createPixelMap(decodingOptions);
|
||||
|
||||
// 5. 将裁剪后的PixelMap转换为ArrayBuffer
|
||||
const imagePacker = image.createImagePacker();
|
||||
const packedData = await imagePacker.packing(pixelMap, {
|
||||
format: "image/jpeg",
|
||||
quality: 90
|
||||
});
|
||||
|
||||
// 6. 转换为Base64
|
||||
const buf = buffer.from(packedData);
|
||||
const base64 = buf.toString('base64');
|
||||
|
||||
const result = `${base64}`;
|
||||
console.info(TAG, `Left half cropped successfully. Size: ${leftHalfWidth}x${imageInfo.size.height}`);
|
||||
|
||||
return result;
|
||||
|
||||
} catch (error) {
|
||||
console.error(TAG, 'Image cropping failed:', JSON.stringify(error));
|
||||
return "";
|
||||
} finally {
|
||||
// 7. 在 finally 块中安全地释放资源
|
||||
imageSource?.release();
|
||||
pixelMap?.release();
|
||||
}
|
||||
}
|
||||
@ -1,17 +1,13 @@
|
||||
import mediaLibrary from '@ohos.multimedia.mediaLibrary'
|
||||
import onvifclient from '@ohos.onvifclient';
|
||||
import fs from '@ohos.file.fs'
|
||||
|
||||
// @ts-ignore
|
||||
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 './FileHelper';
|
||||
import FileUtil from '../utils/File';
|
||||
import { GlobalConfig } from '../../config';
|
||||
import promptAction from '@ohos.promptAction';
|
||||
import { ObtainNetworkCameraImages } from './networkCamera';
|
||||
|
||||
const rtsp_server = record.createServer();
|
||||
//开始录屏
|
||||
@ -32,8 +28,6 @@ const FILE_ASSET_FETCH_COLUMNS = [photoAccessHelper.PhotoKeys.URI,
|
||||
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 fileUtil = new FileUtil(globalThis.context)
|
||||
@ -212,74 +206,13 @@ export async function delPic(day, type) {
|
||||
}
|
||||
|
||||
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`;
|
||||
|
||||
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);
|
||||
// @ts-ignore
|
||||
// var snapResult = rtsp_server.getVideoSnapshot(context, video_uri, '', dir);
|
||||
if (flag == 0) {
|
||||
// return new
|
||||
return new Promise<takePhotoParam>(async (resolve, reject) => {
|
||||
rtsp_server.detectVideoSnapshotSize(video_uri, fileName, false, (err, snapResult) => {
|
||||
console.log("baohaowen_detectLoop round end size1:" + snapResult.fileSize, snapResult.dataString);
|
||||
callback && callback({
|
||||
fileSize: snapResult.fileSize,
|
||||
errorCode: snapResult.errorCode,
|
||||
base64: snapResult.dataString
|
||||
})
|
||||
resolve({ fileSize: snapResult.fileSize, errorCode: snapResult.errorCode, base64: snapResult.dataString })
|
||||
});
|
||||
})
|
||||
|
||||
} else {
|
||||
return new Promise<takePhotoParam>(async (resolve, reject) => {
|
||||
// const time = await getCurrentTime()
|
||||
// const date = time.split(' ')[0]
|
||||
// let dirName = dir ? dir : date
|
||||
rtsp_server.detectVideoSnapshotSize(video_uri, fileName, true, (err, snapResult) => {
|
||||
if (snapResult.result && snapResult.errorCode == 0) {
|
||||
console.log("baohaowen_detectLoop round end size1:" + snapResult.fileSize, snapResult.dataString);
|
||||
callback && callback({
|
||||
fileSize: snapResult.fileSize,
|
||||
errorCode: snapResult.errorCode,
|
||||
base64: snapResult.dataString
|
||||
})
|
||||
resolve({ fileSize: snapResult.fileSize, errorCode: snapResult.errorCode, base64: snapResult.dataString })
|
||||
} else {
|
||||
promptAction.showToast({
|
||||
message: `拍照失败`,
|
||||
duration: 3000
|
||||
});
|
||||
reject(false)
|
||||
}
|
||||
|
||||
});
|
||||
// rtsp_server.getVideoSnapshot(context, video_uri, fileName, dirName, true, async (err, snapResult) => {
|
||||
// if (snapResult.result && snapResult.errorCode == 0) {
|
||||
// resolve({
|
||||
// base64: snapResult.dataString,
|
||||
// name: snapResult.fileName,
|
||||
// fileSize: snapResult.fileSize,
|
||||
// errorCode: snapResult.errorCode,
|
||||
// path: snapResult.filePath
|
||||
// })
|
||||
// } else {
|
||||
// promptAction.showToast({
|
||||
// message: `拍照失败`,
|
||||
// duration: 3000
|
||||
// });
|
||||
// reject(false)
|
||||
// // reject()
|
||||
// }
|
||||
//
|
||||
// });
|
||||
})
|
||||
let base64 = await ObtainNetworkCameraImages(param.ip, param.userName, param.pwd)
|
||||
let result : takePhotoParam = {
|
||||
name: "",
|
||||
base64,
|
||||
path: "",
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
export async function deleteAllPicturesFn() {
|
||||
|
||||
@ -16,7 +16,7 @@ export const GlobalConfig={
|
||||
//杭州
|
||||
hz:{
|
||||
km2:['2022.03.14.01','2022.03.17.1'],
|
||||
km3:[],
|
||||
km3:['2024.08.21.01','2024.08.24.1'],
|
||||
},
|
||||
//黑龙江
|
||||
hlg:{
|
||||
|
||||
@ -52,8 +52,8 @@ export default class EntryAbility extends UIAbility {
|
||||
globalThis.deviceNo = '';
|
||||
globalThis.hasAuth = false
|
||||
|
||||
globalThis.version = GlobalConfig.version.jn.km3[0];
|
||||
globalThis.judgeVersion = GlobalConfig.version.jn.km3[1];
|
||||
globalThis.version = GlobalConfig.version.hz.km3[0];
|
||||
globalThis.judgeVersion = GlobalConfig.version.hz.km3[1];
|
||||
globalThis.tcpSendNum = 0
|
||||
globalThis.videoVersion = '1.0'
|
||||
globalThis.tcpStep=0
|
||||
|
||||
@ -67,6 +67,8 @@ function ifNeedRetry(code: number | string): boolean {
|
||||
}
|
||||
|
||||
export default class Judge {
|
||||
private endPhoto: string = ""
|
||||
|
||||
// 过程照片拍照
|
||||
getPhoto = async (empty?: boolean) => {
|
||||
const singlePlay = globalThis.singlePlay
|
||||
@ -536,9 +538,12 @@ export default class Judge {
|
||||
private isJudgeDisConnect: boolean;
|
||||
// 项目开始接口同步
|
||||
beginProject = async (ksxm) => {
|
||||
const { judgeUI, fileLog, getSbbm, xmxh, filePath, getPhoto } = this;
|
||||
if (ksxm == '11') {
|
||||
this.endPhoto = await getPhoto()
|
||||
}
|
||||
const carInfo = globalThis.carInfo;
|
||||
const { examSubject, plateNo } = carInfo;
|
||||
const { judgeUI, fileLog, getSbbm, xmxh, filePath } = this;
|
||||
const { lsh, idCard, serialNumber, projectsObj, ksdd, kslx, xldm } = judgeUI
|
||||
const time = await getCurrentTime();
|
||||
const project = projectsObj[ksxm]
|
||||
@ -1314,7 +1319,11 @@ export default class Judge {
|
||||
// await uploadDisConnectData();
|
||||
try {
|
||||
const time = await getCurrentTime();
|
||||
const photoBase64 = await getPhoto();
|
||||
let photoBase64 = this.endPhoto
|
||||
if (!photoBase64) {
|
||||
photoBase64 = await getPhoto();
|
||||
}
|
||||
// const photoBase64 = await getPhoto();
|
||||
const { d1, d2, d3, d4, d5 } = ksjs
|
||||
const data = {
|
||||
xtlb: '17',
|
||||
@ -1330,7 +1339,6 @@ export default class Judge {
|
||||
jssj: time,
|
||||
kscj: (totalScore * 1) > 0 ? totalScore : 0,
|
||||
kslc: Math.ceil(((ksjs?.qjjl + ksjs?.dcjl) || 0) / 100),
|
||||
// 1,22;2,560;3,128;4,0;5,0;
|
||||
dwlc: [d1, d2, d3, d4, d5].map((d, index) => `${index + 1},${Math.floor(d / 100)}`).join(';'),
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user