Рекомендации по демонстрации видео

Многие пользователи делятся видео с помощью устройств Android. Качество полученного видео часто уступает оригиналу из-за обработки, выполняемой приложением для обмена. В этом документе описывается, как оптимизировать качество общих видео и избежать некоторых распространенных ошибок при обработке видео. Чтобы оптимизировать видеоконтент HDR для отправки, ознакомьтесь с разделом Как использовать модуль Transformer для перекодирования HDR в SDR на этой странице.

Главное – поддерживать постоянное разрешение и сохранять качество видео на максимально высоком уровне как можно дольше во время подготовки к показу видео.

Конвейер передачи данных

На рисунке 1 показан типичный процесс публикации видео.

Общий конвейер видео Рисунок 1. Конвейер обмена видео.

Конвейер включает следующие шаги:

  1. Захват и кодирование видео, возможно, с добавлением эффектов во время захвата. Пользователь также может пропустить этот шаг и выбрать видео, записанное в другом приложении.
  2. Редактировать, фильтровать, ретушировать или иным образом обрабатывать видео.
  3. Масштабируйте видео или измените его размер, чтобы подготовить к перекодированию.
  4. Перекодируйте видео для отправки. Фильтрация, описанная на шаге 2, часто применяется на этом этапе.

На качество видео влияют два этапа: кодирование во время записи и перекодирование перед публикацией. Кроме того, перед окончательным перекодированием может потребоваться изменить масштаб видео, что также может повлиять на качество.

Рекомендации

В таблице 1 показаны пять основных параметров качества видео и указано, на каких этапах их можно использовать.

Параметр Сделать снимок Поделиться
Профиль Г Г
Разрешение Г Г
Битрейт Г Г
Параметр квантования (QP) (редко) Г
B-кадры НЕТ Г

Таблица 1. Основные параметры, определяющие качество видео

Профиль

Для достижения наилучших результатов используйте более продвинутые профили, предоставляемые конкретным кодеком. Для кодирования AVC выберите профиль High и уровень 4.

Разрешение, кадрирование и масштабирование

Вы можете изменить исходное разрешение записанного видео на этапе масштабирования перед перекодированием для публикации, но масштабирование может ухудшить качество видео. Рекомендуем избегать масштабирования и выбрать для первоначального кодирования разрешение, которое можно использовать на протяжении всего процесса. Также помните, что сильная обрезка приводит к низкому качеству изображения, особенно если вы увеличиваете обрезанное изображение. Следуйте указанным инструкциям:

  • Выберите разрешение, которое будет не меньше, чем разрешение итогового видео.
  • Разрешение при записи не должно значительно превышать разрешение при показе, если только все промежуточные этапы не поддерживают более высокое разрешение (например, более высокий битрейт при первоначальной записи).

    • Если при кодировании для демонстрации экрана получается разрешение 720 x 1280, мы рекомендуем использовать разрешение 720 x 1280 для записи.
    • Если между записью и публикацией вы кадрируете видео, используйте более высокое разрешение, например 1080 x 1920, и увеличьте битрейт, чтобы справиться с дополнительными пикселями.
  • Сильная обрезка приводит к низкому качеству изображения, особенно если обрезанное изображение масштабируется.

  • Не увеличивайте разрешение видео. При масштабировании создаются детали, которых нет в оригинале. С самого начала используйте более высокое разрешение.

  • Если вам необходимо увеличить разрешение, измените параметры кодирования. Например, если разрешение увеличивается в два раза, то и битрейт должен быть в два раза выше.

Разрешение и битрейт взаимосвязаны. Например, если вы загрузите видео высокого разрешения в сервис, который перекодирует его с низким битрейтом, то качество изображения будет хуже, чем если бы вы изначально загрузили видео с более низким разрешением. По мере снижения битрейта наступает момент, когда меньшее разрешение начинает давать лучшие результаты:

Битрейт Разрешение
От 5 Мбит/с 1080x1920
1,5–5+ Мбит/с 720x1280
1,5 Мбит/с или меньше Эквивалент SD. При соотношении сторон 9:16 такое же количество пикселей будет иметь размер примерно 416 x 736.

Таблица 2. Битрейт и разрешение

Многие популярные приложения передают видео с разрешением 720p или ниже. Данные показывают, что разрешение 720p подходит для целевых битрейтов от 1,5 до 5 Мбит/с.

Битрейт

Идет запись

Чем выше битрейт, тем лучше качество видео. Рекомендуем выбирать битрейт, соответствующий встроенным приложениям камеры. Для разрешения 720 x 1280 рекомендуем битрейт 10 Мбит/с.

Поскольку кодирование захвата выполняется на устройстве, вы можете использовать более высокий битрейт, чтобы компенсировать большую часть преобразований на этапе совместного использования с небольшим негативным воздействием. Полученные файлы большего размера используются только для обработки на устройстве.

Вы можете снизить битрейт на последнем этапе перекодирования, как показано в таблице 2.

Совместный доступ

Битрейт имеет наибольшее значение при публикации, поскольку он напрямую связан с размером загружаемого видео. Существует компромисс между качеством видео, временем передачи файлов и затратами на облачное хранилище.

Выбор профиля кодирования, B-кадров и граничных значений QP на этом этапе также важнее, чем во время захвата.

Чтобы обеспечить хорошее качество изображения, рекомендуем использовать битрейт 4–5 Мбит/с (для разрешения 720 x 1280).

Параметр квантования (QP)

На устройствах с Android 12 и более поздними версиями ОС ключи QP стандартизированы и доступны в API MediaFormat и медиабиблиотеке NDK. В более ранних версиях Android управление QP доступно только через функции фреймворка с использованием ключей, зависящих от поставщика, в конфигурации MediaFormat.

Идет запись

При записи видео используйте управление битрейтом, а не настройки QP, которые не всегда доступны.

Мы не рекомендуем изменять настройки QP для битрейта записи 10 Мбит/с (для разрешения 720 x 1280). Если битрейт захвата значительно ниже, например менее 5 Мбит/с для разрешения 720 x 1280, то значение QP, равное 40, будет хорошим компромиссом между повышением качества и предотвращением слишком частого превышения целевого битрейта кодеком.

Совместный доступ

Рекомендуем установить максимальное значение QP на уровне 40, особенно если битрейт ниже 4 Мбит/с. Это позволяет обеспечить минимальное качество закодированных видео, но может привести к более высокому битрейту. Увеличение битрейта зависит от сложности видео. Хотя приложение для обмена может допускать некоторое отклонение в битрейте сгенерированного видео, оно может не допускать увеличения сверх определенного порога.

Вы можете ограничить увеличение битрейта, перекодировав видео для публикации с менее строгим (более высоким) максимальным значением QP. Это дает кодеку больше свободы, чтобы пожертвовать качеством и сохранить другие части видео. Вы можете перекодировать видео, чтобы поделиться им, поскольку это операция транскодирования. Вы уже записали видео, которым хотите поделиться.

Недостаток заключается в том, что повторение этапа перекодирования с этими разными параметрами увеличивает время, необходимое для публикации видео. Один из способов сократить эту задержку – посмотреть частично перекодированное видео и решить, не превышает ли оно допустимый предел битрейта. Если нет, остановите перекодирование и повторите попытку с более подходящими параметрами QP.

B-кадры и профили кодирования

Рекомендуем использовать B-кадры только на этапе передачи и только на устройствах с Android 10 или более поздней версии.

Приложения должны проверять поддерживаемые профили кодирования с помощью CodecCapabilities, поскольку не все устройства поддерживают профили Main или High. Используйте самый высокий профиль, поддерживаемый кодировщиком AVC: High > Main > Baseline. Для достижения наилучших результатов не настраивайте B-кадры (KEY_LATENCY или KEY_MAX_B_FRAMES) при использовании базового профиля, так как некоторые кодировщики могут не справиться с настройкой.

В следующих фрагментах кода предполагается, что 'MediaFormat format' будет использоваться для настройки кодировщика AVC.

Android 10

API 29 или более поздней версии;

Используйте профиль с максимальным поддерживаемым разрешением и задайте для параметра B-frame значение 1:

format.setInt32(KEY_PROFILE, AVCProfileHigh);
format.setInt32(KEY_MAX_B_FRAMES, 1);

В этом случае не задавайте KEY_LATENCY.

Android 8, 8.1 и 9

API 26, 27, 28

Используйте профиль с максимальной поддержкой, но отключите создание B-кадров. Это позволяет обойти некоторые ограничения MediaMuxer в этих версиях системы.

format.setInt32(KEY_PROFILE, AVCProfileHigh);
format.setInt32(KEY_LATENCY, 1);

Значение KEY_LATENCY запрещает кодекам генерировать B-кадры, но позволяет использовать другие преимущества кодеков.

Если ваше приложение не использует MediaMuxer для сборки конечного выходного файла, вы можете включить B-кадры, установив для KEY_LATENCY значение 2 вместо 1. Это позволит кодеку создавать B-кадры.

Android 7.1 и более ранние версии

API 25 и более ранние версии

Для получения наиболее безопасных результатов используйте базовый профиль.

format.setInt32(KEY_PROFILE, AVCProfileBaseline);

До версии 7 Android AOSP поддерживает только базовый профиль. Однако, вероятно, производители оригинального оборудования включили основной/высокий профиль на некоторых устройствах, возможно, с помощью профиля, зависящего от поставщика.

Если в вашем приложении не используется MediaMuxer, вы можете использовать основной или высокий профиль, если это поддерживается кодеком. Общедоступного ключа формата для управления количеством B-кадров нет.

Как перекодировать HDR в SDR с помощью модуля Transformer

Начиная с Android 13 (уровень API 33) мы рекомендуем использовать модуль Transformer из Jetpack Media3, чтобы делиться HDR-контентом с приложениями, сервисами и устройствами, которые не поддерживают HDR. Модуль Transformer выполняет тональную компрессию входного видеопотока HDR в SDR и сохраняет результат в формате MP4, что позволяет воспроизводить видео без потери детализации или яркости изображения.

Примечание. На устройствах с версиями Android от 12 (уровень API 32) до 7.0 (уровень API 24) модуль Transformer работает иначе. Если устройство поддерживает HDR, приложение воспроизводит контент без сопоставления тонов. Если устройство не поддерживает HDR, оно выдает ошибку, указывающую, что HDR тональное отображение не поддерживается.

Следующий код настраивает Transformer, который выполняет сопоставление тонов входных данных с SDR и повторно кодирует их во входной формат (например, H.264/AVC):

Kotlin

val transformer = Transformer.Builder(context)
    .setTransformationRequest(
        TransformationRequest.Builder()
            .setHdrMode(TransformationRequest.HDR_MODE_TONE_MAP_HDR_TO_SDR)
            .build())
    .addListener(/* ... */)
    .build()

Java

Transformer transformer = new Transformer.Builder(context)
    .setTransformationRequest(
        new TransformationRequest.Builder()
            .setHdrMode(TransformationRequest.HDR_MODE_TONE_MAP_HDR_TO_SDR)
            .build())
    .addListener(/* ... */)
    .build();

Чтобы попробовать функцию сопоставления тонов, воспользуйтесь демонстрационным приложением Transformer.

Вы также можете настроить сопоставление тонов с помощью MediaCodec, хотя реализация более сложная. Дополнительную информацию можно найти в справочной документации по MediaCodec.