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 就会变成随机值(可能为负数/超大),引发崩溃或卡死。
修复思路(工程化)
- stop(closeInput=false) 进入 drain 模式:尽量把正在读取的 header/payload 补齐后再退出(设置 deadline)
readFully不再因为 stop 立刻跳出,而是在 drain 模式下尝试读满- 对
frameLength做合法性校验:<=0或超上限则停止读取,避免直接崩溃 - stop 期间的 dequeue cancelled 降噪:
isRunning=false时不再刷错误堆栈
这个策略的目标不是“错位后自愈”(流无同步字节基本做不到),而是尽量避免进入错位状态,并在异常情况下安全退出。