2023-12-18 16:03:44 +08:00

119 lines
5.8 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import 'dart:typed_data';
import 'package:convert/convert.dart';
import 'package:flutter_sound/flutter_sound.dart';
import 'package:get/get.dart';
import 'package:star_lock/appRouters.dart';
// import 'package:just_audio/just_audio.dart';
import 'package:star_lock/main/lockDetail/monitoring/monitoring/lockMonitoring_page.dart';
import 'package:star_lock/talk/call/g711Decoder.dart';
import 'package:star_lock/talk/call/iFrameInfo.dart';
class CallTalk {
static int POS_iframe_index = 63;
static int POS_alen = 65;
static int POS_blen = 73;
static int POS_bag_index = 71;
static int POS_bag_num = 69;
static int POS_data = 77;
static int ABUF_NUM = 100;
static int FIRSTINDEX = 1;
int status = 0; // 假设有这个成员变量
IframeInfo iframe = IframeInfo(); // 假设有这个成员变量
LockMonitoringPage callOut = const LockMonitoringPage();
FlutterSoundPlayer _audioPlayer = FlutterSoundPlayer();
Future<void> getAVData(Uint8List bb, int len) async {
//视频数据
// String hexData =
// '5858584349449601075439415f396333613730323264346364a5a5a5a5c0a809a3503138363832313530323337000000000000000030303030420e000002000000b33300001f000100b301b301ffd8ffe000114a4649460001010000';
// Uint8List bb = Uint8List.fromList(hex.decode(hexData));
//音频数据
String hexData =
'5858584349449601075439415f396333613730323264346364a5a5a5a5c0a809a3503138363832313530323337000000000000000030303030e02900000100050080020000010001004001b30145444444444444444445454444444444444444444444434343434443434344444444444544454545444444444444454545454545454545454445444545454545454545444444444343434344444443434344444444444343434343434343434443434343434343424343434343434242424242424242424243434343434242424242424343434342424343434242424242434243434343434344454344444444444444444444444444454545454544444444444444444445454545454545454545454545454546454545454545454545454545454545454646464646464645454545464646454545454545454545454545454544444444444444444443434343434343434343434343434343434343434242424242424242424242424242424343434242434343434343434343434343434343434343434444444343434343430000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024001d044000000000001d080001000000001d18c03000000000';
Uint8List bb = Uint8List.fromList(hex.decode(hexData));
// 音频数据
if (bb[61] == 1) {
// 如果是音频数据且状态符合条件
_initializeAudioPlayer();
// 用你的711音频数据替换这里的Uint8List
Uint8List rawData = G711Decoder().decodeG711uLaw(bb);
_playRawData(rawData);
}
// 视频数据
else {
int bagLen = getShortFromByte(bb, POS_blen + 2);
int getIframeIndex = getShortFromByte(bb, POS_iframe_index);
int alen = getShortFromByte(bb, POS_alen);
int blen = getShortFromByte(bb, POS_blen);
int getBagIndex = bb[POS_bag_index] & 0xff;
int getBagNum = bb[POS_bag_num] & 0xff;
if (getIframeIndex != iframe.iframeIndex) {
iframe = IframeInfo();
iframe.iframeIndex = getIframeIndex;
iframe.bagNum = getBagNum;
iframe.cur_len = alen;
iframe.bb = Uint8List(alen);
}
iframe.bagReceive++;
int start = bagLen * (getBagIndex - FIRSTINDEX);
int end = start + blen;
// 确保 iframe!.bb 不为 null并且足够长
if (iframe.bb == null || iframe.bb!.length < end) {
iframe.bb = Uint8List(end);
}
copyBytes(iframe!.bb!, start, bb, POS_data, blen);
// 打印输出看看字节数组的内容
print('Copied Bytes: ${iframe.bb}');
Uint8List data = iframe.bb!.sublist(0, iframe.cur_len);
Get.toNamed(Routers.lockMonitoringPage,
arguments: {"lockId": widget.lockListInfoItemEntity.lockId});
// 打印拷贝后的目标数据
print(iframe.bb);
}
}
int getShortFromByte(Uint8List bb, int pos) {
ByteData byteData = ByteData.sublistView(bb, pos, pos + 2);
return byteData.getInt16(0, Endian.little);
}
void copyBytes(Uint8List destination, int destStart, Uint8List source,
int sourceStart, int length) {
if (destination.length < destStart + length ||
source.length < sourceStart + length) {
// 处理越界的情况,这里你可以抛出异常或者进行其他处理
print('Error: Index out of range');
return;
}
for (int i = 0; i < length; i++) {
destination[destStart + i] = source[sourceStart + i];
}
}
Future<void> _initializeAudioPlayer() async {
await _audioPlayer.openPlayer();
}
Future<void> _playRawData(Uint8List rawData) async {
await _audioPlayer.startPlayer(
fromDataBuffer: rawData,
codec: Codec.pcm16,
whenFinished: () {
// 播放完成时的回调
print("Playback finished");
},
);
}
}