Многие люди делятся видео с помощью своего устройства Android. Качество полученного видео часто уступает оригиналу из-за обработки, выполняемой приложением для обмена. В этом документе описывается, как оптимизировать качество публикуемых видео, а также некоторые распространенные ошибки при обработке видео, которых следует избегать. Чтобы оптимизировать обмен HDR-видеоконтентом, см. раздел Использование модуля Transformer для перекодирования HDR в SDR на этой странице.
Главное, что нужно сделать, — это поддерживать постоянное разрешение и сохранять максимально высокое качество видео как можно дольше при подготовке к публикации видео.
Конвейер совместного использования
На рис. 1 показан типичный процесс обмена видео:
Этот конвейер включает в себя следующие шаги:
- Захватывайте и кодируйте видео, возможно добавляя эффекты во время захвата. Альтернативно, пользователь может пропустить этот шаг и выбрать из хранилища видео, предварительно записанное из другого приложения.
- Редактируйте, фильтруйте, подправляйте или иным образом обрабатывайте видео.
- Масштабируйте или измените размер видео при подготовке к перекодированию.
- Перекодируйте видео для обмена. Фильтрация на шаге 2 часто применяется как часть этого шага.
В конвейере есть два этапа, на которых у вас есть возможность установить параметры, определяющие качество вашего видео: кодирование во время первоначальной записи и перекодирование перед отправкой. Кроме того, вам может потребоваться изменить масштаб видео перед последним этапом перекодирования, что также может повлиять на качество.
Рекомендации
В таблице 1 показаны пять основных параметров качества видео и указано, на каких этапах их можно использовать.
Параметр | Захватывать | Делиться |
Профиль | Да | Да |
Разрешение | Да | Да |
Битрейт | Да | Да |
Параметр квантования (QP) | (редко) | Да |
Б-кадры | Н | Да |
Профиль
Для достижения лучших результатов используйте более продвинутые профили, предоставляемые конкретным кодеком. Для кодирования AVC выберите Высокий профиль и уровень 4.
Разрешение, обрезка и масштабирование
Вы можете изменить исходное разрешение захваченного видео на этапе масштабирования перед перекодированием для публикации, но масштабирование может ухудшить качество видео. Мы рекомендуем избегать масштабирования и выбирать разрешение исходной кодировки, которое можно использовать на протяжении всего конвейера. Также помните, что чрезмерное кадрирование приводит к получению изображения низкого качества, особенно если вы увеличиваете масштаб обрезанного изображения. Следуйте этим рекомендациям:
- Выберите разрешение, по крайней мере такое же большое, как окончательное разрешение для общего доступа.
Разрешение захвата не должно значительно превышать разрешение совместного использования, если только все промежуточные этапы не предназначены для поддержки большего разрешения (например, более высокий битрейт во время первоначального захвата).
- Если совместное кодирование обеспечивает разрешение 720x1280, мы рекомендуем разрешение захвата 720x1280.
- Если промежуточные этапы между захватом и отправкой включают обрезку, используйте более высокое разрешение захвата, например 1080x1920, и увеличьте битрейт захвата, чтобы обработать дополнительные пиксели.
Чрезмерное кадрирование приводит к получению изображения низкого качества, особенно если обрезанное изображение увеличено.
Избегайте масштабирования с более низкого разрешения на более высокое. Апскейлинг пытается создать детали, которых нет. С самого начала используйте желаемое более высокое разрешение.
Если вам необходимо повысить масштаб, отрегулируйте параметры кодирования. Например, если в увеличенном разрешении в два раза больше пикселей, увеличьте битрейт вдвое.
Разрешение и битрейт взаимосвязаны. Например, передача видео высокого разрешения через конвейер совместного использования, который в конечном итоге перекодирует его с низким битрейтом, приводит к получению изображения более низкого качества, чем при запуске с более низким разрешением. По мере уменьшения битрейта возникают точки пересечения, в которых меньшие разрешения начинают давать лучшие результаты:
Битрейт | Разрешение |
5+ Мбит/с | 1080x1920 |
1,5–5+ Мбит/с | 720x1280 |
1,5 Мбит/с или меньше | SD-эквивалент. То же количество пикселей при соотношении сторон 9:16 составляет около 416x736. |
Многие популярные приложения делятся видео с разрешением 720p или ниже. Данные показывают, что разрешение 720p является подходящим выбором для целевого битрейта от 1,5 до 5 Мбит/с.
Битрейт
Запись
Использование более высокого битрейта кодирования обеспечивает наибольшее улучшение качества видео. Мы рекомендуем выбирать битрейт, соответствующий родным приложениям камеры. Для разрешения 720x1280 мы рекомендуем битрейт захвата 10 Мбит/с.
Поскольку кодирование захвата выполняется на устройстве, вы можете использовать более высокий битрейт, чтобы компенсировать большинство преобразований на этапе совместного использования с небольшим отрицательным влиянием. Полученные файлы большего размера используются только для манипуляций на устройстве.
Уменьшить битрейт можно на заключительном этапе транскодирования, как показано в таблице 2.
Совместное использование
Битрейт оказывает наибольшее влияние на время публикации, поскольку он напрямую зависит от размера загружаемого видео. Существует компромисс между качеством видео, временем передачи файлов и затратами на облачное хранилище.
Выбор профиля кодирования, B-кадров и ограничивающих значений QP также более важен на этом этапе, чем во время захвата.
Мы рекомендуем битрейт от 4 до 5 Мбит/с (для разрешения 720x1280), чтобы обеспечить хорошее качество изображения.
Параметр квантования (QP)
В Android 12 и выше ключи QP стандартизированы и доступны в API MediaFormat
и в медиа-библиотеке NDK . В более ранних версиях Android манипуляции с QP доступны только с помощью функций платформы с использованием ключей конкретного поставщика в конфигурации MediaFormat
.
Запись
Во время захвата видео используйте управление битрейтом, а не настройки QP, которые не всегда доступны.
Мы не рекомендуем настраивать параметры QP для скорости захвата 10 Мбит/с (для разрешения 720x1280). Если битрейт захвата значительно ниже, менее 5 Мбит/с для разрешения 720x1280, настройка QP, равная 40, является хорошим компромиссом между повышенным качеством и не вынуждает кодек слишком часто превышать целевой битрейт.
Совместное использование
Мы рекомендуем максимальное значение QP равное 40, особенно если скорость передачи данных ниже 4 Мбит/с. Хотя это обеспечивает минимальное качество закодированных видео, но может дать результат с более высоким битрейтом. Увеличение битрейта зависит от сложности видео. Хотя приложение для обмена может допускать некоторые отклонения в битрейте сгенерированного видео, оно может не допускать превышения определенного порога.
Вы можете ограничить увеличение битрейта, перекодировав видео для совместного использования с менее строгим (более высоким) максимальным ограничением QP. Это дает кодеку больше свободы жертвовать качеством и сохранять другие части видео. Вы можете перекодировать видео для совместного использования, поскольку это операция перекодирования; вы уже засняли видео, которым хотите поделиться.
Недостаток заключается в том, что повторение этапа перекодирования с этими разными параметрами увеличивает время, необходимое для обмена видео. Один из способов уменьшить эту задержку — просмотреть частично перекодированное видео и решить, не находится ли оно в пределах допустимого превышения битрейта. Если это не так, вы можете остановить перекодирование и повторить попытку с более подходящими параметрами QP.
B-кадры и профили кодирования
Рассмотрите возможность использования B-кадров только на этапе совместного использования и только при использовании Android 10 или более поздней версии.
Приложениям следует проверять поддерживаемые профили кодирования с помощью CodecCapabilities
, поскольку не все устройства поддерживают основные или высокие профили. Используйте самый высокий профиль, поддерживаемый кодировщиком AVC: High > Main > Baseline. Для достижения наиболее безопасных результатов не настраивайте B-кадры ( KEY_LATENCY
или KEY_MAX_B_FRAMES
) при использовании базового профиля, поскольку некоторые кодировщики могут не сработать при настройке.
Следующие сегменты кода предполагают 'MediaFormat format'
, который будет использоваться для настройки кодировщика AVC.
Андроид 10
API 29 или выше
Используйте самый высокий поддерживаемый профиль и установите параметр B-frame равным 1:
format.setInt32(KEY_PROFILE, AVCProfileHigh);
format.setInt32(KEY_MAX_B_FRAMES, 1);
Не устанавливайте KEY_LATENCY
в этой ситуации.
Андроид 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 поддерживал только базовый профиль. Однако вполне вероятно, что OEM-производители включили основной/высокий профиль на некоторых устройствах, возможно, используя профиль, специфичный для поставщика.
Если ваше приложение не использует MediaMuxer
, вы можете использовать основной или высокий профиль, если кодек его поддерживает. Не существует открытого ключа формата для управления количеством B-кадров.
Используйте модуль Transformer для перекодирования HDR в SDR.
Начиная с Android 13 (уровень API 33), мы рекомендуем использовать модуль Transformer Jetpack Media3 для обмена контентом HDR с приложениями, службами и устройствами, которые не поддерживают HDR. Модуль Transformer преобразует входной видеопоток HDR в SDR и сохраняет результат в формате MP4, что обеспечивает успешное воспроизведение без потери деталей или яркости изображения.
Примечание . На устройствах с версиями системы от Android 12 (уровень API 32) до Android 7.0 (уровень API 24) модуль Transformer работает по-другому. Если устройство поддерживает HDR, ваше приложение воспроизводит контент без тональной компрессии. Если устройство не поддерживает HDR, оно выдает ошибку, указывающую, что тональное отображение HDR не поддерживается.
Следующий код устанавливает преобразователь, который преобразует входной сигнал в SDR и перекодирует его во входной формат (например, H.264/AVC):
Котлин
val transformer = Transformer.Builder(context) .setTransformationRequest( TransformationRequest.Builder() .setHdrMode(TransformationRequest.HDR_MODE_TONE_MAP_HDR_TO_SDR) .build()) .addListener(/* ... */) .build()
Ява
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
.