网络摄像头
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
|
// @ts-ignore
|
||||||
import photoAccessHelper from '@ohos.file.photoAccessHelper'
|
import photoAccessHelper from '@ohos.file.photoAccessHelper'
|
||||||
import dataSharePredicates from '@ohos.data.dataSharePredicates'
|
import dataSharePredicates from '@ohos.data.dataSharePredicates'
|
||||||
import { dateFormat, getCurrentTime, isSevenDaysAgo } from '../utils/tools'
|
import { dateFormat, getCurrentTime, isSevenDaysAgo } from '../utils/tools'
|
||||||
// import rtsp_server from '@ohos.rtsprecord';
|
|
||||||
import record from '@ohos.rtsprecord';
|
import record from '@ohos.rtsprecord';
|
||||||
import { FileHelper } from './FileHelper';
|
import { FileHelper } from './FileHelper';
|
||||||
import FileUtil from '../utils/File';
|
import FileUtil from '../utils/File';
|
||||||
import { GlobalConfig } from '../../config';
|
import { GlobalConfig } from '../../config';
|
||||||
import promptAction from '@ohos.promptAction';
|
import promptAction from '@ohos.promptAction';
|
||||||
|
import { ObtainNetworkCameraImages } from './networkCamera';
|
||||||
|
|
||||||
const rtsp_server = record.createServer();
|
const rtsp_server = record.createServer();
|
||||||
//开始录屏
|
//开始录屏
|
||||||
@ -32,8 +28,6 @@ const FILE_ASSET_FETCH_COLUMNS = [photoAccessHelper.PhotoKeys.URI,
|
|||||||
photoAccessHelper.PhotoKeys.DATE_TRASHED,
|
photoAccessHelper.PhotoKeys.DATE_TRASHED,
|
||||||
photoAccessHelper.PhotoKeys.HIDDEN];
|
photoAccessHelper.PhotoKeys.HIDDEN];
|
||||||
|
|
||||||
// const rtsp_server = record.createServer();
|
|
||||||
|
|
||||||
export async function startRecordVideo(param, td, context, dir, path?, index?) {
|
export async function startRecordVideo(param, td, context, dir, path?, index?) {
|
||||||
return new Promise(async (reslove, reject) => {
|
return new Promise(async (reslove, reject) => {
|
||||||
// const fileUtil = new FileUtil(globalThis.context)
|
// 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?) {
|
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`;
|
let base64 = await ObtainNetworkCameraImages(param.ip, param.userName, param.pwd)
|
||||||
// var video_uri = `rtsp://admin:openharmony1@192.168.1.66:554/Streaming/Channels/3`;
|
let result : takePhotoParam = {
|
||||||
|
name: "",
|
||||||
const num = Math.floor(Math.random() * 10000)
|
base64,
|
||||||
const fileName = `picture_record${num}.jpg`
|
path: "",
|
||||||
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()
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// });
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function deleteAllPicturesFn() {
|
export async function deleteAllPicturesFn() {
|
||||||
|
|||||||
@ -16,7 +16,7 @@ export const GlobalConfig={
|
|||||||
//杭州
|
//杭州
|
||||||
hz:{
|
hz:{
|
||||||
km2:['2022.03.14.01','2022.03.17.1'],
|
km2:['2022.03.14.01','2022.03.17.1'],
|
||||||
km3:[],
|
km3:['2024.08.21.01','2024.08.24.1'],
|
||||||
},
|
},
|
||||||
//黑龙江
|
//黑龙江
|
||||||
hlg:{
|
hlg:{
|
||||||
|
|||||||
@ -52,8 +52,8 @@ export default class EntryAbility extends UIAbility {
|
|||||||
globalThis.deviceNo = '';
|
globalThis.deviceNo = '';
|
||||||
globalThis.hasAuth = false
|
globalThis.hasAuth = false
|
||||||
|
|
||||||
globalThis.version = GlobalConfig.version.jn.km3[0];
|
globalThis.version = GlobalConfig.version.hz.km3[0];
|
||||||
globalThis.judgeVersion = GlobalConfig.version.jn.km3[1];
|
globalThis.judgeVersion = GlobalConfig.version.hz.km3[1];
|
||||||
globalThis.tcpSendNum = 0
|
globalThis.tcpSendNum = 0
|
||||||
globalThis.videoVersion = '1.0'
|
globalThis.videoVersion = '1.0'
|
||||||
globalThis.tcpStep=0
|
globalThis.tcpStep=0
|
||||||
|
|||||||
@ -67,6 +67,8 @@ function ifNeedRetry(code: number | string): boolean {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export default class Judge {
|
export default class Judge {
|
||||||
|
private endPhoto: string = ""
|
||||||
|
|
||||||
// 过程照片拍照
|
// 过程照片拍照
|
||||||
getPhoto = async (empty?: boolean) => {
|
getPhoto = async (empty?: boolean) => {
|
||||||
const singlePlay = globalThis.singlePlay
|
const singlePlay = globalThis.singlePlay
|
||||||
@ -536,9 +538,12 @@ export default class Judge {
|
|||||||
private isJudgeDisConnect: boolean;
|
private isJudgeDisConnect: boolean;
|
||||||
// 项目开始接口同步
|
// 项目开始接口同步
|
||||||
beginProject = async (ksxm) => {
|
beginProject = async (ksxm) => {
|
||||||
|
const { judgeUI, fileLog, getSbbm, xmxh, filePath, getPhoto } = this;
|
||||||
|
if (ksxm == '11') {
|
||||||
|
this.endPhoto = await getPhoto()
|
||||||
|
}
|
||||||
const carInfo = globalThis.carInfo;
|
const carInfo = globalThis.carInfo;
|
||||||
const { examSubject, plateNo } = carInfo;
|
const { examSubject, plateNo } = carInfo;
|
||||||
const { judgeUI, fileLog, getSbbm, xmxh, filePath } = this;
|
|
||||||
const { lsh, idCard, serialNumber, projectsObj, ksdd, kslx, xldm } = judgeUI
|
const { lsh, idCard, serialNumber, projectsObj, ksdd, kslx, xldm } = judgeUI
|
||||||
const time = await getCurrentTime();
|
const time = await getCurrentTime();
|
||||||
const project = projectsObj[ksxm]
|
const project = projectsObj[ksxm]
|
||||||
@ -1314,7 +1319,11 @@ export default class Judge {
|
|||||||
// await uploadDisConnectData();
|
// await uploadDisConnectData();
|
||||||
try {
|
try {
|
||||||
const time = await getCurrentTime();
|
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 { d1, d2, d3, d4, d5 } = ksjs
|
||||||
const data = {
|
const data = {
|
||||||
xtlb: '17',
|
xtlb: '17',
|
||||||
@ -1330,7 +1339,6 @@ export default class Judge {
|
|||||||
jssj: time,
|
jssj: time,
|
||||||
kscj: (totalScore * 1) > 0 ? totalScore : 0,
|
kscj: (totalScore * 1) > 0 ? totalScore : 0,
|
||||||
kslc: Math.ceil(((ksjs?.qjjl + ksjs?.dcjl) || 0) / 100),
|
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(';'),
|
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