import 'package:flutter/services.dart'; import 'package:hgdj/hj_utils/store_keys.dart'; import 'package:hgdj/track_event_manager/device_service.dart'; import 'light_model.dart'; /// H.265(HEVC) 能力判断 + 反应式回退。 /// /// 两层防线,最坏结果都是"回落 H.264",不会黑屏: /// 1. 主动:启动时查芯片**硬解**能力([_hwSupport]),只在支持的机器上选 265(省带宽); /// 软解一律当不支持(软解 1080p HEVC 中低端机必卡)。 /// 2. 反应式:万一芯片虚报硬解 / iOS 的 hev1 封装 / 海思类问题导致 265 放不出, /// 由播放器 catch 里调 [disableForDevice] 永久置位并落本地,之后该机只播 264。 /// 与 video_view_type 的 platformView 机制同一套路(不预判机型,出错再降级+持久化)。 class CodecSupport { static const _channel = MethodChannel(DeviceInfoService.naticeChannel); /// 芯片是否硬解 H.265(内存态,构造播放器时同步读)。hardware static bool _hwSupport = false; /// 本机是否已被反应式禁用 265(持久化)。 static bool _deviceDisabled = false; /// 最终是否使用 265:芯片硬解支持 且 未被反应式禁用。 static bool get useH265 => _hwSupport && !_deviceDisabled; /// 芯片硬解能力 / 本机是否已禁 265(诊断用只读) static bool get hwSupport => _hwSupport; static bool get deviceDisabled => _deviceDisabled; /// 启动时调用一次(main 里):查硬解能力 + 读本机禁用标记。 /// 任何异常都按"不支持"处理 → 回落 264 最安全。 static Future init() async { _deviceDisabled = await lightKV.getBool(StoreKeys.H265_DISABLED) ?? false; try { _hwSupport = await _channel.invokeMethod('isH265HardwareSupported') ?? false; } catch (e) { _hwSupport = false; } } /// 播 265 失败且 platformView 也救不了时调用:本机永久回落 264 并落本地。 /// 健康机(已禁用/从没启用过 265)都是空操作。返回 true 表示本次发生了禁用(值得回落重试)。 static bool disableForDevice() { if (_deviceDisabled) return false; _deviceDisabled = true; lightKV.setBool(StoreKeys.H265_DISABLED, true); return true; } }