对讲视频图片数据接收渲染
This commit is contained in:
parent
c2823155b4
commit
adcb097205
@ -20,22 +20,23 @@ class _LockMonitoringPageState extends State<LockMonitoringPage> {
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Container(
|
||||
return SizedBox(
|
||||
width: 1.sw,
|
||||
height: 1.sh,
|
||||
color: Colors.white,
|
||||
child: Column(
|
||||
children: [
|
||||
Stack(
|
||||
// color: Colors.transparent,
|
||||
child: Stack(
|
||||
// alignment: Alignment.bottomCenter,
|
||||
children: [
|
||||
state.listData.value.isEmpty ? Image.asset("images/icon_test20231113.png", width: 1.sw, height: 1.sh, fit: BoxFit.cover) :
|
||||
Image.memory(
|
||||
Uint8List.fromList(state.listData.value),
|
||||
width: 1.sw,
|
||||
height: 1.sh,
|
||||
fit: BoxFit.cover,
|
||||
),
|
||||
// state.listData.value.isEmpty ? Image.asset("images/icon_test20231113.png", width: 1.sw, height: 1.sh, fit: BoxFit.cover) :
|
||||
Obx(() =>
|
||||
state.listData.value.isEmpty
|
||||
? Container(color: Colors.red)
|
||||
:Image.memory(
|
||||
Uint8List.fromList(state.listData.value),
|
||||
width: 1.sw,
|
||||
height: 1.sh,
|
||||
fit: BoxFit.cover,
|
||||
)),
|
||||
Positioned(
|
||||
top: ScreenUtil().statusBarHeight + 30.h,
|
||||
child: Row(children: [
|
||||
@ -79,8 +80,6 @@ class _LockMonitoringPageState extends State<LockMonitoringPage> {
|
||||
))
|
||||
],
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@ -1,13 +1,8 @@
|
||||
|
||||
|
||||
import '../../../../tools/baseGetXController.dart';
|
||||
import '../../../../tools/storage.dart';
|
||||
import 'demoModeLockDetail_state.dart';
|
||||
|
||||
class DemoModeLockDetailLogic extends BaseGetXController {
|
||||
DemoModeLockDetailState state = DemoModeLockDetailState();
|
||||
|
||||
|
||||
|
||||
@override
|
||||
void onReady() {
|
||||
|
||||
@ -19,7 +19,7 @@ class DemoModeLockDetailPage extends StatefulWidget {
|
||||
|
||||
class _DemoModeLockDetailPageState extends State<DemoModeLockDetailPage> {
|
||||
final logic = Get.put(DemoModeLockDetailLogic());
|
||||
final state = Get.find<DemoModeLockDetailLogic>().state;
|
||||
// final state = Get.find<DemoModeLockDetailLogic>().state;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
|
||||
@ -1,5 +0,0 @@
|
||||
|
||||
|
||||
class DemoModeLockDetailState {
|
||||
|
||||
}
|
||||
@ -1,5 +1,6 @@
|
||||
|
||||
import 'dart:async';
|
||||
import 'dart:typed_data';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:pull_to_refresh/pull_to_refresh.dart';
|
||||
import 'package:star_lock/talk/udp/udp_senderManage.dart';
|
||||
|
||||
@ -1,11 +1,8 @@
|
||||
|
||||
import '../../../../tools/baseGetXController.dart';
|
||||
import 'lockAddress_state.dart';
|
||||
|
||||
class LockAddressLogic extends BaseGetXController {
|
||||
|
||||
final LockAddressState state = LockAddressState();
|
||||
|
||||
@override
|
||||
void onReady() {
|
||||
// TODO: implement onReady
|
||||
|
||||
@ -1,5 +0,0 @@
|
||||
|
||||
|
||||
class LockAddressState {
|
||||
|
||||
}
|
||||
@ -1,9 +1,6 @@
|
||||
|
||||
|
||||
import '../tools/baseGetXController.dart';
|
||||
import 'navState.dart';
|
||||
|
||||
class NavLogic extends BaseGetXController {
|
||||
final NavState state = NavState();
|
||||
|
||||
}
|
||||
@ -1,5 +0,0 @@
|
||||
|
||||
|
||||
class NavState{
|
||||
|
||||
}
|
||||
@ -1,4 +1,5 @@
|
||||
import 'dart:typed_data';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:convert/convert.dart';
|
||||
import 'package:flutter_sound/flutter_sound.dart';
|
||||
// import 'package:just_audio/just_audio.dart';
|
||||
@ -9,6 +10,7 @@ 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;
|
||||
@ -19,10 +21,23 @@ class CallTalk {
|
||||
static int FIRSTINDEX = 1;
|
||||
|
||||
int status = 0; // 假设有这个成员变量
|
||||
IframeInfo iframe = IframeInfo(); // 假设有这个成员变量
|
||||
IframeInfo? iframe; // 假设有这个成员变量
|
||||
var growableList;
|
||||
LockMonitoringPage callOut = const LockMonitoringPage();
|
||||
late FlutterSoundPlayer _player;
|
||||
|
||||
CallTalk._init() {
|
||||
iframe = IframeInfo();
|
||||
}
|
||||
|
||||
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 =
|
||||
@ -46,44 +61,88 @@ class CallTalk {
|
||||
}
|
||||
// 视频数据
|
||||
else {
|
||||
int bagLen = getShortFromByte(bb, POS_blen + 2);
|
||||
int getIframeIndex = getShortFromByte(bb, POS_iframe_index);
|
||||
int alen = getShortFromByte(bb, POS_alen);
|
||||
int blen = getShortFromByte(bb, POS_blen);
|
||||
int getBagIndex = bb[POS_bag_index] & 0xff;
|
||||
int getBagNum = bb[POS_bag_num] & 0xff;
|
||||
// 音视频数据开始下标
|
||||
var bagLen = bb[POS_blen + 2] + bb[POS_blen + 3] * 256;
|
||||
// print('音视频数据开始下标 bagLen:$bagLen');
|
||||
|
||||
if (getIframeIndex != iframe.iframeIndex) {
|
||||
// 获取帧序号 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);
|
||||
// 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!.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);
|
||||
// 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');
|
||||
}
|
||||
|
||||
print('bbbbbb111: ${bb}');
|
||||
iframe.bb!.addAll(bb.sublist(76, bb.length));
|
||||
|
||||
// copyBytes(iframe!.bb!, start, bb, POS_data, blen);
|
||||
// 打印输出看看字节数组的内容
|
||||
print('Copied Bytes: ${iframe.bb}');
|
||||
|
||||
if(iframe.bagNum == iframe.bagReceive){
|
||||
Uint8List data = iframe.bb!.sublist(0, iframe.cur_len);
|
||||
print('播放第%d帧:${iframe.iframeIndex} 一帧图片的Data: $data');
|
||||
eventBus.fire(GetTVDataRefreshUI(data));
|
||||
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"
|
||||
// });
|
||||
@ -92,6 +151,24 @@ class CallTalk {
|
||||
}
|
||||
}
|
||||
|
||||
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);
|
||||
|
||||
@ -17,6 +17,6 @@ class IframeInfo {
|
||||
bagReceive = 0;
|
||||
isFull = false;
|
||||
cur_len = 0;
|
||||
bb = Uint8List(512);
|
||||
bb = Uint8List(0);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,4 +1,3 @@
|
||||
|
||||
import 'dart:typed_data';
|
||||
|
||||
import '../../tools/toast.dart';
|
||||
@ -6,30 +5,28 @@ import '../call/callTalk.dart';
|
||||
import 'udp_talkClass.dart';
|
||||
|
||||
class CommandUDPReciverManager {
|
||||
|
||||
static void appDataReceive(List<int> data) async {
|
||||
///解析数据
|
||||
if(data.isEmpty){
|
||||
if (data.isEmpty) {
|
||||
return;
|
||||
}
|
||||
int dataSize = data.length;
|
||||
if(dataSize < 4){
|
||||
if (dataSize < 4) {
|
||||
return;
|
||||
}
|
||||
print("appDataReceiveData:$data");
|
||||
|
||||
Uint8List data1 = Uint8List.fromList(data);
|
||||
if(data1.length==1){
|
||||
if(data[0]==0x30 || data[0]==0x31){
|
||||
if (data1.length == 1) {
|
||||
if (data[0] == 0x30 || data[0] == 0x31) {
|
||||
print("p2p打洞");
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
if (data[6] == 4) {
|
||||
if(data[7] == 2){
|
||||
if (data[7] == 2) {
|
||||
// print("心跳包反馈 在线状态");
|
||||
} else if(data[7]==3) {
|
||||
} else if (data[7] == 3) {
|
||||
[Toast.show(msg: "您已在其他设备登录")];
|
||||
}
|
||||
} else if (data[6] == 150) {
|
||||
@ -42,77 +39,78 @@ class CommandUDPReciverManager {
|
||||
var beiCallType = data[8] & 0xff;
|
||||
print("被呼叫类型$beiCallType");
|
||||
switch (beiCallType) {
|
||||
case 1:{
|
||||
case 1:
|
||||
{
|
||||
//被叫
|
||||
UDPTalkClass().beCallW(data: data);
|
||||
}
|
||||
break;
|
||||
case 6:{
|
||||
case 6:
|
||||
{
|
||||
//接听
|
||||
if((data[7] & 0x3) == 2){//被叫 接听反馈
|
||||
if ((data[7] & 0x3) == 2) {
|
||||
//被叫 接听反馈
|
||||
print("接听反馈");
|
||||
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 7:
|
||||
case 8:{//音视频数据
|
||||
print("音视频数据");
|
||||
case 7:
|
||||
case 8:
|
||||
{
|
||||
//音视频数据
|
||||
// print("音视频数据");
|
||||
CallTalk cllTalk = CallTalk();
|
||||
cllTalk.getAVData(data1, data1.length);
|
||||
}
|
||||
break;
|
||||
case 9:{
|
||||
if((data[7] & 0x3) == 1){//对方保持连接
|
||||
case 9:
|
||||
{
|
||||
if ((data[7] & 0x3) == 1) {
|
||||
//对方保持连接
|
||||
//print("对方保持连接");
|
||||
data[7] = 2;
|
||||
|
||||
} else{
|
||||
} else {
|
||||
//print("保持连接反馈");
|
||||
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 10:{
|
||||
case 10:
|
||||
{
|
||||
//开门反馈
|
||||
if((data[7] & 0x3) == 2){
|
||||
if ((data[7] & 0x3) == 2) {
|
||||
print("开门成功");
|
||||
|
||||
}
|
||||
else{
|
||||
|
||||
}
|
||||
} else {}
|
||||
}
|
||||
break;
|
||||
case 30:{
|
||||
case 30:
|
||||
{
|
||||
//开门反馈
|
||||
if((data[7] & 0x3) == 1){
|
||||
if ((data[7] & 0x3) == 1) {
|
||||
//对方结束对讲
|
||||
print("对方结束对讲");
|
||||
|
||||
} else{
|
||||
} else {
|
||||
//结束对讲反馈
|
||||
print("结束对讲反馈");
|
||||
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 140:{
|
||||
case 140:
|
||||
{
|
||||
// p2p测试
|
||||
|
||||
}
|
||||
break;
|
||||
case 141:{
|
||||
case 141:
|
||||
{
|
||||
// p2p测试
|
||||
|
||||
}
|
||||
break;
|
||||
case 142:{
|
||||
case 142:
|
||||
{
|
||||
// p2p测试
|
||||
|
||||
}
|
||||
break;
|
||||
case 143:{
|
||||
case 143:
|
||||
{
|
||||
//p2p测试 NSAsk
|
||||
print("p2pNSAskNSAsk");
|
||||
}
|
||||
@ -123,65 +121,60 @@ class CommandUDPReciverManager {
|
||||
} else if (data[6] == 152) {
|
||||
// 监视命令
|
||||
switch (data[8] & 0xff) {
|
||||
case 2:{
|
||||
//被叫
|
||||
print("对方忙");
|
||||
}
|
||||
break;
|
||||
case 4:{
|
||||
//监视成功
|
||||
print("监视成功");
|
||||
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
{
|
||||
//被叫
|
||||
print("对方忙");
|
||||
}
|
||||
break;
|
||||
case 4:
|
||||
{
|
||||
//监视成功
|
||||
print("监视成功");
|
||||
}
|
||||
break;
|
||||
case 7:
|
||||
case 8:{//音视频数据
|
||||
//print("音视频数据");
|
||||
|
||||
}
|
||||
break;
|
||||
case 9:{
|
||||
//保持连接
|
||||
if((data[7] & 0x3) == 1){//对方保持连接
|
||||
//print("对方保持连接");
|
||||
data[7] = 2;
|
||||
|
||||
case 8:
|
||||
{
|
||||
//音视频数据
|
||||
//print("音视频数据");
|
||||
}
|
||||
else{
|
||||
//print("保持连接反馈");
|
||||
|
||||
break;
|
||||
case 9:
|
||||
{
|
||||
//保持连接
|
||||
if ((data[7] & 0x3) == 1) {
|
||||
//对方保持连接
|
||||
//print("对方保持连接");
|
||||
data[7] = 2;
|
||||
} else {
|
||||
//print("保持连接反馈");
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 10:{
|
||||
//开门反馈
|
||||
if((data[7] & 0x3) == 2){
|
||||
print("开门成功");
|
||||
|
||||
break;
|
||||
case 10:
|
||||
{
|
||||
//开门反馈
|
||||
if ((data[7] & 0x3) == 2) {
|
||||
print("开门成功");
|
||||
} else {}
|
||||
}
|
||||
else{
|
||||
|
||||
break;
|
||||
case 30:
|
||||
{
|
||||
// 监视结束
|
||||
if ((data[7] & 0x3) == 1) {
|
||||
// 对方结束监视
|
||||
print("对方结束监视");
|
||||
} else {
|
||||
//结束对讲反馈
|
||||
print("结束监视反馈");
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 30:{
|
||||
// 监视结束
|
||||
if((data[7] & 0x3) == 1){
|
||||
// 对方结束监视
|
||||
print("对方结束监视");
|
||||
|
||||
} else{
|
||||
//结束对讲反馈
|
||||
print("结束监视反馈");
|
||||
|
||||
}
|
||||
}
|
||||
break;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user