对讲视频图片数据接收渲染

This commit is contained in:
魏少阳 2023-12-19 18:33:02 +08:00
parent c2823155b4
commit adcb097205
12 changed files with 203 additions and 159 deletions

View File

@ -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> {
))
],
),
],
),
);
}

View File

@ -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() {

View File

@ -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() {

View File

@ -1,5 +0,0 @@
class DemoModeLockDetailState {
}

View File

@ -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';

View File

@ -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

View File

@ -1,5 +0,0 @@
class LockAddressState {
}

View File

@ -1,9 +1,6 @@
import '../tools/baseGetXController.dart';
import 'navState.dart';
class NavLogic extends BaseGetXController {
final NavState state = NavState();
}

View File

@ -1,5 +0,0 @@
class NavState{
}

View File

@ -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);

View File

@ -17,6 +17,6 @@ class IframeInfo {
bagReceive = 0;
isFull = false;
cur_len = 0;
bb = Uint8List(512);
bb = Uint8List(0);
}
}

View File

@ -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;
}
}
}
}