205 lines
9.0 KiB
Dart
Raw Normal View History

2023-12-11 10:43:41 +08:00
import 'dart:typed_data';
2023-12-19 18:33:02 +08:00
import 'package:flutter/material.dart';
2023-12-11 10:43:41 +08:00
import 'package:convert/convert.dart';
import 'package:flutter_sound/flutter_sound.dart';
2023-12-18 16:03:44 +08:00
import 'package:get/get.dart';
import 'package:star_lock/appRouters.dart';
2023-12-11 10:43:41 +08:00
// 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';
2023-12-18 16:03:05 +08:00
import '../../tools/eventBusEventManage.dart';
2023-12-11 10:43:41 +08:00
class CallTalk {
2023-12-19 18:33:02 +08:00
static CallTalk? _manager;
2023-12-11 10:43:41 +08:00
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; // 假设有这个成员变量
2023-12-19 18:33:02 +08:00
IframeInfo? iframe; // 假设有这个成员变量
var growableList;
2023-12-11 10:43:41 +08:00
LockMonitoringPage callOut = const LockMonitoringPage();
2023-12-19 18:41:51 +08:00
FlutterSoundPlayer _audioPlayer = FlutterSoundPlayer();
2023-12-11 10:43:41 +08:00
2023-12-19 18:33:02 +08:00
CallTalk._init() {
iframe = IframeInfo();
2023-12-20 09:36:54 +08:00
_initializeAudioPlayer();
2023-12-19 18:33:02 +08:00
}
static CallTalk _share() {
_manager ??= CallTalk._init();
return _manager!;
}
factory CallTalk() => _share();
CallTalk get manager => _share();
2023-12-11 10:43:41 +08:00
Future<void> getAVData(Uint8List bb, int len) async {
//视频数据
// String hexData =
// '5858584349449601075439415f396333613730323264346364a5a5a5a5c0a809a3503138363832313530323337000000000000000030303030420e000002000000b33300001f000100b301b301ffd8ffe000114a4649460001010000';
// Uint8List bb = Uint8List.fromList(hex.decode(hexData));
//音频数据
2023-12-18 16:03:05 +08:00
// String hexData =
// '5858584349449601075439415f396333613730323264346364a5a5a5a5c0a809a3503138363832313530323337000000000000000030303030e02900000100050080020000010001004001b30145444444444444444445454444444444444444444444434343434443434344444444444544454545444444444444454545454545454545454445444545454545454545444444444343434344444443434344444444444343434343434343434443434343434343424343434343434242424242424242424243434343434242424242424343434342424343434242424242434243434343434344454344444444444444444444444444454545454544444444444444444445454545454545454545454545454546454545454545454545454545454545454646464646464645454545464646454545454545454545454545454544444444444444444443434343434343434343434343434343434343434242424242424242424242424242424343434242434343434343434343434343434343434343434444444343434343430000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024001d044000000000001d080001000000001d18c03000000000';
// Uint8List bb = Uint8List.fromList(hex.decode(hexData));
2023-12-11 10:43:41 +08:00
// 音频数据
if (bb[61] == 1) {
// 如果是音频数据且状态符合条件
2023-12-19 18:41:51 +08:00
// 用你的711音频数据替换这里的Uint8List
Uint8List rawData = G711Decoder().decodeG711uLaw(bb);
_playRawData(rawData);
2023-12-11 10:43:41 +08:00
}
// 视频数据
else {
2023-12-19 18:33:02 +08:00
// 音视频数据开始下标
var bagLen = bb[POS_blen + 2] + bb[POS_blen + 3] * 256;
// print('音视频数据开始下标 bagLen$bagLen');
// 获取帧序号 63
int getIframeIndex =
bb[POS_iframe_index] + bb[POS_iframe_index + 1] * 256;
print('获取帧序号 getIframeIndex$getIframeIndex');
// 获取帧长度 65
// int alen = bb[POS_alen] & 0xff;
// var alenList = bb.sublist(POS_alen, POS_alen + 4);
// int alen = ((0xff & alenList[(0)]) << 24 |
// (0xff & alenList[1]) << 16 |
// (0xff & alenList[2]) << 8 |
// (0xFF & alenList[3]));
// print('获取帧长度 alen$alen');
// 当前包号 71
2023-12-11 10:43:41 +08:00
int getBagIndex = bb[POS_bag_index] & 0xff;
2023-12-19 18:33:02 +08:00
print('当前包号 getBagIndex$getBagIndex');
// 总包数 69
2023-12-11 10:43:41 +08:00
int getBagNum = bb[POS_bag_num] & 0xff;
2023-12-19 18:33:02 +08:00
print('总包数 getBagNum$getBagNum');
// 数据长度 73
int blen = bb[POS_blen] + bb[POS_blen + 1] * 256;
print('数据长度 blen$blen');
2023-12-11 10:43:41 +08:00
2023-12-19 18:33:02 +08:00
// 这里判断是否是同一帧,如果不是同一帧就重新创建一个 IframeInfo
if (getIframeIndex != iframe!.iframeIndex) {
2023-12-11 10:43:41 +08:00
iframe = IframeInfo();
2023-12-19 18:33:02 +08:00
// print('11111111change getIframeIndex$getIframeIndex ');
// print('11111111change iframe.iframeIndex: ${iframe!.iframeIndex}');
iframe!.iframeIndex = getIframeIndex;
iframe!.bagNum = getBagNum;
// iframe!.cur_len = alen;
// iframe!.bb = Uint8List(alen);
growableList = iframe!.bb!.toList(growable: true);
2023-12-11 10:43:41 +08:00
}
2023-12-19 18:33:02 +08:00
iframe!.bagReceive++;
// int start = bagLen * (getBagIndex - FIRSTINDEX);
// int end = start + blen;
2023-12-11 10:43:41 +08:00
// 确保 iframe!.bb 不为 null并且足够长
2023-12-19 18:33:02 +08:00
// if (iframe.bb == null || iframe.bb!.length < end) {
// iframe.bb = Uint8List(end);
// }
// print('22222222change getIframeIndex$getIframeIndex ');
// 如果是同一帧就添加起来
if (getIframeIndex == iframe!.iframeIndex) {
// print('33333333change iframe.iframeIndex: ${iframe!.iframeIndex}');
var getList = bb.sublist(77, bb.length);
print('getList:${getList}');
growableList.addAll(getList);
// print('growableList: $growableList');
2023-12-11 10:43:41 +08:00
}
2023-12-18 16:03:05 +08:00
// copyBytes(iframe!.bb!, start, bb, POS_data, blen);
2023-12-11 10:43:41 +08:00
// 打印输出看看字节数组的内容
2023-12-19 18:33:02 +08:00
print(
'iframe.bagNum: ${iframe!.bagNum} iframe.bagReceive: ${iframe!.bagReceive}');
// 如果收到的包数等于总包数,说明这一帧数据已经接收完毕
if (iframe!.bagNum == iframe!.bagReceive) {
// List<int> data = iframe!.bb!.sublist(0, iframe!.cur_len);
print('播放第${iframe!.iframeIndex}帧 一帧图片的Data: $growableList');
String hexString =
uint8ListToHexString(Uint8List.fromList(growableList));
// print('播放第${iframe!.iframeIndex}帧 hexStringLength:${hexString.length} 一帧图片的hexStringData: $hexString'); // 输出: 0a141e28
// if (iframe!.iframeIndex == 1) {
print('下面就是你要的');
printByteArray('播放第${iframe!.iframeIndex}帧 一帧图片的hexStringData: ',
Uint8List.fromList(growableList));
eventBus.fire(GetTVDataRefreshUI(growableList));
// }
// eventBus.fire(GetTVDataRefreshUI(growableList));
2023-12-18 16:03:05 +08:00
}
// Get.toNamed(Routers.lockMonitoringPage, arguments: {
// "lockId": "111"
// });
2023-12-11 10:43:41 +08:00
// 打印拷贝后的目标数据
2023-12-18 16:03:05 +08:00
// print(iframe.bb);
2023-12-11 10:43:41 +08:00
}
}
2023-12-19 18:33:02 +08:00
void printByteArray(String printTitle, Uint8List byteArray) {
final int chunkSize = byteArray.length; // 每行显示的字节数
int length = byteArray.length;
for (int i = 0; i < length; i += chunkSize) {
int end = (i + chunkSize < length) ? i + chunkSize : length;
Uint8List chunk = byteArray.sublist(i, end);
String hexString =
chunk.map((byte) => byte.toRadixString(16).padLeft(2, '0')).join(' ');
debugPrint(hexString);
}
}
String uint8ListToHexString(Uint8List uint8List) {
return hex.encode(uint8List);
}
2023-12-11 10:43:41 +08:00
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];
}
}
2023-12-19 18:41:51 +08:00
Future<void> _initializeAudioPlayer() async {
await _audioPlayer.openPlayer();
2023-12-11 10:43:41 +08:00
}
2023-12-19 18:41:51 +08:00
Future<void> _playRawData(Uint8List rawData) async {
await _audioPlayer.startPlayer(
fromDataBuffer: rawData,
codec: Codec.pcm16,
whenFinished: () {
// 播放完成时的回调
print("Playback finished");
},
2023-12-11 10:43:41 +08:00
);
}
}