import 'dart:math'; import 'package:flutter/services.dart'; import 'package:star_lock/app_settings/app_settings.dart'; import 'package:star_lock/talk/starChart/proto/talk_data.pb.dart'; import 'package:star_lock/talk/starChart/star_chart_manage.dart'; import 'package:star_lock/talk/starChart/webView/h264_web_view_state.dart'; import 'package:star_lock/tools/baseGetXController.dart'; import 'package:webview_flutter/webview_flutter.dart'; class H264WebViewLogic extends BaseGetXController { final H264WebViewState state = H264WebViewState(); @override void onInit() { super.onInit(); // 初始化 WebView 控制器 state.webViewController = WebViewController() ..setJavaScriptMode(JavaScriptMode.unrestricted) ..enableZoom(false) ..addJavaScriptChannel( 'Flutter', onMessageReceived: (message) { print("来自 HTML 的消息: ${message.message}"); }, ); // 加载本地 HTML _loadLocalHtml(); // 创建流数据监听 _createFramesStreamListen(); } void _createFramesStreamListen() async { state.talkDataRepository.talkDataStream.listen((TalkData event) async { // 发送数据给js处理 _sendBufferedData(event.content); }); } /// 加载html文件 Future _loadLocalHtml() async { // 加载 HTML 文件内容 final String fileHtmlContent = await rootBundle.loadString('assets/html/h264.html'); // 加载 JS 文件内容 final String jsContent = await rootBundle.loadString('assets/html/jmuxer.min.js'); // 将 JS 文件内容嵌入到 HTML 中 final String htmlWithJs = fileHtmlContent.replaceAll( '', // 替换掉引用外部 JS 的标签 '' // 使用内联方式嵌入 JS 内容 ); // 加载最终的 HTML 字符串到 WebView 中 if (state.webViewController != null) { state.webViewController.loadHtmlString(htmlWithJs); // 设置 baseUrl 避免资源加载问题 } } // 修改后的发送方法 _sendBufferedData(List buffer) async { // 原始发送逻辑 String jsCode = "feedDataFromFlutter($buffer);"; await state.webViewController.runJavaScript(jsCode); } @override void onClose() { super.onClose(); StartChartManage().startTalkHangupMessageTimer(); } }