pengchujin:TCL MT5879 无法取帧导致航拍壁纸预览露出旧画面

在 Aerial-TV issue #921 中,pengchujin 记录 TCL MT5879 上 PixelCopy 读取 4K 帧会阻塞渲染,MediaMetadataRetriever 可能卡死 TCL 解码器并造成黑屏或 ANR,因此该类设备不再从文件取帧,只在停止操作两分钟后尝试截图;同时提出在 Aerial 进程内用 Media3 和软件解码器取关键帧、或暂时使用黑底和地点信息的缓解方案,均标明尚未提交或仍待实现。

作者原文

现象(TCL MT5879,Android 11,1.69 之后的 main)

  • 个性化里「航拍」卡片的预览图和当前播放的影片不是同一个画面。
  • 进 App 时,App 盖上来之前约 1.7 秒能看到一张旧的壁纸图。
  • 从 App 回到桌面、影片从静态变动态时,会闪出这张旧图(就是个性化预览里那张),约 2 秒后影片才淡入。

小米 MFTR0 上没有这些问题。

原因

TCL 上取不到影片当前的帧,壁纸图(files/live-frame.jpg,个性化卡片和桌面静帧都用它)常常停在很早以前的画面:

  • PixelCopy 能读到视频,但复制一帧 4K 要 0.6–1.7 秒,会卡住渲染线程、按键积压,所以不能在停下或离开时用。
  • 用 MediaMetadataRetriever 从 Apple 的 1080p 文件解帧会卡死在 TCL 自己的 TclMPEG4Extractor 里,占住 mediaserver 的取帧锁,后面所有取帧请求排队;请求多了 MediaCodecList 也会挂住(Aerial 黑屏、ANR,只能重启电视)。51d1d9a 起这类电视不再从文件取帧,玻璃也改成不用帧(底板烟色、面板纯色)。
  • onPause 到 onStop 只有约 260 ms,中间没有一帧,解码器又要马上放给下一个 App,所以「离开时截屏」也做不到。现在只有影片停下后 2 分钟没按键,才用 PixelCopy 截一次。

小米能从文件解帧,进 App 时和进 App 后 3 秒都会把壁纸图更新到离开那一刻,所以没有问题。

可以考虑的做法

  • 根治:在 Aerial 进程里自己解帧,绕开 mediaserver 和 TCL 的解析器。用 Media3 的 Mp4Extractor 读出那一刻的关键帧,交给软件解码器 c2.android.avc.decoder(这台电视有)解成一张图。只在停下时解,不在播放时解,避免和 4K 播放抢资源。
  • 缓解(试过,没提交):没帧时让暂停的影片留到 onStop 再放解码器,不切回旧图;壁纸图过时的回来先黑底等影片(像杜比视界屏保回来时);卡片改成显示当前片子的地点,不显示旧图。

详细记录见 docs/HANDOFF.md、docs/ARCHITECTURE.md「航拍壁纸取不到帧的电视」和 docs/devices/tcl-mt5879-cn.md。

🤖 Generated with Claude Code