Prácticas recomendadas para compartir video

Muchas personas comparten videos con sus dispositivos Android. La calidad del video recibido suele ser inferior a la original debido al procesamiento que realiza la app para compartir. En este documento, se describe cómo optimizar la calidad de los videos compartidos y algunos errores comunes de procesamiento de video que se deben evitar. Si quieres optimizar el uso compartido de contenido de video HDR, consulta Cómo usar el módulo Transformer para transcodificar HDR a SDR en esta página.

Lo principal que debes hacer es mantener una resolución constante y mantener la calidad de video lo más alta posible durante el mayor tiempo posible mientras te preparas para compartirlo.

La canalización compartida

En la Figura 1, se ilustra un flujo típico para compartir un video:

Canalización de video compartida Figura 1: La canalización de uso compartido de video

La canalización incluye los siguientes pasos:

  1. Captura y codifica un video, y puedes agregar efectos durante la captura. Como alternativa, el usuario puede omitir este paso y seleccionar un video del almacenamiento que se haya grabado previamente desde otra app.
  2. Editar, filtrar, retocar o procesar el video
  3. Escala o cambia el tamaño del video a fin de prepararlo para la transcodificación.
  4. Transcodificar el video para compartirlo El filtrado del paso 2 suele aplicarse como parte de este paso.

Hay dos pasos en la canalización en los que tienes la oportunidad de configurar parámetros que determinan la calidad de tu video: la codificación durante la grabación inicial y la transcodificación antes de compartirlo. Además, es posible que debas cambiar la escala del video antes del paso final de transcodificación, lo que también puede afectar la calidad.

de contenido

En la tabla 1, se muestran los cinco parámetros principales de la calidad de video y se indican los pasos que se pueden usar.

Parámetro Captura Compartir
Perfil Y Y
Resolución Y Y
Tasa de bits Y Y
Parámetro de cuantización (QP) (rara vez) Y
Fotogramas B N Y

Tabla 1: Parámetros principales que determinan la calidad de video

Perfil

Para obtener mejores resultados, usa los perfiles más avanzados que proporciona el códec particular. Para la codificación AVC, selecciona Perfil alto y nivel 4.

Resolución, recorte y ajuste de tamaño

Puedes cambiar la resolución inicial del video capturado en el paso de escalamiento antes de transcodificarlo para compartirlo, pero el escalamiento puede disminuir la calidad del video. Te recomendamos que evites el escalamiento y que selecciones una resolución para la codificación inicial que puedas usar en toda la canalización. Además, recuerda que un recorte extremo genera una imagen de baja calidad, en especial si aumentas el tamaño de la imagen recortada. Por ello, sigue estos lineamientos:

  • Elige una resolución que sea al menos tan grande como la resolución final para compartir.
  • La resolución de captura no debe superar en gran medida la resolución de uso compartido, a menos que todos los pasos intermedios estén diseñados para admitir la resolución más alta (como la tasa de bits más alta durante la captura inicial).

    • Si la codificación de uso compartido produce una resolución de 720 × 1280, recomendamos una resolución de captura de 720 × 1280.
    • Si los pasos intermedios entre la captura y el uso compartido incluyen el recorte, usa una resolución de captura más alta, como 1080 x 1920, y aumenta la tasa de bits de la captura para controlar los píxeles adicionales.
  • El recorte extremo genera una imagen de baja calidad, en especial si se aumenta la imagen recortada.

  • Evita pasar de una resolución más baja a una más alta. El aumento de la escala intenta crear detalles que no están presentes. Mantener la resolución más alta deseada desde el principio.

  • Si debes aumentar la escala, ajusta los parámetros de codificación. Por ejemplo, si la resolución mejorada tiene el doble de píxeles, el doble de la tasa de bits.

La resolución y la tasa de bits están interrelacionadas. Por ejemplo, transportar un video de alta resolución a través de una canalización de uso compartido que, en última instancia, se transcodifica a una tasa de bits baja produce una imagen de menor calidad que comenzar con una resolución más baja. A medida que la tasa de bits disminuye, hay puntos de cruce en los que las resoluciones más pequeñas comienzan a generar mejores resultados:

Tasa de bits Resolución
Más de 5 Mbps 1080 × 1920
Entre 1.5 y más de 5 Mbps 720 x 1,280
1.5 Mbps o menos equivalente a SD. La misma cantidad de píxeles en una relación de aspecto de 9:16 es de 416 x 736 aproximadamente.

Tabla 2: Diferencias entre la tasa de bits y la resolución

Muchas apps populares comparten videos con una resolución de 720p o menos. Los datos indican que la resolución de 720p es una opción adecuada para objetivos de tasa de bits de entre 1.5 y 5 Mbps.

Tasa de bits

Grabando

El uso de una tasa de bits de codificación más alta proporciona la mejora más importante en calidad de video. Te recomendamos que elijas tasas de bits que coincidan con las apps de cámara nativas. Para una resolución de 720 x 1,280, recomendamos una tasa de bits de captura de 10 Mbps.

Dado que la codificación de captura se realiza en el dispositivo, puedes usar una tasa de bits más alta para compensar la mayoría de las transformaciones de los pasos de uso compartido con poco impacto negativo. Los archivos resultantes más grandes solo se usan para la manipulación en el dispositivo.

Puedes reducir la tasa de bits en el paso final de transcodificación, como se muestra en la tabla 2.

Uso compartido

La tasa de bits tiene el mayor impacto en el momento del uso compartido, ya que se relaciona directamente con el tamaño del video que se subirá. Existe una compensación entre la calidad de video, el tiempo de transmisión de archivos y los costos de almacenamiento en la nube.

La elección del perfil de codificación, los fotogramas B y los valores de límite de QP también es más importante en esta etapa que durante la captura.

Recomendamos una tasa de bits de entre 4 y 5 Mbps (para una resolución de 720 x 1280) a fin de garantizar una buena calidad visual.

Parámetro de cuantización (QP)

En Android 12 y versiones posteriores, las claves de QP están estandarizadas y están disponibles en la API de MediaFormat y en la biblioteca de medios del NDK. En versiones anteriores de Android, la manipulación de QP solo está disponible a través de funciones del framework que usan claves específicas del proveedor en la configuración de MediaFormat.

Grabando

Durante la captura de video, usa el control de tasa de bits en lugar de la configuración de QP, que no siempre está disponible.

No recomendamos ajustar la configuración de QP para tasas de bits de captura de 10 Mbps (para 720 x 1,280). Si la tasa de bits de captura es significativamente menor, por debajo de 5 Mbps para 720 × 1280, una configuración de QP de 40 es un buen compromiso entre una mayor calidad sin forzar al códec que supere la tasa de bits objetivo con demasiada frecuencia.

Uso compartido

Recomendamos un límite máximo de QP de 40, en especial cuando la tasa de bits es inferior a 4 Mbps. Si bien esto garantiza una calidad mínima para los videos codificados, puede producir un resultado con una tasa de bits más alta. El aumento en la tasa de bits depende de la complejidad del video. Aunque una app para compartir podría tolerar alguna variación en la tasa de bits del video generado, podría no tolerar un aumento más allá de un umbral determinado.

Puedes limitar el aumento de la tasa de bits si vuelves a codificar el video para compartirlo con un límite de QP máximo menos restrictivo (más alto). Esto le da al códec más libertad para sacrificar la calidad y preservar otras partes del video. Puedes volver a codificar el video para compartirlo porque es una operación de transcodificación; ya capturaste el video que deseas compartir.

La desventaja es que repetir el paso de transcodificación con estos parámetros diferentes aumenta el tiempo que lleva compartir el video. Una forma de reducir esta latencia es observar el video parcialmente transcodificado para decidir si no está dentro de tu tolerancia al excedente de tasa de bits. Si no es así, puedes detener la transcodificación y volver a intentarlo con los parámetros de QP más adecuados.

Fotogramas B y perfiles de codificación

Considera usar fotogramas B solo durante el paso de uso compartido y solo cuando ejecutes Android 10 o versiones posteriores.

Las apps deben verificar los perfiles de codificación compatibles con CodecCapabilities, ya que no todos los dispositivos admiten perfiles principal o alto. Usa el perfil más alto que admita el codificador AVC: High > Main > Baseline. Para obtener resultados más seguros, no configures fotogramas B (KEY_LATENCY o KEY_MAX_B_FRAMES) cuando uses el perfil de modelo de referencia, ya que algunos codificadores pueden fallar en la configuración.

Los siguientes segmentos de código suponen un 'MediaFormat format' que se usará para configurar el codificador AVC

Android 10

Nivel de API 29 o versiones posteriores

Utiliza el perfil más alto admitido y establece el parámetro B-frame en 1:

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

No configures KEY_LATENCY en esta situación.

Android 8, 8.1 y 9

APIs 26, 27 y 28

Usar el perfil más alto compatible, pero inhabilitar la generación de marcos B Esto incluye algunas limitaciones de MediaMuxer en estas versiones del sistema.

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

El valor KEY_LATENCY prohíbe que los códecs generen marcos B, pero aprovecha otras eficiencias de códecs.

Si tu app no usa MediaMuxer para ensamblar el archivo de salida final, puedes habilitar los marcos B estableciendo el valor de KEY_LATENCY en 2 en lugar de 1. Esto debería permitir que el códec produzca fotogramas B.

Android 7.1 y versiones anteriores

Nivel de API 25 y versiones anteriores

Usa el perfil de Baseline para obtener resultados más seguros.

format.setInt32(KEY_PROFILE, AVCProfileBaseline);

Antes de la versión 7, el AOSP de Android solo admite el perfil de Baseline. Sin embargo, es probable que los OEM hayan habilitado un perfil principal o alto en algunos dispositivos, quizás mediante un perfil específico del proveedor.

Si tu app no usa MediaMuxer, puedes usar el perfil principal o alto cuando el códec lo admita. No hay una clave de formato pública para controlar la cantidad de fotogramas B-.

Usa el módulo Transformer para transcodificar HDR a SDR

A partir de Android 13 (nivel de API 33), te recomendamos usar el módulo Transformer de Jetpack Media3 para compartir contenido HDR con apps, servicios y dispositivos que no admiten HDR. El módulo Transformer asigna el tono de una transmisión de video HDR de entrada a SDR y guarda el resultado como un archivo MP4, lo que permite una reproducción correcta sin pérdida de detalles ni brillo de la imagen.

Nota: En los dispositivos que se orientan a versiones del sistema entre Android 12 (nivel de API 32) y versiones anteriores a Android 7.0 (nivel de API 24), el módulo Transformer funciona de manera diferente. Si el dispositivo es compatible con HDR, tu app reproduce el contenido sin asignar tonos. Si el dispositivo no es compatible con HDR, aparecerá un error que indicará que no se admite la asignación de tonos de HDR.

Con el siguiente código, se configura un transformador que asigna la entrada al SDR y la vuelve a codificar en el formato de entrada (como 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();

Para probar la función de asignación de tono, consulta la app de demostración de Transformer.

También puedes configurar la asignación de tono con MediaCodec, aunque la implementación es más compleja. Para obtener más información, consulta la documentación de referencia de MediaCodec.