2023-12-21 16:48:07 +08:00

154 lines
5.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: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");
},
);
}
}