154 lines
5.0 KiB
Dart
154 lines
5.0 KiB
Dart
import 'dart:typed_data';
|
||
import 'package:flutter/material.dart';
|
||
import 'package:flutter_sound/flutter_sound.dart';
|
||
import 'package:get/get.dart';
|
||
import 'package:get/get_core/src/get_main.dart';
|
||
import 'package:star_lock/appRouters.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;
|
||
bool getFirstFrame = false; //是否得到了第一帧
|
||
final 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 {
|
||
// 音频数据
|
||
if (bb[61] == 1) {
|
||
print('dinglingling bb.length:${bb.length} 音频数据来:$bb ');
|
||
// 用你的711音频数据替换这里的Uint8List
|
||
// Uint8List rawData = G711Decoder().decodeG711uLaw(bb);
|
||
// 示例 G711 数据(u-law 或 a-law)
|
||
|
||
Uint8List g711Data = bb.sublist(77, bb.length);
|
||
// 解码为 PCM 数据
|
||
Uint8List pcmData = G711Decoder().g711Decode(g711Data, G711Type.uLaw);
|
||
// 现在你可以使用 pcmData 进行播放或其他处理
|
||
print('得到的pcmData:$pcmData');
|
||
|
||
_playRawData(pcmData);
|
||
}
|
||
// 视频数据
|
||
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();
|
||
iframe!.iframeIndex = getIframeIndex;
|
||
iframe!.bagNum = getBagNum;
|
||
// iframe!.cur_len = alen;
|
||
// iframe!.bb = Uint8List(alen);
|
||
growableList = iframe!.bb!.toList(growable: true);
|
||
}
|
||
|
||
iframe!.bagReceive++;
|
||
|
||
// 如果是同一帧就添加起来
|
||
if (getIframeIndex == iframe!.iframeIndex) {
|
||
var getList = bb.sublist(77, bb.length);
|
||
growableList.addAll(getList);
|
||
}
|
||
// print('iframe.bagNum: ${iframe!.bagNum} iframe.bagReceive: ${iframe!.bagReceive}');
|
||
|
||
// 如果收到的包数等于总包数,说明这一帧数据已经接收完毕
|
||
if (iframe!.bagNum == iframe!.bagReceive) {
|
||
// print('播放第${iframe!.iframeIndex}帧 一帧图片的hexStringData: ${Uint8List.fromList(growableList)}');
|
||
|
||
//判断第一帧是否接收到
|
||
if (iframe!.iframeIndex == 0) {
|
||
getFirstFrame = true;
|
||
eventBus.fire(GetFirstFrameGoPush(getFirstFrame));
|
||
}
|
||
|
||
eventBus.fire(GetTVDataRefreshUI(growableList));
|
||
}
|
||
}
|
||
}
|
||
|
||
//视频相关处理
|
||
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);
|
||
}
|
||
}
|
||
|
||
//音频相关处理
|
||
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");
|
||
},
|
||
);
|
||
}
|
||
}
|