Включить кодирование B-кадров в MediaCode
Все,
Я использую класс MediaCodec для генерации видео / AVC видео потока. потоковое кодирование в порядке, но я хочу использовать B-кадры для лучшего сжатия. Хотя я установил профиль AVCProfileHigh, кодер не генерирует B-кадры. Видеопоток имеет только I и P кадры.
Ниже приведена конфигурация медиа профиля.
mFormat.setInteger (MediaFormat.KEY_PROFILE, MediaCodecInfo.CodecProfileLevel.AVCProfileHigh);
MediaCoder поддерживает B Frames?? Если да, то мотыга для настройки B кадров.
1 ответ
This depends on the device. Android O and P briefly enabled B-frames automatically for AVC High profile encoding, but many apps started crashing as they did not expect out-of-order frames, so it got disabled shortly after launch. Also MediaMuxer failed on some stress streams with B-frames (e.g. if a B-frame is referring back from a frame over 1 second in the future). This is fixed in Android Q, though the back reference is still limited to 30 minutes.
Technically, apps can opt into getting B frames with MediaFormat.KEY_OUTPUT_REORDER_DEPTH format key (after setting high profile), but support for this in not required by devices, and is not hooked up in AOSP.
Нет гарантии, что все устройства будут поддерживать его, но некоторые устройства могут.
Однако, по крайней мере, в более ранних версиях Android, вам пришлось устанавливать параметр уровня одновременно, если вы пытались установить параметр профиля, иначе он не будет использоваться. См. /questions/20647663/vyiberite-profil-h264-pri-kodirovanii-s-pomoschyu-mediacodec-i-mtk-codec/20647670#20647670 для получения дополнительной информации об этом. Дело в том, что при настройке параметра уровня вам нужно выбрать достаточно высокий уровень для поддержки выбранного разрешения и частоты кадров.