Right, and this is why channel-changing is so annoyingly slow on most digital TV systems (cable, broadcast and satellite).
Yes, I tried writing a new channel-changer for our in-house TiVo satellite version, and I really couldn't improve it.
The RF tuners, demodulators and error correctors usually change very quickly...
Meh, sorta. In satellite systems you often not only have to change the RF tuner to a new frequency, you also have to change the feedhorn to a different polarity: horizontal, vertical, circular-left, or circular-right. And with multiple feedhorn systems sometimes you need to connect a different feedhorn to the backhaul in order to access a different spacecraft. So polarity changes, frequency changes, feedhorn changes, PLL sync, do take a significant amount of time in the worst case.
...but the MPEG decoder has to wait for those I frames before it can start producing decoded video.
Indeed and that's still typically quite a bit longer than the electronics resychronization time. In addition most systems want to buffer the stream a bit too in RAM.
They're big, so getting a good compression ratio may limit them to once every few seconds.
Frame type mixing is a black art for satellite systems. One technique, for example, mixes content such as CSPAN on the same transport stream as other streams such as ESPN. Sports programs typically have dynamic content and require a higher key-to-intermediate ratio than Talking Head programs that typically just aim the camera and some droning blowhard. Those programs don't require many I-frames, and so they're typically sent only as often as customer tolerance allows for the decoder and buffer latency. Not every program takes the same fraction of the available bandwidth in a transport stream, so over time they can be load-balanced.
...for the first couple seconds after you change the channel you are sent your own unicast (private) version of the new channel structured such that the decoder can almost immediately start producing video. If you stay on the channel, the set-top box joins the appropriate multicast group and switches seamlessly to it.
Since some consumer satellite systems also incorporate internet-by-satellite, this might be an option. But when I was involved with this in the mid-1990s it really wasn't. Nor could the systems at the time listen effectively on more than one transport stream in the hopes of buffering other content; the feedhorn can physically receive only one polarity at a time.
You can often tell by looking how often I frames are sent.
We had low-level decoders and software to measure that. But yes, your method works informally. The encoders are adaptive. They know how "dirty" the decoded stream is likely to be and decide when to send I-frames based on that, in connection with the available bandwidth in the stream into which they are injecting, and according to the QoS "floor" set by the content provider. Ground stations are highly sophisticated, with health monitoring in real time from the spacecraft, QoS monitoring on the downlink, consensus-based load-balancing between stream injectors, and enterprise-wide load-balancing among spacecraft and transponders. Plus there is a dedicated team of knob-tweakers who manage the subjective portion of the QoS.