style:整理代码

This commit is contained in:
liyi 2024-12-13 14:29:33 +08:00
parent b7da72a1ce
commit 23b8257779
3 changed files with 69 additions and 121 deletions

Binary file not shown.

View File

@ -2,7 +2,6 @@ import 'package:get/get.dart';
import 'package:star_lock/common/safetyVerification/safetyVerification_binding.dart'; import 'package:star_lock/common/safetyVerification/safetyVerification_binding.dart';
import 'package:star_lock/flavors.dart'; import 'package:star_lock/flavors.dart';
import 'package:star_lock/login/forgetPassword/starLock_forgetPassword_xhj_page.dart'; import 'package:star_lock/login/forgetPassword/starLock_forgetPassword_xhj_page.dart';
import 'package:star_lock/login/login/JMuxerApp.dart';
import 'package:star_lock/login/login/starLock_login_xhj_page.dart'; import 'package:star_lock/login/login/starLock_login_xhj_page.dart';
import 'package:star_lock/login/register/starLock_register_binding.dart'; import 'package:star_lock/login/register/starLock_register_binding.dart';
import 'package:star_lock/login/register/starLock_register_xhj_page.dart'; import 'package:star_lock/login/register/starLock_register_xhj_page.dart';
@ -398,7 +397,6 @@ abstract class Routers {
static const String ownedKeyListPage = '/ownedKeyListPage'; // static const String ownedKeyListPage = '/ownedKeyListPage'; //
static const String starLockLoginPage = '/StarLockLoginPage'; // static const String starLockLoginPage = '/StarLockLoginPage'; //
static const String LocalHtmlPage = '/LocalHtmlPage'; // LocalHtmlPage
static const String starLockRegisterPage = '/StarLockRegisterPage'; // static const String starLockRegisterPage = '/StarLockRegisterPage'; //
static const String starLockForgetPasswordPage = static const String starLockForgetPasswordPage =
'/StarLockForgetPasswordPage'; // '/StarLockForgetPasswordPage'; //
@ -640,9 +638,6 @@ abstract class AppRouters {
page: () => F.sw( page: () => F.sw(
skyCall: () => const StarLockLoginPage(), skyCall: () => const StarLockLoginPage(),
xhjCall: () => const StarLockLoginXHJPage()), xhjCall: () => const StarLockLoginXHJPage()),
),GetPage<dynamic>(
name: Routers.LocalHtmlPage,
page: () => LocalHtmlPage(),
), ),
GetPage<dynamic>( GetPage<dynamic>(
name: Routers.starLockRegisterPage, name: Routers.starLockRegisterPage,

View File

@ -2,22 +2,35 @@ import 'dart:async';
import 'dart:convert'; import 'dart:convert';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart' show ByteData, Uint8List, rootBundle; import 'package:flutter/services.dart' show ByteData, Uint8List, rootBundle;
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:star_lock/app_settings/app_colors.dart'; import 'package:star_lock/app_settings/app_colors.dart';
import 'package:star_lock/talk/startChart/handle/other/talk_data_repository.dart';
import 'package:star_lock/tools/titleAppBar.dart'; import 'package:star_lock/tools/titleAppBar.dart';
import 'package:webview_flutter/webview_flutter.dart'; import 'package:webview_flutter/webview_flutter.dart';
class LocalHtmlPage extends StatefulWidget { class H264WebView extends StatefulWidget {
@override @override
_LocalHtmlPageState createState() => _LocalHtmlPageState(); _H264WebViewState createState() => _H264WebViewState();
} }
class _LocalHtmlPageState extends State<LocalHtmlPage> { class _H264WebViewState extends State<H264WebView> {
late final WebViewController _controller; late final WebViewController _controller;
Timer? timer; Timer? timer;
Timer? _sendTimer;
// 访
final List<int> _buffer = [];
// html文件间隔时间
final int sendDataToHtmlIntervalTime = 820;
//
final TalkDataRepository talkDataRepository = TalkDataRepository.instance;
@override @override
void initState() { void initState() {
super.initState(); super.initState();
_controller = WebViewController() _controller = WebViewController()
..setJavaScriptMode(JavaScriptMode.unrestricted) ..setJavaScriptMode(JavaScriptMode.unrestricted)
..enableZoom(false) ..enableZoom(false)
@ -30,135 +43,52 @@ class _LocalHtmlPageState extends State<LocalHtmlPage> {
// HTML // HTML
_loadLocalHtml(); _loadLocalHtml();
simulateStreamFromAsset();
_sendFramesToHtml(); _sendFramesToHtml();
} }
void _sendFramesToHtml() async { void simulateStreamFromAsset() async {
// assets/demo.h264 // assets
final ByteData data = await rootBundle.load('assets/talk.h264'); final ByteData data = await rootBundle.load('assets/talk.h264');
final List<int> byteData = data.buffer.asUint8List(); final List<int> byteData = data.buffer.asUint8List();
// NALU chunks
final List<int> chunks = extractChunks(byteData);
final int total = chunks.length;
int current = 0; int current = 0;
int start = 0; int start = 0;
int end = 0; int end = 0;
List<int> buffer = []; // final List<int> chunks = extractChunks(byteData);
//
timer ??= Timer.periodic(Duration(milliseconds: 10), (timer) {
// 800 if (current >= chunks.length) {
timer ??= Timer.periodic(Duration(milliseconds: 800), (timer) async { print('数据已经发完,重新进行发送');
if (current >= total) {
current = 0;
start = 0; start = 0;
print("All frames sent. Restarting from the beginning."); end = 0;
current = 0;
timer.cancel();
return;
} }
// NALU chunks
end = chunks[current]; end = chunks[current];
current++; current++;
//
List<int> frameData = byteData.sublist(start, end); List<int> frameData = byteData.sublist(start, end);
buffer.addAll(frameData); if (frameData.length == 0) timer.cancel();
talkDataRepository.addTalkData(frameData);
start = end; start = end;
//
if (buffer.isNotEmpty) {
await _sendBufferedData(buffer);
buffer.clear(); //
}
//
if (current % 50 == 0) {
print("I am serving, no problem!");
}
if (current == 0) {
print("Started from first chunk...");
}
//
if (current >= total) {
timer.cancel();
print('All frames sent. Stopping timer...');
}
}); });
} }
int getFrameSize(List<int> data, int offset) { void _sendFramesToHtml() async {
// Start Code (0x000001 0x00000001) //
const List<int> startCode1 = [0, 0, 0, 1]; // Start Code: 0x000001 talkDataRepository.talkDataStream.listen((event) async {
const List<int> startCode2 = [ _buffer.addAll(event);
0, });
0, // 800ms的数据
1 _sendTimer ??= Timer.periodic(
]; // Start Code: 0x000001 (0x00000001 version) Duration(milliseconds: sendDataToHtmlIntervalTime), (timer) async {
//
// Start Code if (_buffer.isNotEmpty) {
int startCodeStart = -1; await _sendBufferedData(_buffer);
int startCodeEnd = -1; _buffer.clear(); //
for (int i = offset; i < data.length - 3; i++) {
// Start Code (0x000001 0x00000001)
if (_matchesStartCode(data, i, startCode1)) {
startCodeStart = i;
startCodeEnd = i + startCode1.length;
break;
} else if (_matchesStartCode(data, i, startCode2)) {
startCodeStart = i;
startCodeEnd = i + startCode2.length;
break;
} }
} });
// Start Code 0
if (startCodeStart == -1) return 0;
// Start Code
int nextStartCodeStart = -1;
for (int i = startCodeEnd; i < data.length - 3; i++) {
if (_matchesStartCode(data, i, startCode1) ||
_matchesStartCode(data, i, startCode2)) {
nextStartCodeStart = i;
break;
}
}
// Start Code NAL
if (nextStartCodeStart == -1) {
return data.length - startCodeStart;
}
// NAL
return nextStartCodeStart - startCodeStart;
}
// Start Code
bool _matchesStartCode(List<int> data, int index, List<int> startCode) {
for (int i = 0; i < startCode.length; i++) {
if (data[index + i] != startCode[i]) {
return false;
}
}
return true;
}
Future<void> _loadLocalHtml() async {
final String fileHtmlContent =
await rootBundle.loadString('assets/html/h264.html');
_controller.loadHtmlString(fileHtmlContent);
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: WebViewWidget(controller: _controller),
);
}
_sendBufferedData(List<int> buffer) async {
String jsCode = "feedDataFromFlutter(${buffer});";
await _controller.runJavaScript(jsCode);
} }
// NALU chunks // NALU chunks
@ -170,7 +100,7 @@ class _LocalHtmlPageState extends State<LocalHtmlPage> {
int state = 0; int state = 0;
int lastIndex = 0; int lastIndex = 0;
List<int> result = []; List<int> result = [];
const minNaluPerChunk = 30; // NALU数量 const minNaluPerChunk = 22; // NALU数量
while (i < length) { while (i < length) {
value = byteData[i++]; value = byteData[i++];
@ -215,13 +145,36 @@ class _LocalHtmlPageState extends State<LocalHtmlPage> {
result.add(lastIndex); result.add(lastIndex);
} }
return result; return result;
} }
/// html文件
Future<void> _loadLocalHtml() async {
final String fileHtmlContent =
await rootBundle.loadString('assets/html/h264.html');
_controller.loadHtmlString(fileHtmlContent);
}
// js处理
_sendBufferedData(List<int> buffer) async {
String jsCode = "feedDataFromFlutter(${buffer});";
await _controller.runJavaScript(jsCode);
}
@override
Widget build(BuildContext context) {
return WebViewWidget(controller: _controller);
}
@override @override
void dispose() { void dispose() {
timer?.cancel(); timer?.cancel();
timer=null; timer = null;
_sendTimer?.cancel();
timer = null;
// talkDataRepository.dispose();
super.dispose(); super.dispose();
} }
} }