Muchas personas comparten videos con sus dispositivos Android. La calidad de la transmisión video suele ser inferior al original debido al procesamiento que se realiza a través de la aplicación para compartir. En este documento, se describe cómo optimizar la calidad de los videos compartidos y algunos errores comunes para el procesamiento de videos que debes evitar. Para optimizar para compartir contenido de video HDR, consulta Usa el módulo Transformer para transcodificar HDR a SDR en esta página.
Lo más importante es mantener una resolución constante y la calidad del video la mayor altura posible mientras te preparas para compartir un video.
La canalización de uso compartido
En la Figura 1, se ilustra un flujo típico para compartir un video:
La canalización incluye estos pasos:
- Captura y codifica un video, y agrega efectos durante la captura. Como alternativa, el usuario puede omitir este paso y seleccionar un video del almacenamiento. que se grabó previamente desde otra app.
- Edita, filtra, retoca o procesa de cualquier otro modo el video.
- Ajustar o cambiar el tamaño del video como preparación para la transcodificación
- Transcodificar el video para compartirlo El filtrado del paso 2 se suele aplicar como parte de este paso.
Hay dos pasos de la canalización en los que tiene la oportunidad de definir parámetros que determinan la calidad de tu video: codificación durante la grabación y transcodificación antes de compartir. Además, es posible que debas reajustar la escala del video antes del paso final de transcodificación, lo que también puede afectar la calidad.
Recomendaciones
En la tabla 1, se muestran los cinco parámetros principales de calidad de video indica qué pasos pueden usarlos.
Parámetro | Captura | Compartir |
Perfil | S | S |
Resolución | S | S |
Tasa de bits | S | S |
Parámetro de cuantización (QP) | (rara vez) | S |
Fotogramas B | N | S |
Perfil
Para obtener mejores resultados, usa los perfiles más avanzados proporcionados por la códec. Para la codificación AVC, selecciona Perfil alto y nivel 4.
Resolución, recorte y escala
Puedes cambiar la resolución inicial del video capturado en el paso de ajuste. antes de transcodificarlos para compartirlos, pero el escalamiento puede disminuir la calidad del video. Te recomendamos que evites el escalamiento y selecciones una resolución para la que puedes usar en toda la canalización. Recuerda también que los extremos pero, por lo general, se obtiene una imagen de baja calidad, especialmente si se aumenta el tamaño de la parte recortada. imagen. Por ello, sigue estos lineamientos:
- Elige una resolución que sea, al menos, tan grande como la resolución de uso compartido final.
La resolución de captura no debe superar mucho la resolución de uso compartido. a menos que todos los pasos intermedios estén diseñados para admitir el (por ejemplo, la tasa de bits más alta durante la captura inicial).
- Si la codificación para compartir produce una resolución de 720 x 1280, recomendamos Resolución de captura de 720 x 1280.
- Si los pasos intermedios entre la captura y el uso compartido incluyen recortar, usa una resolución de captura más alta, como 1080 x 1920, y aumentar la de captura para controlar los píxeles adicionales.
El recorte extremo da como resultado una imagen de baja calidad, especialmente si el se agrandó la imagen.
Evita el aumento de resolución de menor a mayor resolución. Intentos de aumento de escala para crear detalles que no están presentes. Transfiere 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 el la resolución mejorada tiene el doble de píxeles, el doble de tasa de bits.
La resolución y la tasa de bits están interrelacionadas. Por ejemplo, tener una pantalla de alta resolución Video 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 la que comienza con una resolución más baja. Como la tasa de bits disminuye, hay puntos de cruce en los que las resoluciones más pequeñas para obtener mejores resultados:
Tasa de bits | Resolución |
Más de 5 Mbps | 1080 × 1920 |
De 1.5 a más de 5 Mbps | 720 × 1280 |
1.5 Mbps o menos | Equivalente en SD. La misma cantidad de píxeles con una relación de aspecto de 9:16 es de aproximadamente 416 x 736. |
Muchas apps populares comparten videos en una resolución de 720p o inferior. Los datos indican esa resolución de 720p es una buena opción para objetivos de tasa de bits de entre 1.5 y 5 Mbps.
Tasa de bits
Grabando
Usar una tasa de bits de codificación más alta proporciona la mayor mejora en el video. calidad. Te recomendamos que elijas tasas de bits que coincidan con las apps de cámara nativas. Para un Una resolución de 720 x 1280, recomendamos una tasa de bits de captura de 10 Mbps.
Como la codificación de captura se realiza en el dispositivo, puedes usar una tasa de bits más alta para lo siguiente: para compensar la mayoría de las transformaciones del paso de uso compartido con poca impacto. 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 de compartir, ya que se relaciona directamente con el el tamaño del video que se subirá. Existe una compensación entre los videos la calidad, el tiempo de transmisión de los 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) para garantizar calidad visual.
Parámetro de cuantización (QP)
En Android 12 y versiones posteriores, las claves QP están estandarizadas y están disponibles en la
MediaFormat
y en la
Biblioteca multimedia del NDK.
En versiones anteriores de Android, la manipulación de QP está disponible solo a través del framework.
con 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 QP, que se no siempre están disponibles.
No recomendamos ajustar la configuración de QP para tasas de bits de captura de 10 Mbps. (para 720 × 1280). Si la tasa de bits de captura es significativamente menor, por debajo de 5 Mbps para 720 x 1280, una configuración de QP de 40 es un buen equilibrio entre un aumento de calidad sin forzar al códec a superar la tasa de bits objetivo con demasiada frecuencia.
Uso compartido
Recomendamos un límite de QP máximo de 40, especialmente cuando la tasa de bits sea inferior a 4 Mbps. Si bien esto garantiza una calidad mínima para los videos codificados, puede producir con una tasa de bits más alta. El aumento en la tasa de bits depende del la complejidad del video. Aunque una aplicación para compartir podría tolerar algunas variaciones en la tasa de bits del video generado, es posible que no tolera un aumento superior al umbral determinado.
Puedes limitar el aumento de la tasa de bits si vuelves a codificar el video para compartirlo con un menos restrictivo (más alto) del límite de QP máximo. Esto le da al códec más libertad para sacrificar la calidad y preservar otras partes del video. Puedes volver a codificar video para compartir porque es una operación de transcodificación; ya tienes haya capturado el video que quieres compartir.
La desventaja es que se puede repetir el paso de transcodificación con estos diferentes aumenta el tiempo que lleva compartir el video. Una forma de reducir esta latencia es mirar el video parcialmente transcodificado para decidir si no está dentro de tu tolerancia al exceso de tasa de bits. De no ser así, puedes detener la transcodificación y vuelve a intentarlo con parámetros de QP más apropiados.
Fotogramas B y perfiles de codificación
Considera usar fotogramas B solo durante el paso de uso compartido y solo cuando se ejecute Android 10 o una versión posterior
Las apps deben verificar los perfiles de codificación admitidos usando
CodecCapabilities
:
dado que no todos los dispositivos admiten perfiles principales o altos. Usar el perfil más alto
compatible con el codificador AVC: Alta > Principal > Modelo de referencia. Para obtener resultados más seguros, no
configurar marcos B
(KEY_LATENCY
o
KEY_MAX_B_FRAMES
).
cuando uses el modelo de referencia
ya que algunos codificadores podrían fallar en la configuración.
Los siguientes segmentos de código suponen un 'MediaFormat format'
que se usará para lo siguiente:
configurar el codificador AVC
Android 10
Nivel de API 29 o superior
Usa el perfil admitido más alto 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
API 26, 27 y 28
Usa el perfil más admitido, pero inhabilita la generación de marcos B. Esta
admite algunas limitaciones
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 fotogramas B, pero aún así
aprovecha las funciones más eficientes de códecs.
Si tu app no usa MediaMuxer
para ensamblar el archivo de salida final, puedes
habilitar los fotogramas B estableciendo el valor KEY_LATENCY
en 2 en lugar de 1. Esto debería
y permitir que el códec produzca los 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 era compatible con el perfil de Baseline. Sin embargo, es probable que los OEMs hayan habilitado un perfil principal o alto en algunos dispositivos, quizás por con un perfil específico del proveedor.
Si tu app no usa MediaMuxer
, puedes usar el perfil principal o alto cuando
el códec lo admite. No existe una clave de formato público para controlar la cantidad de entradas
o los fotogramas.
Usa el módulo Transformer para transcodificar HDR a SDR
A partir de Android 13 (nivel de API 33), te recomendamos que uses Jetpack Media3 Transformador para compartir contenido HDR con apps, servicios y dispositivos que no realicen compatibilidad con HDR. El módulo Transformer funciona asignando tonos y una transmisión de video HDR a SDR y guardar el resultado como un archivo MP4, lo que permite reproducción correcta sin perder detalles ni brillo de la imagen.
Nota: En dispositivos que se orienten a versiones del sistema entre Android 12 (nivel de API 32) hasta Android 7.0 (nivel de API 24), el módulo Transformer funciona de manera diferente. Si Si el dispositivo es compatible con HDR, la app reproducirá el contenido sin asignación de tonos. Si el dispositivo no es compatible con HDR, aparecerá un error que indicará que el modo HDR no se admite la asignación de tonos.
Con el siguiente código, se configura un Transformer que asigna el tono la entrada a SDR y lo 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 tonos, consulta el App de demostración de Transformer.
También puedes configurar la asignación de tonos con
MediaCodec
, aunque la implementación
es más complejo. Para obtener más información, consulta la
Es la documentación de referencia de MediaCodec
.