无界 Uncon
Harddecode

后台恢复黑屏/崩溃修复

pause/resume 导致流错位的根因与工程解法

现象

后台/最小化后恢复,可能出现:

  • NegativeArraySizeException(frameLength 解析为负数)
  • 长期黑屏(视频流错位后无法自同步)
  • Pending dequeue output buffer request cancelled(stop 时的噪音异常)

根因(关键)

scrcpy 的视频流是“每帧 16B header + payload”,没有魔数/同步字节。

如果在 pause(stop(closeInput=false)) 时,读线程正处于 header/payload 读取中途被打断退出,就会把 socket 停在“半帧位置”。 下一次 resume 从 payload 中间开始当 header 解析,frameLength 就会变成随机值(可能为负数/超大),引发崩溃或卡死。

修复思路(工程化)

  1. stop(closeInput=false) 进入 drain 模式:尽量把正在读取的 header/payload 补齐后再退出(设置 deadline)
  2. readFully 不再因为 stop 立刻跳出,而是在 drain 模式下尝试读满
  3. frameLength 做合法性校验:<=0 或超上限则停止读取,避免直接崩溃
  4. stop 期间的 dequeue cancelled 降噪:isRunning=false 时不再刷错误堆栈

这个策略的目标不是“错位后自愈”(流无同步字节基本做不到),而是尽量避免进入错位状态,并在异常情况下安全退出。

On this page