A API Media Enhancement oferece uma solução de IA no dispositivo de baixa latência e que preserva a privacidade que aproveita a aceleração de hardware para oferecer melhorias de mídia de alta qualidade sem aumentar o tamanho do APK. Para mais informações, consulte Entenda os recursos de melhoria de mídia.
O diagrama de arquitetura a seguir mostra o ciclo de vida da execução assíncrona no modo de superfície da API Media Enhancement. Esse modo vincula diretamente os buffers de hardware para eliminar o gargalo de desempenho da cópia de frames não compactados entre os buffers de memória da CPU e da GPU.
O pipeline de melhoria é implementado seguindo estas etapas:
1ª etapa: Configurar a sessão de otimização
1. Fornecer superfície de entrada: seu app fornece ao framework de melhoria um handle de superfície de entrada para acessar frames para processamento.
2. Definir superfície de saída: seu app provisiona e vincula destinos de renderização (como um SurfaceView ou TextureView) diretamente ao framework.
2ª etapa: Produzir um frame de entrada
3. Prepare a mídia de base: seu app recupera a mídia de base não compactada. Por exemplo, lendo um arquivo de um disco local.
4. Inserir dados de frame: seu app grava o payload de imagem bruta diretamente no pipeline de superfície de entrada vinculada.
3ª etapa: Processar e melhorar
5. Executar o processamento de IA: o framework processa o frame na GPU ou NPU do dispositivo, aplicando melhorias de machine learning, como mapeamento de tons, remoção de desfoque ou aumento de resolução.
6. Fornecer frame aprimorado: o mecanismo gera o frame aprimorado e de resolução total diretamente para a superfície de saída vinculada.
Fase 4: Mostrar ou salvar o resultado
7. Finalizar saída: seu app recebe o buffer de stream de hardware processado para renderizar na interface ou salvar de volta no armazenamento.
O EnhancementSession é um objeto de contexto pesado que mantém um pipeline de memória persistente de GPU ou NPU. Ele aloca RAM de vídeo (VRAM) dedicada e processadores de sistema nativos. Para evitar vazamentos de memória graves e possíveis falhas de
OutOfMemoryError, siga estes princípios de ciclo de vida:
- Instanciação lenta: não crie uma sessão até que o usuário inicie uma ação de melhoria.
- Reutilização estratégica: mantenha e reutilize uma única instância de sessão ao processar fluxos ou frames com configurações idênticas (dimensões e opções ativadas).
- Desmontagem de comandos: invoque
session.release()imediatamente quando as tarefas visuais forem concluídas para liberar recursos de hardware compartilhados.
Inicializar o mecanismo de melhoria
Esse método organiza uma verificação em duas etapas. Ele verifica se o hardware do dispositivo é compatível com a aceleração e garante que os módulos de aprendizado de máquina necessários estejam presentes.
Executar essa etapa como pré-requisito evita falhas de inicialização em tempo de execução ao validar recursos antes que o app tente processar mídia.
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)
}
}
}
}
Implementação: modo de superfície (entrada e saída de superfície)
O modo de execução da superfície (EnhancementMode.SURFACE) evita a sobrecarga de desempenho da movimentação de frames entre buffers de memória da CPU e da GPU. Em vez disso, a biblioteca de
melhorias mapeia buffers de hardware brutos diretamente, lendo frames de uma
Surface de entrada, processando-os nativamente e transmitindo-os diretamente para uma Surface
de saída.
Instantâneos de superfície de frame único
Esse método é usado para aplicar efeitos de maneira eficiente a um único frame de imagem 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()