Mezcla de audio en Android.Introducción | Victoria | Diciembre de 2021
introducir
En este artículo, quiero hablar sobre la mezcla de audio en Android. Cuando me enfrenté a la tarea de mezclar audio de archivos de video y audio usando la biblioteca android.media, todo comenzó, incluyendo:
- MediaExtractor se utiliza para extraer metainformación y muestras de medios de archivos de audio / video.
- MediaCodec se utiliza para decodificar muestras de medios codificadas.
- MediaMuxer empaqueta muestras de audio y video en archivos de video, en nuestro caso MP4.
Si nunca usa la biblioteca multimedia de Android, es mejor leer su documentación antes de continuar leyendo este tema.
Así que definamos las tareas que resolveremos en este artículo:
Tenemos un archivo MP4 y MP3Segundo Por lo tanto, queremos tener un archivo MP4 en el que se mezcle el audio del primer y segundo archivo, y la duración del MP4 de salida debe ser igual a la duración del MP4 de entrada.
Primero, declararemos el método simple que vamos a implementar. Estamos escribiendo código en Kotlin, comencemos:
La idea principal de mezclar
Por supuesto, investigué antes de implementar esta implementación, pero no pude encontrar una biblioteca simple y portátil. El artículo más útil que encontré fue Mobile Engineering-Ideas and Tips on iOS and Android Development: Audio Mixing and Recording in Android. Esos artículos nos dicen lo más importante sobre la mezcla de audio: cada muestra de audio mezclada es el promedio de la muestra de audio 1 y la muestra de audio 2-r.emark: este método solo garantiza resultados correctos para audio con frecuencias de muestreo similares, así que supongamos que nuestros archivos de entrada tienen frecuencias de muestreo similares y continuamos.
Ahora sabemos que para mezclar dos audios (con frecuencias de muestreo similares), debemos:
1) Extraiga muestras de audio originales de dos archivos de entrada: MP4 y MP3
2) Encuentre el valor promedio de las muestras de audio de entrada
3) Escriba las muestras de audio resultantes en el archivo MP4 de salida.
Extrae audio original de MP4.
Para extraer el audio original de MP4, necesitamos crear una instancia de MediaExtractor para extraer muestras de audio / video una por una (El video no se cambiará, por lo que lo escribiremos en la salida MP4 como está) Y la instancia de MediaCodec que codificará las muestras de audio, la hará original.
El proceso de extraer muestras de audio sin procesar de un archivo en realidad requiere dos pasos:
- Extraiga muestras de audio de archivos a través de MediaExtractor
- Agregue muestras de audio a la cola del búfer de entrada del decodificador
- Obtenga muestras de audio descodificadas / sin procesar de la cola del búfer de salida del descodificador.
Ejemplo de código para extraer la muestra de audio original:
Extrae el audio original de MP3.
El proceso de extracción de muestras decodificadas de archivos MP3 es el mismo que en Mp4. La única diferencia es que MP3 no tiene muestras de video, por lo que no necesitamos preocuparnos por él. Por lo tanto, usaremos la misma clase para extraer datos sin procesar de audio de archivos MP3 y Mp4, y lo llamaremos «AudioSampleExtractor».
El siguiente es un ejemplo de creación de «AudioSampleExtractor» para archivos MP3:
val mp3AudioSampleExtractor = AudioSampleExtractor(
mediaExtractor = mp3Extractor,
trackIndex = getTrackIndex(mp3Extractor, AUDIO),
syncsPresentationTime = false
)
Mezcla audio de MP4 y MP3.
Tenemos datos de audio sin procesar de MP4 y MP3, y estamos listos para mezclarlos. Como línea de tiempo principal, usaremos la hora en el archivo MP4.
Realización de la función de mezcla:
Escribe audio mezclado para dar salida a MP4.
La muestra de audio mezclada está lista y estamos listos para escribirla en el archivo MP4 de salida. Pero antes de escribir en el contenedor MP4, debemos codificarlo en formato AAC. Para codificar muestras de audio, usaremos una instancia de MediaCodec. Para escribir muestras de audio codificadas en archivos MP4, necesitamos una instancia de MediaMuxer.
Muestra de código para codificar datos de muestra de audio sin procesar y escribirlos en un archivo Mp4 de salida.
En conclusión
En este artículo, conocimos la biblioteca de medios de Android y escribimos un algoritmo simple para mezclar audio de archivos MP4 y MP3 con frecuencias de muestreo similares.
Si sabe cómo mezclar audio para diferentes frecuencias de muestreo, comparta sus conocimientos conmigo y con la comunidad, estaré muy agradecido, intentaré implementar Filtro de muestreo superior Pero no tuvo éxito.
La implementación actual se adapta fácilmente para mezclar N pistas y agregar compensaciones de tiempo cuando sea necesario.
Si desea obtener más información sobre la renderización de audio, video y gif en Android, hágamelo saber y puedo escribir otros artículos para la comunidad.
Gracias por leer.
El repositorio de Github con ejemplos de aplicaciones está aquí.