Essentially, composable can recompose with every frame, like for an animation. But, in certain circumstances, this will cause allocations for every frame.
For example, a modifier that is scoped to something like BoxScope. You can't hoist it out of the composable, it has to be in BoxScope. If that scope is animated on every frame, that modifier get re-allocated, every frame. That could be a lot of pressure on the GC.
Edit: Then again, its hard doing anything realtime in GC languages like Java / Kotlin, maybe its possible if doing 0 allocations per event.
Steam in-home streaming needs to be realtime too, but is very playable, and most people aren't realistically getting 480mbps out of their wifi.
4k I don't know... 1080p no problem.
Don't most phones have dedicated hardware video encoders on their SoC now anyway?