аудио: убрать потери кадров (Concentus не успевал); экран — POWER

- Opus complexity 8->3, отключён inband FEC: кодер выдавал ~60 кадров/с при 100
  захваченных -> 40% кадров терялось в очереди (DROP_OLDEST) = «хрип».
  Стало enc_us~3мс на 10-мс кадр, dropped перестал расти.
- Прогрев кодера тишиной на старте (JIT Concentus) — убирает стартовый всплеск потерь.
- Диагностика в логе: enc_us / snd_us.
- ScreenControl идемпотентен (POWER — переключатель): сверяемся с реальным isInteractive.
- Зависимость shizuku-vd 0.1.1 -> 0.1.2 (POWER-инъекция).
This commit is contained in:
2026-10-01 12:10:30 +03:00
parent 4743427756
commit 20d0d05fb4
4 changed files with 44 additions and 13 deletions
@@ -26,11 +26,12 @@ object AudioConfig {
const val BITRATE = 64_000
/**
* Сложность Opus-кодера. Чуть ниже максимума (10): Concentus — JVM-порт, а кодирует
* он на очках в реальном времени; при 8 качество на 64 кбит/с практически то же,
* зато есть запас по CPU.
* Сложность Opus-кодера. Concentus — JVM-порт, кодирует на очках в реальном времени;
* при complexity 8 один 10-мс stereo-кадр не укладывался в 10 мс, кодер не успевал
* (~60 кадров/с при 100 захваченных → 40% кадров терялось в очереди = «хрип»). На 3
* запас по CPU большой, а на 64 кбит/с разница в качестве незначительна.
*/
const val COMPLEXITY = 8
const val COMPLEXITY = 3
/** Ожидаемый процент потерь — для настройки inband FEC/PLC Opus. */
const val PACKET_LOSS_PERCENT = 10
@@ -20,7 +20,10 @@ class OpusAudioEncoder(
this.bitrate = bitrate
this.complexity = complexity
useVBR = true
useInbandFEC = true
// InbandFEC в Concentus удваивает стоимость кодирования (кодер считает ещё и
// резервную копию предыдущего кадра). Потери по UDP у нас ~0, а пропуски seq и так
// прячем на декодере (PLC, см. [OpusAudioDecoder.decodeLost]) — FEC только жжёт CPU.
useInbandFEC = false
packetLossPercent = AudioConfig.PACKET_LOSS_PERCENT
}