fix: 网络摄像头
This commit is contained in:
parent
ee4d54e8d7
commit
e6a75028c5
@ -145,4 +145,5 @@ export async function initCarParameter(params: object) {
|
||||
method: http.RequestMethod.POST,
|
||||
xml: false,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
94
entry/src/main/ets/api/networkCamera.ets
Normal file
94
entry/src/main/ets/api/networkCamera.ets
Normal file
@ -0,0 +1,94 @@
|
||||
import http from '@ohos.net.http';
|
||||
import buffer from '@ohos.buffer';
|
||||
import image from '@ohos.multimedia.image';
|
||||
|
||||
const TAG = 'CameraService';
|
||||
|
||||
export async function ObtainNetworkCameraImages(): Promise<string | null> {
|
||||
const url = "http://192.168.1.125/snapshot.cgi?stream=1&username=admin&password=123456";
|
||||
let httpRequest = http.createHttp();
|
||||
|
||||
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: 0,
|
||||
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 = `data:image/jpeg;base64,${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();
|
||||
}
|
||||
}
|
||||
@ -19,6 +19,7 @@ import Prompt from '@system.prompt';
|
||||
import { DifferentialAndSignal } from '../utils/business/DifferentialAndSignalWorker';
|
||||
import { dConsole } from '../utils/LogWorker';
|
||||
import CarLoadingComponent from './Index/Loading';
|
||||
import { ObtainNetworkCameraImages } from '../api/networkCamera';
|
||||
|
||||
@Entry
|
||||
@Component
|
||||
@ -40,6 +41,7 @@ struct Index {
|
||||
@State isPlay: boolean = false;
|
||||
@State initWork: boolean = false
|
||||
@State status: string = "开始"
|
||||
@State base64Img: string = ""
|
||||
// 请求网络表等待弹窗
|
||||
customDialogController: CustomDialogController = new CustomDialogController({
|
||||
builder: CarLoadingComponent(),
|
||||
@ -62,6 +64,7 @@ struct Index {
|
||||
|
||||
async aboutToAppear() {
|
||||
dConsole.log("权限首页 aboutToAppear")
|
||||
this.base64Img = await ObtainNetworkCameraImages() || ""
|
||||
this.ratio = AppStorage.get<BaseInfoType>('baseInfo')?.ratio || 1.4
|
||||
this.angle = 0
|
||||
AppStorage.set('lsh', '1111111111111')
|
||||
@ -217,7 +220,7 @@ struct Index {
|
||||
HeaderComponent({
|
||||
shortLogo: false
|
||||
})
|
||||
|
||||
|
||||
CardComponent({
|
||||
isSingle: this.singlePlay,
|
||||
singleClick: () => {
|
||||
|
||||
@ -6,11 +6,9 @@ import {
|
||||
DefaultJudgeConfigObj,
|
||||
ExtendType,
|
||||
Gps,
|
||||
JudgeSound,
|
||||
LANE,
|
||||
MarkRule,
|
||||
PLCType,
|
||||
ProcessDataEnumType,
|
||||
ProjectInfo,
|
||||
ProjectInfos,
|
||||
ProjectRoads,
|
||||
@ -21,7 +19,6 @@ import { ArrayToByteArray, NumberToByteArray } from '../../utils/Common';
|
||||
import dayTs from '../../utils/Date';
|
||||
import { dConsole } from '../../utils/LogWorker';
|
||||
import VoiceAnnounce from '../judgeSDK/utils/voiceAnnouncements';
|
||||
import { examJudgeSoundEnd } from './JudgeSDKUtils';
|
||||
|
||||
|
||||
// 中心信号转换
|
||||
@ -863,23 +860,23 @@ export const CurrentProjectConversion = (code: number, projectsObj: object): str
|
||||
* @param sound - 评判音频对象
|
||||
* @param avPlayer - 语音播放器实例
|
||||
*/
|
||||
export function PlayJudgeVoice(sound: JudgeSound, avPlayer: VoiceAnnounce) {
|
||||
if (sound.type == 1) {
|
||||
avPlayer?.playAudio([`voice/${sound.code[0]}.mp3`], false, () => {
|
||||
examJudgeSoundEnd({
|
||||
xmdm: sound.xmdm, code: sound.code[0], type: sound.type
|
||||
});
|
||||
dConsole.writeProcessData(ProcessDataEnumType.JudgeExamData, JSON.stringify({
|
||||
method: 'examJudgeSoundEnd',
|
||||
itemno: sound.xmdm,
|
||||
code: sound.code[0],
|
||||
type: sound.type,
|
||||
}));
|
||||
});
|
||||
} else {
|
||||
avPlayer?.playAudio([`voice/${sound.code[0]}.mp3`]);
|
||||
}
|
||||
}
|
||||
// export function PlayJudgeVoice(sound: JudgeSound, avPlayer: VoiceAnnounce) {
|
||||
// if (sound.type == 1) {
|
||||
// avPlayer?.playAudio([`voice/${sound.code[0]}.mp3`], false, () => {
|
||||
// examJudgeSoundEnd({
|
||||
// xmdm: sound.xmdm, code: sound.code[0], type: sound.type
|
||||
// });
|
||||
// dConsole.writeProcessData(ProcessDataEnumType.JudgeExamData, JSON.stringify({
|
||||
// method: 'examJudgeSoundEnd',
|
||||
// itemno: sound.xmdm,
|
||||
// code: sound.code[0],
|
||||
// type: sound.type,
|
||||
// }));
|
||||
// });
|
||||
// } else {
|
||||
// avPlayer?.playAudio([`voice/${sound.code[0]}.mp3`]);
|
||||
// }
|
||||
// }
|
||||
|
||||
/**
|
||||
* 检查差分
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
// 处理worker线程的消息tcp拿差分改正数,udp给后置机
|
||||
import worker, { ErrorEvent, MessageEvents, ThreadWorkerGlobalScope } from '@ohos.worker';
|
||||
import { WorkerTag } from '../config';
|
||||
import { SerialPortTag, WorkerTag } from '../config';
|
||||
import {
|
||||
CenterCallBackMsgType,
|
||||
EnvironmentConfigurationType,
|
||||
@ -68,7 +68,7 @@ function getDataFn(config: EnvironmentConfigurationType) {
|
||||
if (data !== "" && config.carType !== "2") {
|
||||
// TODO
|
||||
// 需要观察
|
||||
// console.log(WorkerTag, "后置机消息", data)
|
||||
console.log(WorkerTag, "后置机消息", data)
|
||||
const res = await SerialPortService.getData()
|
||||
if (res.length > 0) {
|
||||
const dataArray = data.split(",");
|
||||
@ -76,7 +76,7 @@ function getDataFn(config: EnvironmentConfigurationType) {
|
||||
dataArray[28] = res[9].toString();
|
||||
data = dataArray.join(",");
|
||||
}
|
||||
// console.log(SerialPortTag, "处理完的档位信号", data)
|
||||
console.log(SerialPortTag, "处理完的档位信号", data)
|
||||
workerPort.postMessage(
|
||||
JSON.stringify({
|
||||
type: WorkerBackMessageType.ObtainUdpData,
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user