La API de Media Enhancement proporciona una solución de IA integrado en el dispositivo con baja latencia y que preserva la privacidad que aprovecha la aceleración de hardware para ofrecer mejoras de alta calidad en los medios sin aumentar el tamaño del APK. Para obtener más información, consulta Información sobre las capacidades de mejora de medios.
En el siguiente diagrama de arquitectura, se muestra el ciclo de vida de la ejecución del modo de superficie asíncrono de la API de Media Enhancement. Este modo vincula directamente los búferes de hardware para eliminar el cuello de botella de rendimiento que genera la copia de fotogramas sin comprimir entre los búferes de memoria de la CPU y la GPU.
La canalización de mejora se implementa a través de los siguientes pasos:
Fase 1: Configura la sesión de mejora
1. Proporciona una superficie de entrada: Tu app proporciona al framework de mejora un identificador de superficie de entrada para acceder a los fotogramas y procesarlos.
2. Set output surface: Tu app aprovisiona y vincula objetivos de procesamiento (como un SurfaceView o un TextureView) directamente al framework.
Fase 2: Produce un fotograma de entrada
3. Prepara los medios base: Tu app recupera los medios base sin comprimir. Por ejemplo, leyendo un archivo de un disco local.
4. Cómo insertar datos de fotogramas: Tu app escribe la carga útil de la imagen sin procesar directamente en la canalización de la superficie de entrada vinculada.
Fase 3: Procesa y mejora
5. Ejecutar el procesamiento con IA: El framework procesa el fotograma en la GPU o la NPU del dispositivo, y aplica mejoras de aprendizaje automático, como el ajuste de tonos, la corrección de desenfoque o el reescalado.
6. Deliver enhanced frame: El motor genera el fotograma mejorado en resolución completa directamente en la superficie de salida vinculada.
Fase 4: Mostrar o guardar el resultado
7. Finalizar salida: Tu app recibe el búfer de transmisión de hardware procesado para renderizarlo en la IU o guardarlo en el almacenamiento.
El objeto de contexto EnhancementSession es un objeto pesado que mantiene una canalización persistente de memoria de GPU o NPU. Asigna RAM de video (VRAM) dedicada y controladores del sistema nativos. Para evitar fugas de memoria graves y posibles fallas de OutOfMemoryError, sigue estos principios del ciclo de vida:
- Instanciación diferida: No crees una sesión hasta que el usuario inicie una acción de mejora.
- Reutilización estratégica: Mantén y reutiliza una sola instancia de sesión cuando proceses transmisiones o fotogramas con configuraciones idénticas (dimensiones y opciones activadas).
- Desglose de la instrucción: Invoca
session.release()inmediatamente cuando finalicen las tareas visuales para liberar los recursos de hardware compartidos.
Inicializa el motor de mejora
Este método coordina una verificación en dos pasos. Verifica si el hardware del dispositivo admite la aceleración y, luego, se asegura de que estén presentes los módulos de aprendizaje automático requeridos.
Ejecutar este paso como requisito previo evita errores de inicialización en el tiempo de ejecución, ya que valida las capacidades antes de que tu app intente procesar contenido multimedia.
class MediaSetupViewModel(application: Application) : AndroidViewModel(application) {
private val enhancementClient = Enhancement.getClient(application)
fun initializeEnhancementEngine() {
viewModelScope.launch {
try {
// 1. Verify hardware capability
val isSupported = enhancementClient.isDeviceSupportedAsync()
if (!isSupported) {
notifyUiDeviceIncompatible()
return@launch
}
// 2. Verify and download the Google Play services ML modules
val isInstalled = enhancementClient.isModuleInstalledAsync()
if (!isInstalled) {
notifyUiDownloadingModels()
enhancementClient.installModule().await()
}
notifyUiEngineReady()
} catch (e: Exception) {
// Handle potential errors during session creation or image
// processing.
handleInitializationError(e)
}
}
}
}
Implementación: Modo de superficie (entrada y salida de la superficie)
El modo de ejecución de Surface (EnhancementMode.SURFACE) evita la sobrecarga de rendimiento de mover fotogramas entre los búferes de memoria de la CPU y la GPU. En cambio, la biblioteca de mejora asigna directamente los búferes de hardware sin procesar, lee fotogramas desde una Surface de entrada, los procesa de forma nativa y los canaliza directamente a una Surface de salida.
Instantáneas de superficies de un solo fotograma
Este método se usa para aplicar efectos de manera eficiente a un solo fotograma de imagen decodificado por hardware.
// Provisions input Surface (for example, ImageReader) and output Surface (for
// example, SurfaceView)
val inputSurface: Surface = imageReader.surface
val outputSurface: Surface = surfaceView.holder.surface
// 1. Configure parameters for SURFACE mode
val surfaceOptions = EnhancementOptions(
imageReader.width,
imageReader.height,
EnhancementMode.SURFACE,
enableTonemap = true,
enableDeblurDenoise = true,
enableFaceDetection = false
).also {
// 2. Bind hardware surfaces
it.setInputSurface(inputSurface)
it.setOutputSurface(outputSurface)
}
// 3. Create the session to process the hardware frame
val singleFrameSession = enhancementClient.createSessionAsync(surfaceOptions, executor)
// The API processes the single frame. Upon completion, release the session.
singleFrameSession.release()