import 'dart:typed_data'; import 'package:flutter/material.dart'; 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'; import '../../tools/eventBusEventManage.dart'; class CallTalk { static CallTalk? _manager; 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; // 假设有这个成员变量 var growableList; LockMonitoringPage callOut = const LockMonitoringPage(); FlutterSoundPlayer _audioPlayer = FlutterSoundPlayer(); CallTalk._init() { iframe = IframeInfo(); _initializeAudioPlayer(); } static CallTalk _share() { _manager ??= CallTalk._init(); return _manager!; } factory CallTalk() => _share(); CallTalk get manager => _share(); Future 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) { // 如果是音频数据且状态符合条件 // 用你的711音频数据替换这里的Uint8List Uint8List rawData = G711Decoder().decodeG711uLaw(bb); _playRawData(rawData); } // 视频数据 else { // 音视频数据开始下标 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 int getBagIndex = bb[POS_bag_index] & 0xff; print('当前包号 getBagIndex:$getBagIndex'); // 总包数 69 int getBagNum = bb[POS_bag_num] & 0xff; print('总包数 getBagNum:$getBagNum'); // 数据长度 73 int blen = bb[POS_blen] + bb[POS_blen + 1] * 256; print('数据长度 blen:$blen'); // 这里判断是否是同一帧,如果不是同一帧就重新创建一个 IframeInfo if (getIframeIndex != iframe!.iframeIndex) { iframe = IframeInfo(); // 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); } 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); // } // 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'); } // copyBytes(iframe!.bb!, start, bb, POS_data, blen); // 打印输出看看字节数组的内容 print( 'iframe.bagNum: ${iframe!.bagNum} iframe.bagReceive: ${iframe!.bagReceive}'); // 如果收到的包数等于总包数,说明这一帧数据已经接收完毕 if (iframe!.bagNum == iframe!.bagReceive) { // List 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)); } // Get.toNamed(Routers.lockMonitoringPage, arguments: { // "lockId": "111" // }); // 打印拷贝后的目标数据 // print(iframe.bb); } } 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); } 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 _initializeAudioPlayer() async { await _audioPlayer.openPlayer(); } Future _playRawData(Uint8List rawData) async { await _audioPlayer.startPlayer( fromDataBuffer: rawData, codec: Codec.pcm16, whenFinished: () { // 播放完成时的回调 print("Playback finished"); }, ); } }