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.

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?

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í.

  • Talking App como hablar, la grabación de audio no funcionó en todos los dispositivos
  • ¿Por qué es imposible utilizar el grabador de voz en el emulador de Android?
  • Android: silencie el micrófono mientras graba vídeo
  • ¿Cómo grabar audio solo si está por encima de cierto nivel de sonido?
  • Grabación de llamadas en android por qué esto no funciona
  • Android, filtros de audio
  • ¿Por qué AudioRecord.getMinBufferSize devuelve ERROR_BAD_VALUE (-2)?
  • Tratando de grabar audio, pero recibiendo el mensaje "mediarecorder se fue con eventos no controlados" y "Señal fatal 11 (SIGSEGV) ..."
  • ¿Cómo puedo detener GC_CONCURRENT corriendo tan frecuentemente?
  • Android: prueba si Audio-Record-Focus está disponible?
  • Entrada de audio a través de la toma de auriculares en Android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.