From 3b53a448876bc5c90f76cae276158773aed711e3 Mon Sep 17 00:00:00 2001 From: liyi Date: Mon, 9 Dec 2024 15:57:41 +0800 Subject: [PATCH] =?UTF-8?q?fix:=E5=AE=8C=E5=96=84=E7=8A=B6=E6=80=81?= =?UTF-8?q?=E5=8F=98=E6=9B=B4=E5=92=8C=E9=80=9A=E7=9F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/login/login/starLock_login_page.dart | 1 + lib/main.dart | 3 - .../startChart/command/message_command.dart | 1 - lib/talk/startChart/entity/scp_message.dart | 3 - .../handle/impl/udp_talk_data_handler.dart | 119 +++++++++++++++++- lib/talk/startChart/start_chart_manage.dart | 6 +- pubspec.yaml | 8 +- 7 files changed, 124 insertions(+), 17 deletions(-) diff --git a/lib/login/login/starLock_login_page.dart b/lib/login/login/starLock_login_page.dart index 40a7c771..a5cff8c2 100755 --- a/lib/login/login/starLock_login_page.dart +++ b/lib/login/login/starLock_login_page.dart @@ -250,6 +250,7 @@ class _StarLockLoginPageState extends State { ); }, ), + SizedBox(height: 50.w), Row( mainAxisAlignment: MainAxisAlignment.center, diff --git a/lib/main.dart b/lib/main.dart index 619ff130..d4898717 100755 --- a/lib/main.dart +++ b/lib/main.dart @@ -2,9 +2,6 @@ import 'dart:async'; import 'dart:convert'; import 'dart:io'; -import 'package:crc/crc.dart'; -import 'package:crclib/catalog.dart'; -import 'package:crypto/crypto.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_bugly/flutter_bugly.dart'; diff --git a/lib/talk/startChart/command/message_command.dart b/lib/talk/startChart/command/message_command.dart index 35d57a4d..aef5cb83 100644 --- a/lib/talk/startChart/command/message_command.dart +++ b/lib/talk/startChart/command/message_command.dart @@ -1,7 +1,6 @@ import 'dart:convert'; import 'dart:typed_data'; -import 'package:crc32_checksum/crc32_checksum.dart'; import 'package:star_lock/talk/startChart/constant/message_type_constant.dart'; import 'package:star_lock/talk/startChart/constant/payload_type_constant.dart'; import 'package:star_lock/talk/startChart/constant/protocol_flag_constant.dart'; diff --git a/lib/talk/startChart/entity/scp_message.dart b/lib/talk/startChart/entity/scp_message.dart index ef149264..361b89f4 100644 --- a/lib/talk/startChart/entity/scp_message.dart +++ b/lib/talk/startChart/entity/scp_message.dart @@ -1,7 +1,4 @@ import 'dart:convert'; -import 'package:crc32_checksum/crc32_checksum.dart'; -import 'package:crypto/crypto.dart'; -import 'package:get/get.dart'; import 'package:star_lock/app_settings/app_settings.dart'; import 'package:star_lock/talk/startChart/constant/message_type_constant.dart'; import 'package:star_lock/talk/startChart/constant/payload_type_constant.dart'; diff --git a/lib/talk/startChart/handle/impl/udp_talk_data_handler.dart b/lib/talk/startChart/handle/impl/udp_talk_data_handler.dart index a7e798b4..df6834a7 100644 --- a/lib/talk/startChart/handle/impl/udp_talk_data_handler.dart +++ b/lib/talk/startChart/handle/impl/udp_talk_data_handler.dart @@ -1,3 +1,5 @@ +import 'dart:typed_data'; + import 'package:flutter_easyloading/flutter_easyloading.dart'; import 'package:get/get.dart'; import 'package:star_lock/talk/startChart/entity/scp_message.dart'; @@ -5,6 +7,8 @@ import 'package:star_lock/talk/startChart/handle/scp_message_base_handle.dart'; import 'package:star_lock/talk/startChart/handle/scp_message_handle.dart'; import 'package:star_lock/talk/startChart/proto/gateway_reset.pb.dart'; import 'package:star_lock/talk/startChart/proto/generic.pb.dart'; +import 'package:star_lock/talk/startChart/proto/talk_data.pb.dart'; +import 'package:star_lock/talk/startChart/proto/talk_data.pbserver.dart'; import '../../start_chart_manage.dart'; @@ -21,8 +25,117 @@ class UdpTalkDataHandler extends ScpMessageBaseHandle @override void handleRealTimeData(ScpMessage scpMessage) { - print('收到音视频数据回复:$scpMessage'); - // 收到数据后调用更新,防止定时器超时 - talkDataOverTimeTimerManager.receiveMessage(); + print('收到音视频数据:$scpMessage'); + if (scpMessage.Payload != null) { + final TalkData talkData = scpMessage.Payload; + // 处理音视频数据 + _handleTalkData(talkData: talkData); + // 收到数据后调用更新,防止定时器超时 + talkDataOverTimeTimerManager.receiveMessage(); + } + } + + void _handleTalkData({required TalkData talkData}) { + if (talkData == null) return; + final contentType = talkData.contentType; + switch (contentType) { + case TalkData_ContentTypeE.H264: + _handleVideoH264(talkData); + break; + case TalkData_ContentTypeE.Image: + _handleVideoImage(talkData); + break; + case TalkData_ContentTypeE.G711: + _handleVideoG711(talkData); + break; + default: + print('❌未知的TalkData--->contentType类型'); + break; + } + } + + void _handleVideoH264(TalkData talkData) { + final List content = talkData.content; + // 解析 H.264 NALU + _parseH264Nalus(content); + } + + void _handleVideoImage(TalkData talkData) {} + + void _handleVideoG711(TalkData talkData) {} + + // 解析 H.264 NALU + void _parseH264Nalus(List h264Stream) { + print('开始解析 H.264 NALU...'); + + int index = 0; + while (index < h264Stream.length) { + // 查找下一个 NALU 的起始码 + int nextStartCodeIndex = findNextStartCode(h264Stream, index); + + if (nextStartCodeIndex == -1) { + // 如果没有找到更多的起始码,结束解析 + break; + } + + // 提取当前 NALU + Uint8List naluData = + Uint8List.fromList(h264Stream.sublist(index, nextStartCodeIndex)); + + // 解析 NALU 头部 + int naluType = naluData[0] & 0x1F; // NALU 类型位于第一个字节的低 5 位 + print('找到 NALU,类型: $naluType,长度: ${naluData.length}'); + + // 根据 NALU 类型进行处理 + handleNalu(naluType, naluData); + + // 更新索引到下一个 NALU 的起始位置 + index = nextStartCodeIndex; + } + } + +// 查找下一个 NALU 的起始码 + int findNextStartCode(List data, int startIndex) { + for (int i = startIndex; i < data.length - 3; i++) { + // 检查 3 字节起始码 + if (data[i] == 0x00 && data[i + 1] == 0x00 && data[i + 2] == 0x01) { + return i; + } + + // 检查 4 字节起始码 + if (i < data.length - 4 && + data[i] == 0x00 && + data[i + 1] == 0x00 && + data[i + 2] == 0x00 && + data[i + 3] == 0x01) { + return i; + } + } + + // 如果没有找到更多的起始码,返回 -1 + return -1; + } + + // 处理 NALU + void handleNalu(int naluType, Uint8List naluData) { + switch (naluType) { + case 5: + print('IDR 帧 (关键帧)'); + break; + case 1: + print('非 IDR 帧 (P 帧)'); + break; + case 7: + print('SPS (序列参数集)'); + break; + case 8: + print('PPS (图像参数集)'); + break; + default: + print('其他 NALU 类型: $naluType'); + } + + // 你可以在这里根据 NALU 类型进行进一步处理 + // 例如,将 SPS 和 PPS 传递给解码器,或将视频帧渲染到屏幕上 } } diff --git a/lib/talk/startChart/start_chart_manage.dart b/lib/talk/startChart/start_chart_manage.dart index 06b56e73..157d1a6f 100644 --- a/lib/talk/startChart/start_chart_manage.dart +++ b/lib/talk/startChart/start_chart_manage.dart @@ -653,9 +653,9 @@ class StartChartManage { // 处理返回数据 _handleUdpResultData(deserialize); } - if (deserialize.PayloadType != PayloadTypeConstant.heartbeat) { - _log(text: 'Udp收到结构体数据---》$deserialize'); - } + // if (deserialize.PayloadType != PayloadTypeConstant.heartbeat) { + // _log(text: 'Udp收到结构体数据---》$deserialize'); + // } } } catch (e) { _log(text: '❌ Udp result data error ----> $e'); diff --git a/pubspec.yaml b/pubspec.yaml index 93d950d6..74648385 100755 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -211,7 +211,7 @@ dependencies: jpush_flutter: ^2.5.1 #视频播放器 - video_player: ^2.8.5 + video_player: ^2.9.2 #控制横竖屏控件 auto_orientation: ^2.3.1 audioplayers: ^5.2.1 @@ -247,13 +247,13 @@ dependencies: flutter_bugly: ^1.0.2 open_filex: ^4.4.0 - crc32_checksum: ^0.0.2 + cryptography: ^2.7.0 asn1lib: ^1.0.0 fast_rsa: ^3.6.6 - crc: ^0.0.2 - crclib: ^3.0.0 protobuf: ^3.1.0 + better_player: ^0.0.63 + dependency_overrides: