Android: el sonido de la API (determinista, baja latencia)

Yo estoy revisando todo tipo de Android API sound y me gustaría saber cuál debo usar.
Mi objetivo es conseguir una baja latencia de audio o, al menos, determinista del comportamiento en relación con el retraso de la reproducción.

Hemos tenido un montón de problemas y parece que Android API sound es una mierda, así que estoy explorando posibilidades.

El problema que tenemos es que hay un retraso significativo entre sound_out.write(sound_samples); y real del sonido que se reproduce por los altavoces. Generalmente es de alrededor de 300 ms. El problema es que en todos los dispositivos es diferente; algunos no tienen ese problema, pero la mayoría de los que están paralizadas (sin embargo, CS llamada latencia cero). El mayor problema con esta ridícula la demora es que en algunos dispositivos de este retraso parece ser algo de valor al azar (es decir, no siempre 300ms).

Estoy leyendo acerca de OpenSL ES y me gustaría saber si alguien tiene experiencia con esto, o es la misma mierda, pero envuelto en un paquete diferente?

Yo prefiero tener acceso nativo, pero no me importa Java capa de indirección como puedo obtener determinista de la conducta: el retraso ha de ser constante (para un dispositivo determinado), o que me gustaría conseguir el acceso a la posición de reproducción actual en vez de adivinar con un rango de error de ±300 ms…

EDITAR:
1.5 años más tarde he probado con varios teléfonos android para ver cómo puedo conseguir mejor posible latencia para una comunicación voz en tiempo real. El uso de herramientas especializadas medí el retraso de waveout camino. Los mejores resultados fueron más de 100 ms, la mayoría de los teléfonos estaban en 180 ms rango. Alguien tiene ideas?

  • Si usted está apuntando a Android 2.3 y arriba, puede utilizar OpenSl ES. No es un contenedor, y es más rápido, pero no esperes nada por debajo de 40 ms bien.
  • Usted también puede ver music.columbia.edu/pipermail/andraudio – es una lista de correo para android de audio. Mi sensación es que muchas personas comparten su dolor.
  • Usted puede estar interesado en buscar en el código fuente de Android. Hay algunos subyacente clases como AudioPolicyManager y audio_policy que, como yo lo entiendo, se utilizan para trabajar con audio de bajo nivel. Pueden ser útiles.
  • Como de Jellybean el doc ha citado usted ya no es estrictamente exacto. Jellybean incluye programador de mejoras que OpenSL ES puede tomar ventaja de Java pero no puede. Por favor vea mi respuesta a continuación.
  • 30ms es alcanzable en algunos dispositivos Jellybean. Depende mucho de cómo se mida, aunque. La salida de Audio de latencia es sólo una parte de la cuestión. Toque la latencia también es importante, y varía de un dispositivo a dispositivo.
  • +1 para @IanNi-Lewis comentario – 4.1 hace una gran diferencia con OpenSL.

InformationsquelleAutor Pavel P | 2011-09-01

5 Kommentare

  1. 27

    SoundPool es la menor latencia de la interfaz en la mayoría de los dispositivos, ya que la piscina es almacenado en el proceso de audio. Todas las demás vías de audio requieren de la comunicación entre procesos. OpenSL es la mejor opción si SoundPool no satisface sus necesidades.

    Por Qué OpenSL? AudioTrack y OpenSL similares a las latencias, con una diferencia importante: AudioTrack búfer de devoluciones de llamadas son atendidas en Dalvik, mientras que OpenSL devoluciones de llamadas son atendidas en subprocesos nativos. La implementación actual de Dalvik no es capaz de dar servicio a las devoluciones de llamada en muy bajas latencias, porque no hay manera de suspender la recolección de basura durante audio devoluciones de llamada. Esto significa que el tamaño mínimo de AudioTrack búferes tiene que ser mayor que el tamaño mínimo para OpenSL búferes para sostener el fallo de reproducción libre.

    En la mayoría de versiones de Android esta diferencia entre AudioTrack y OpenSL que no hizo ninguna diferencia en absoluto. Pero con Jellybean, Android ahora tiene un audio de baja latencia camino. La latencia actual es todavía dependiente del dispositivo, pero puede ser considerablemente menor que antes. Por ejemplo, http://code.google.com/p/music-synthesizer-for-android/ utiliza 384-frame buffers en el Galaxy Nexus por un total de salida de la latencia de menos de 30ms. Esto requiere que el audio hilo servicio de búferes aproximadamente una vez cada 8ms, que no era factible en anteriores versiones de Android. Aún no es factible en un Dalvik hilo.

    Esta explicación supone dos cosas: primero, que está solicitando la más pequeña posible búferes de OpenSL y haciendo su procesamiento en el búfer de devolución de llamada, en lugar de con un buffer de la cola. En segundo lugar, que su dispositivo es compatible con la de baja latencia camino. En la mayoría de los dispositivos actuales que usted no va a ver mucha diferencia entre AudioTrack y OpenSL ES. Pero en los dispositivos que admiten Jellybean+ y de audio de baja latencia, OpenSL ES le dará a usted la menor latencia de la ruta.

    • Ian, en realidad, las pruebas realizadas y se ve que OpenSL realiza peor.
    • Puede usted describir las pruebas que se realizan? Hay un número de maneras que usted puede configurar OpenSL ES así que su latencia es mayor que AudioTrack. Véase mi respuesta a la stackoverflow.com/questions/14842803/… para obtener más detalles sobre cómo configurar OpenSL a ser de baja latencia.
    • He usado Android OpenSL waveout código de WebRTC para la reproducción de audio. La idea de mi prueba fue simple: generar dos distintivo corta ráfaga de ruido de la bocina y lo recojo en el micrófono del dispositivo. A continuación, medir el tiempo desde que escribí estas ráfagas de ruido a waveout y el tiempo de cuando me la detectó en wavein. Necesitamos más bajo posible waveout latencia en tiempo real para las llamadas VoIP, también necesitamos todos los tipos de controles disponibles para AudioTrack, como cambiar de auricular/altavoz, el cambio automático de ganancia o cancelación de eco acústico; Es todo eso que no está disponible con OpenSL?
    • El WebRTC código no permitir la rápida ruta de acceso de baja latencia. (¿Por qué?) Ver youtube.com/watch?v=d3kfEeMZ65c. La importante conclusión es que si no se establece la magia de tamaño de búfer y la frecuencia de muestreo
  2. 2

    IIRC, OpenSL se pasa a través de la misma interfaz como AudioTrack, así que a lo mejor va a coincidir con AudioTrack. (FWIW, actualmente estoy usando OpenSL de «baja latencia» de salida)

    La triste verdad es que no hay tal cosa como la baja latencia de audio en Android. No hay una manera adecuada a la bandera y/o filtro de los dispositivos basados en la latencia de audio.

    Lo que la interfaz es probable que desee utilizar para minimizar la latencia va a depender de lo que usted está tratando de hacer.
    Si usted quiere tener un flujo de audio se le busca en cualquiera de los OpenSL o AudioTrack.

    Si quieres desencadenar algunos estática oneshots puede que desee utilizar SoundPool. Para la estática oneshots SoundPool tendrá de baja latencia que las muestras están precargados en el hardware. Creo que es posible precarga oneshots utilizando OpenSL así, pero yo no lo he probado.

    • He intentado algunas pruebas, y confirman: en el mejor de los OpenSL obtiene el mismo resultado que AudioTrack.
    • Como en el anterior, esto es cierto si OpenSL no es el uso de la vía rápida. Si lo configura para que pueda usar el fast path, su latencia debe ser significativamente mejor en la mayoría de los dispositivos.
  3. 1

    La menor latencia que puede obtener es de SoundPool. Hay un límite en el tamaño de un sonido se puede jugar de esa manera, pero si estás en el límite de 1Mb, si mal no recuerdo) es bastante baja latencia. Aun que no es, probablemente, 40 ms, a pesar de que.

    Pero es más rápido de lo que se puede obtener mediante streaming, al menos en mi experiencia.

    Advertencia: Usted puede ver los fallos ocasionales en SoundPool en los dispositivos Samsung. Estoy teoría es que sólo sucede cuando usted tener acceso a la SoundPool de varios hilos, pero no he comprobado esto.

    EDICIÓN: OpenSL ES, al parecer, tiene una latencia muy ALTA en Kindle Fire, mientras que SoundPool es mucho mejor, pero el contrario puede ser verdad en otras plataformas.

    • El OpenSL ES el tamaño de búfer es elegido por el OEM. Kindle Fire, al parecer, tiene un búfer muy grande, lo que hace sentido-de mayor tamaño de los búferes de media menos de búfer servicio de llamadas, lo que significa una mayor vida útil de la batería. Y usted no necesita de baja latencia si todo lo que estamos haciendo es reproducir música y películas.
  4. 0

    Sobre el problema de un determinista/latencia constante, aquí usted puede encontrar un interesante artículo:

    ENFOQUES PARA LA CONSTANTE DE LA LATENCIA DE AUDIO EN ANDROID

    El núcleo de sus investigaciones es: Porque el Audio HAL, que es uno de los niveles más profundos de la audiopath y responsable de la sincronización de audio de devolución de llamada de eventos, es el proveedor implementa la relativa a las latencias pueden variar, especialmente en hoteles de hardware.
    De modo que ellos sugieren dos enfoques para reducir la variación de la latencia. Es cuidar de la devolución de llamada-el tiempo mediante la inserción de audio en intervalos fijos, y el otro es para filtrar las horas de devolución de llamada para estimar el tiempo en que una latencia constante de devolución de llamada debe haber ocurrido por appliyng un filtro de suavizado.
    Con estos dos enfoques que podrían reducir significativamente la varianza de la latencia.

    Cabe mencionar también, que hay una nueva aplicacion para Android-Audio-API, AAudio.

    AAudio API

    Es disponible/estable de Android Oreo 8.1 (a Nivel de API 27).
    También hay un contenedor, que elige dinámicamente entre OpenSL ES y AAudio y es mucho más fácil para el código de la OpenSL ES. Todavía en la developer preview.

    Oboe Biblioteca De Audio

  5. 0

    La mejor manera de conseguir una baja latencia para código nativo en Android es el uso de Oboe.

    https://github.com/google/oboe

    Oboe envuelve AAudio en los dispositivos más nuevos. AAudio ofrece la latencia más baja posible de caminos. Si AAudio no está disponible, a continuación, Oboe llamadas OpenSL ES. El Oboe es mucho más fácil de usar que OpenSL ES.

    AAudio llamadas a través de AudioTrack o a través de un nuevo plan de acción de la ruta de datos. AAudio hace que sea más fácil obtener una vía RÁPIDA porque puede dejar algunos de los parámetros no especificados. AAudio luego elegir el derecho de los parámetros necesarios para una pista RÁPIDA.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea