2023-12-20 09:36:54 +08:00

205 lines
9.0 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: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<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) {
// 如果是音频数据且状态符合条件
// 用你的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<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));
}
// 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<void> _initializeAudioPlayer() async {
await _audioPlayer.openPlayer();
}
Future<void> _playRawData(Uint8List rawData) async {
await _audioPlayer.startPlayer(
fromDataBuffer: rawData,
codec: Codec.pcm16,
whenFinished: () {
// 播放完成时的回调
print("Playback finished");
},
);
}
}