Sincronizar datos de audio y vídeo descodificados de Mediacodec
Quiero escribir un simple reproductor de audio / video usando MediaExtractor
y MediaCodec
APIs.
Soy capaz de decodificar y procesar el audio
y video
. Pero, me falta la sincronización de audio - video
.
- ¿Cómo sincronizar la reproducción de sonido en android?
- Cómo lograr una reproducción de audio sin interrupciones entre bucle en Android
- ¿Cómo reanudar MediaPlayer en Android?
- ¿Puedo obtener datos crudos de cpm de MediaPlayer o SoundPool?
- Error de MediaPlayer de Android (-38,0)
No pude encontrar ninguna API para controlar la sincronización entre audio
y video
. ¿Puede alguien por favor decirme, cómo sincronizar los datos de audio
y video
decodificados?
- Cómo obtener datos de MediaStore.File y MediaStore.File.FileColumn
- Error del reproductor multimedia (262, 0)
- ¿El reproductor de medios de Android suministra id de sesión en los encabezados de peticiones HTTP?
- Error de Reproductor de medios de Android (1, -4) mientras reproduce un audio de la carpeta Activos
- La reproducción de vídeo proporciona pantalla en negro pero con sonido
- Android no muestra el formato m3u8 en videoview, solo sonido
- VideoView Flujo de carga insuficiente
- Transmisión en vivo de audio retrasos mientras se reproduce en android-16?
En fuentes de Android, hay una implementación de motor de player
ejemplo basada en API de MediaCodec
. Usted puede comprobar si SimplePlayer
encuentra en frameworks/av/cmds/stagefright/SimplePlayer.cpp
.
En esta implementación de motor de reproductor, la salida de MediaCodec
se dequeued
y se inserta en una cola como se muestra aquí . Compruebe las líneas 439 – 450 para obtener una imagen completa.
Una vez que el búfer está disponible, hay un simple mecanismo de AV Sync
implementado aquí . Consulte las líneas 508-521. En este ejemplo, sólo se considera una pista y, por tanto, nowUs
, es decir, la hora actual se deriva de systemTime
es decir, ALooper::nowUs
.
En su código, puede considerar la posibilidad de reproducir el audio
siempre en base al first-come-first-serve
nowUs
y para su pista de video
, puede derivar las nowUs
de la pista de audio
.
Una implementación sencilla podría ser el nowUs = getAudioLastPresentationTime()
donde, getAudioLastPresentationTime
devolverá el último presentationTimeUs
enviado desde el audio
MediaCodec
al audio renderer
.
- Cómo depurar una aplicación en Android con GDBSERVER?
- Cómo desarrollar una aplicación para Android que utilice Google Calendar API