Retardo de grabación de audio
Estoy escribiendo una aplicación para Android, donde mi objetivo es grabar el canto del usuario. Después de la grabación, toco el disco sincronizado con el instrumental (que no es un problema).
El problema es cuando comienzo a grabar al mismo tiempo que toco el audio. Sospecho que hay un retraso para que la grabación comience: (se nota cuando intento reproducir la grabación más tarde cuando la grabación grabó el instrumental también). El retraso puede ser alrededor de 300ms en el nexo 5.
- Cómo grabar voz en formato "wav" en Android
- Archivo .m4a archivo Android
- Android: Grabación de audio con visualización de nivel de voz
- Pausar y reanudar la grabación de audio en Android
- Mejorar la calidad de grabación de audio Android?
Mis preguntas son:
- Cuál es la constante de retardo en todos los dispositivos Android (4.0 +)?
- cómo calcular el retraso sin involucrar métodos complejos ?
- ¿es aceptable en el dispositivo móvil, para abrir la grabación de audio y escalar a instrumental (que puede implicar decodificación / codificación de audio)?
¿Cómo deshacerse de la demora?
- Eliminar el ruido del registro de la muestra de audio mediante audiorecorder
- Procesamiento de señales (decodificación de código Morse) con aplicación Android
- Frecuencia de muestreo y ruido de Android MediaRecorder
- ¿Cómo puedo transferir el búfer de audio para reproducirlo directamente
- Análisis de audio de Android en tiempo real
- AudioRecord de Android vs MediaRecorder para la grabación de audio
- ¿Cómo mantiene Google Keep Speech Recognition mientras se guarda la grabación de audio al mismo tiempo?
- Utilice el botón del auricular para grabar sonido
Cuál es la constante de retardo en todos los dispositivos Android (4.0 +)?
El retardo no es constante , porque al menos la latencia de ida y vuelta de audio no es constante .
Puede estar seguro de que el retardo no es constante, ya que también depende de:
-
el códec de hardware de audio real: algunos codec tienen un inicio lento. Por ejemplo, mira la función
adc_ramp_work
en este código: está haciendo un inicio lento en el códec . -
la forma en que el audio se almacena en la cadena de procesamiento: un tamaño de buffer de 4096 muestras (el tamaño utilizado en la mayoría de los teléfonos Samsung ), obviamente añadirá más retardo que un buffer de 1024 muestras.
cómo calcular el retraso sin involucrar métodos complejos? No puedes. (sin métodos complejos).
La latencia de audio reportada por la API de AudioTrack es sólo una latencia del software. Y medir la latencia no es una tarea sencilla , como se puede ver en la documentación oficial .
cómo deshacerse de la demora?
Esta es la buena noticia aquí: es probable que no tenga que deshacerse del retraso, siempre y cuando empiece a jugar una vez que la grabación realmente se inicia.
La solución de Jeffrey es un gran comienzo. Tenga en cuenta que necesita leer () los datos o sus devoluciones de llamada no se llamarán.
¿es aceptable en el dispositivo móvil, para abrir la grabación de audio y escalar a instrumental (que puede implicar decodificación / codificación de audio)?
AudioTrack.setVolume () le ofrece una forma sencilla de escalar sus pistas. Encontrar el factor de escala automáticamente puede ser bastante complicado: necesitará estimar la sonoridad de la grabación, y también la intensidad de su instrumental.
Le sugiero que utilice una solución mucho más simple: proporcione un control deslizante en su interfaz de usuario que permite al usuario ajustar la mezcla entre la grabación instrumental y la voz (utilice AudioTrack.setVolume
en segundo plano). De esta manera, puede estar seguro de que la relación instrumental / voz realmente se ajusta al gusto del usuario.
Como ya menciona @Lukos, es muy probable que el retardo dependa de las velocidades de procesamiento. Simplemente toma algún tiempo para iniciar la grabadora.
Creo que su mejor solución sería iniciar la grabadora primero, y luego iniciar la reproducción de audio tan pronto como sepa que la grabadora se ha iniciado. De esta manera tendrá un retraso en la grabación, pero al menos está en sincronía. Es necesario asegurarse de que la reproducción se ha inicializado, por lo que se puede iniciar tan rápido como sea posible.
Esto se puede lograr utilizando las devoluciones de llamada de AudioRecorder.
// Assuming you have a recorder objects defined somewhere AudioRecord recorder; recorder.setNotificationMarkerPosition(1); recorder.setRecordPositionUpdateListener(new AudioRecord.OnRecordPositionUpdateListener() { @Override public void onMarkerReached(AudioRecord recorder) { // start audio playback } @Override public void onPeriodicNotification(AudioRecord recorder) { } });
Tenga en cuenta que no estoy seguro acerca de la posición del marcador. Es posible que también pueda utilizar 0, no está seguro de si eso le dará una notificación inmediatamente después de iniciada la grabación, o si es antes de que se inicie realmente. Tienes que hacer algunas pruebas allí.
- Creación de un control deslizante de imagen 3D para Android e iOS
- Cómo eliminar el relleno de barchart horizontal de mpandroidchart?