添加 network_info_plus 依赖以支持局域网 IP 获取;在事件信息和录制页面中增强局域网 IP 查询功能,更新相关模型以包含 scheduleId 字段;重构录制页面以改善用户体验,修复推流控制器释放逻辑。
This commit is contained in:
@@ -1,3 +1,4 @@
|
||||
import 'dart:async';
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:apivideo_live_stream/apivideo_live_stream.dart';
|
||||
@@ -20,7 +21,6 @@ import 'package:recording_tool/features/recording/widgets/widget_recording_hud.d
|
||||
import 'package:recording_tool/features/recording/widgets/widget_recording_loading_overlay.dart';
|
||||
import 'package:recording_tool/features/recording/widgets/widget_recording_saved_dialog.dart';
|
||||
import 'package:recording_tool/features/recording/widgets/widget_recording_touch_lock_overlay.dart';
|
||||
import 'package:recording_tool/features/scan_qrcode/pages/page_scan_qrcode.dart';
|
||||
import 'package:recording_tool/features/scan_qrcode/utils/rtmp_stream_target.dart';
|
||||
import 'package:recording_tool/shared/widgets/widgets.dart';
|
||||
|
||||
@@ -57,7 +57,7 @@ class _RecordingPageState extends ConsumerState<RecordingPage> {
|
||||
_streamController = ApiVideoLiveStreamController(
|
||||
initialAudioConfig: AudioConfig(bitrate: 128000),
|
||||
initialVideoConfig: VideoConfig.withDefaultBitrate(
|
||||
resolution: Resolution.RESOLUTION_1080,
|
||||
resolution: Resolution.RESOLUTION_720,
|
||||
fps: 30,
|
||||
),
|
||||
onConnectionSuccess: () => {debugPrint('推流成功')},
|
||||
@@ -314,7 +314,7 @@ class _RecordingPageState extends ConsumerState<RecordingPage> {
|
||||
|
||||
/// 返回扫码页,准备新一轮录制。
|
||||
void _recordNewRound() {
|
||||
AppNavigator.pushAndRemoveUntil(const ScanQrCodePage());
|
||||
AppNavigator.pop(context: context);
|
||||
}
|
||||
|
||||
/// 推流结束后按需弹出完成对话框
|
||||
@@ -337,38 +337,53 @@ class _RecordingPageState extends ConsumerState<RecordingPage> {
|
||||
);
|
||||
}
|
||||
|
||||
/// 退出沉浸式并释放录制会话
|
||||
/// 退出沉浸式并释放录制会话。
|
||||
/// 先恢复系统栏,再错开一帧释放编码器,减轻返回动画卡顿。
|
||||
Future<void> _exitRecordingMode() async {
|
||||
if (!_immersiveApplied) return;
|
||||
await ref.read(recordingViewModelProvider.notifier).teardown();
|
||||
await _restoreSystemUiIfNeeded();
|
||||
if (mounted) {
|
||||
await ref.read(recordingViewModelProvider.notifier).teardown();
|
||||
}
|
||||
|
||||
// 让 pop 动画先跑起来,再做 MediaCodec 释放。
|
||||
await Future<void>.delayed(Duration.zero);
|
||||
await _disposeStreamController();
|
||||
}
|
||||
|
||||
Future<void> _restoreSystemUiIfNeeded() async {
|
||||
if (!_immersiveApplied) return;
|
||||
_immersiveApplied = false;
|
||||
await SystemChrome.setEnabledSystemUIMode(
|
||||
SystemUiMode.manual,
|
||||
overlays: SystemUiOverlay.values,
|
||||
);
|
||||
await RecordingPlatform.setImmersiveMode(enabled: false);
|
||||
_immersiveApplied = false;
|
||||
}
|
||||
|
||||
@override
|
||||
/// 页面销毁时恢复系统 UI
|
||||
/// 页面销毁时兜底恢复系统 UI 并释放推流控制器
|
||||
void dispose() {
|
||||
if (_immersiveApplied) {
|
||||
_immersiveApplied = false;
|
||||
SystemChrome.setEnabledSystemUIMode(
|
||||
SystemUiMode.manual,
|
||||
overlays: SystemUiOverlay.values,
|
||||
);
|
||||
RecordingPlatform.setImmersiveMode(enabled: false);
|
||||
unawaited(RecordingPlatform.setImmersiveMode(enabled: false));
|
||||
}
|
||||
_disposeStreamController();
|
||||
unawaited(_disposeStreamController());
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
/// 只 dispose 一次;原生 dispose 内部已 stopStream,避免 stop+dispose 双次停流。
|
||||
Future<void> _disposeStreamController() async {
|
||||
if (_controllerDisposed) return;
|
||||
_controllerDisposed = true;
|
||||
await _streamController.stop();
|
||||
await _streamController.dispose();
|
||||
try {
|
||||
await _streamController.dispose();
|
||||
} catch (error, stackTrace) {
|
||||
debugPrint('释放推流控制器失败: $error\n$stackTrace');
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
@@ -427,9 +442,10 @@ class _RecordingPopScope extends ConsumerWidget {
|
||||
|
||||
return PopScope(
|
||||
canPop: !isRecording,
|
||||
onPopInvokedWithResult: (didPop, result) async {
|
||||
onPopInvokedWithResult: (didPop, result) {
|
||||
if (didPop) {
|
||||
await onExitRecordingMode();
|
||||
// 不 await,避免把 MediaCodec 释放堵在 Pop 回调上。
|
||||
unawaited(onExitRecordingMode());
|
||||
return;
|
||||
}
|
||||
if (isRecording) {
|
||||
|
||||
Reference in New Issue
Block a user