¿Cómo determino qué códecs A2DP admite / usa mi teléfono actualmente?

24

El perfil de audio A2DP de Bluetooth admite múltiples códecs. Todos los dispositivos deben admitir SBC (códec de subbanda), luego pueden admitir "códecs opcionales" adicionales como MP3 y AAC, o códecs "no A2DP" como apt-X.

Por supuesto, estos códecs no se pueden usar si el receptor no los admite, en cuyo caso ambos dispositivos recurren a SBC.

  1. ¿Cómo averiguo qué códecs admite mi hardware / ROM?
  2. ¿Cómo puedo saber qué códec está actualmente en uso? (Tal vez esto también depende de la pista, si pasa archivos MP3 / AAC directamente sin volver a codificar, por ejemplo)
endolito
fuente
Este artículo dice "Los usuarios de Android están de enhorabuena, ya que los teléfonos Android modernos son compatibles con AptX. A diferencia de Windows, ¡incluso es posible verificar si la conexión está usando AptX!" Pero no hay explicación de cómo.
endolito el

Respuestas:

10

En mi teléfono Cyanogen 10.1 (AOSP 4.2.2), es posible habilitar una captura del tráfico de bluetooth. Luego puede cargar esta captura en Wireshark y mirar la fase de negociación para determinar qué códecs admite el dispositivo de salida de audio emparejado. No estoy seguro de qué sistemas operativos admiten esto: cuando me encontré con este método por primera vez, reclamó soporte solo desde 4.4 en adelante, pero claramente no es el caso con CM en un disparo doble. :-)

Suponiendo que tiene la configuración requerida (rooteado ~ 4.2.2 o posterior), estos son los pasos:

  1. empareje su teléfono con el dispositivo A2DP de interés
  2. deshabilitar bluetooth en su teléfono
  3. edite este archivo: /etc/bluetooth/bt_stack.conf, cambiando la configuración BtSnoopLogOutput de su valor predeterminado de falso a verdadero. Para esto utilizo ES Note Editor, lanzado desde ES File Explorer después de habilitar su configuración "Root Browser".
  4. iniciar CatLog, con todos los tipos de registro habilitados
  5. habilite bluetooth en su teléfono
  6. después de que se empareje con el dispositivo de salida, reproduzca un fragmento de audio con el reproductor que elija (uso Apollo). Diez segundos más o menos deberían ser suficientes.
  7. desactivar bluetooth nuevamente
  8. detener el registro de CatLog y guardar su archivo de registro en su tarjeta SD
  9. [¡IMPORTANTE!] Edite bt_stack.conf, cambiando BtSnoopLogOutput de nuevo a falso.
  10. copie la captura BT de su tarjeta SD (/sdcard/btsnoop_hci.log), junto con el archivo CatLog guardado, en una computadora con una copia actual de Wireshark instalada.
  11. cargue el archivo de captura en Wireshark y configure un filtro de visualización Wireshark de "btavdtp" (sin comillas). Ahora verá solo algunos paquetes, busque la respuesta del dispositivo de salida a la consulta AVDTP GetCapabilities y tendrá su respuesta.

También puede alinear las marcas de tiempo de captura con las marcas de tiempo del registro CatLog para buscar entradas de registro sugerentes. Encontré un par y hábilmente olvidé incluirlos en las notas en las que se basa esta publicación.

Una vez que tenga más tiempo, espero reducir este conjunto de pasos bastante largo a una aplicación, pero no estoy seguro de si es posible y de todos modos no tendré el tiempo por un tiempo. Mientras tanto, las sugerencias para mejorar el proceso anterior son bienvenidas.

ewedel
fuente
1
Gracias. Esto funcionó muy bien. No encontré nada relevante para las capacidades en los registros de CatLog. De todos modos, lo probé en Moto G (2013) con CM 4.4.2 y con auriculares LG HBS-730. No hay apt-X en los registros, porque CM no tiene bibliotecas propietarias para eso.
dvim
Gracias, @Martynas, es bueno saberlo. ¿Incluyó soporte para mp3? Me pregunto cuál podría ser un buen objetivo para probar que mi teléfono admite mp3. Desafortunadamente, la radio del automóvil no funciona, y no he encontrado ningún producto (!) Que documente su soporte de códec A2DP. Con respecto a CatLog, no estaba pensando que la lista de códecs real estaría allí tanto como algunos mensajes sugerentes que podrían usarse para buscar el código fuente. Otro día ..
ewedel
1
Entonces, una respuesta a Discovertres receptores de audio devueltos. Una respuesta a GetCapabilitiespara ACP SEID [2 - Audio Sink]incluido Service: Media Codec - Audio MPEG-1,2 Audioque tenía MP3: True. He subido el archivo de registro capturado a github .
dvim
Gracias de nuevo @Martynas. Aunque el 730 tiene mejores críticas, agarró un LG HBS-750 para probarlo. El mismo conjunto de códecs que el 730. Bifurqué su repositorio y agregó otra captura aquí . Desafortunadamente, en nuestras dos capturas el teléfono está eligiendo usar SBC en lugar de mp3. No estoy seguro de qué tipo de archivo de medios usó, pero mi prueba CM 4.2.2 utilizó 128kb / s VBR mp3s (tasa de bits deliberadamente pequeña para evitar estresar el ancho de banda de BT). Comenzando a pensar que ce4 podría tener razón sobre el problema de la licencia .
ewedel
La edición de `/ etc / bluetooth / bt_stack.conf` no pareció funcionar, pero tenía exactamente la misma configuración en la configuración del desarrollador y funcionó. Gracias a su respuesta, pude descubrir que Parrot Zik 2 usa SBC la mayor parte del tiempo.
Cero
8

Mirando la fuente, hay al menos 4 códecs: SBC (obligatorio), MP3 (MPEG12), AAC (MPEG24) y ATRAC de Sony.

./android/external/bluetooth/bluez/audio/a2dp.h:  
#define A2DP_CODEC_SBC          0x00
#define A2DP_CODEC_MPEG12       0x01
#define A2DP_CODEC_MPEG24       0x02
#define A2DP_CODEC_ATRAC        0x03

El software subyacente es la pila "bluez" de Linux. Es compatible con SBC y tiene capacidades limitadas de MP3.

El registro de cambios para v3.25 (2009?) Dice: "Agregue compatibilidad limitada para el códec MPEG12 / MP3".

./android/external/bluetooth/bluez/ChangeLog:
ver 3.25:
    Add limited support for Handsfree profile.
    Add limited support for MPEG12/MP3 codec.

Ver también el anuncio v3.25 . La compatibilidad con MP3 parece depender de gstreamer, que no está disponible en Android, así que supongo que SBC es la única opción para que arranque A2DP.

PD: La mayoría de los dispositivos A2DP parecen carecer de soporte para MP3 / AAC debido a problemas de patentes / licencias (incluido Linux).

ce4
fuente
2
Esos son 3 códecs opcionales, sí, o puede usar otros códecs como el Galaxy S III con apt-X . Sin embargo, ¿pensé que la codificación era proporcionada por el hardware? Android puede reproducir MP3, así que dudo que haya limitaciones de patente.
endolito
2
No creo que SBC tenga un codificador de hardware dedicado en dispositivos Android. Es computacionalmente modesto, así que supongo que se hace en software. Al menos las fuentes lo indican. PD: Estoy mirando la fuente de Cyanogenmod, no la de HTC o Samsung. PS2: me refería a los dispositivos de disipador de audio del otro lado con falta de mp3 / aac (auriculares, etc.)
ce4
7

Con los dispositivos Nexus 4 (5.0.1) o Nexus 7 (2012) (4.4.4) es posible utilizar el modo desarrollador para obtener btsnoop_hci.log. "Habilitar el registro de snoop de Bluetooth HCI". No es necesario rootear los dispositivos. Parece que ambos dispositivos no ofrecen aptx. Pruebo esto con Moto Stream (sin aptx) y Philips AEA2500 (con aptx).

prittstift69
fuente
1
Estoy en CM 12.1 y esta poción también está disponible para mí. Quizás esté en todos los teléfonos recientes. Gracias.
pedro_sland
4

[El crédito por esta respuesta va principalmente a ewedel, quien aclaró que la respuesta está en el archivo btsnoop_hci.log, usando Wireshark; y prittstift69, para compartir la manera fácil de crear este archivo de registro.]

Este es un tutorial paso a paso para novatos, que resume las respuestas ya dadas, con alguna interpretación de los resultados de mi parte.

Como se mencionó en prittstift69 y otros, puede "Habilitar el registro de snoop de Bluetooth HCI" en Opciones de desarrollador. No es necesario seguir el enfoque más complicado sugerido por ewedel.

  1. Comience apagando el bluetooth en el dispositivo Android (lo llamaré 'teléfono').

  2. Active Bluetooth HCI snoop log en Opciones de desarrollador.

  3. Encienda Bluetooth en el teléfono y conéctelo al receptor Bluetooth (lo llamaré 'receptor'). Este paso supone que el receptor se había emparejado previamente con el teléfono.

  4. Reproduzca música en su teléfono (idealmente un archivo WAV o FLAC sin comprimir). Diez segundos es todo lo que necesitas. (Probablemente incluso menos)

  5. Apague Bluetooth en el teléfono.

  6. Apague el registro de snoop Bluetooth HCI

  7. Transfiera el archivo btsnoop_hci.log (lo encontré en / sdcard / Android / Data /) a su computadora. Ejecute wireshark en su computadora y abra el archivo btsnoop_hci.log

  8. Filtrar por "btavdtp" (sin comillas) Buscar un mensaje del teléfono al receptor "Comando enviado - Configurar configuración ..." Este es el mensaje enviado por el teléfono al receptor con la configuración final que se utilizará para este audio después de completar el apretón de manos. El texto en el campo Información le dirá cuál fue la configuración final.

[SBC] Si es SBC, es posible que desee saber qué es el bitpool. Para hacer esto, elimine el Filtro para btavdtp y busque un mensaje con Protocol SBC y haga clic en él. A continuación, en la sección de detalles, expanda la información del códec SBC Bluetooth. Luego expanda cualquiera (o todos) de los datos del Marco. Allí, debería mostrar claramente el Bitpool utilizado por ese Frame. Si es 35, existe una buena posibilidad de que su frecuencia de muestreo sea 44.1 kHz, esté utilizando Joint Stereo y el perfil de audio SBC de calidad media ( http://soundexpert.org/news/-/blogs/bluetooth-audio -calidad-a2dp ). La tasa de bits para el audio comprimido es entonces 229 kbits / seg SBC, que obtiene un puntaje de 4.68 en las pruebas de Sound Expert ( http://soundexpert.org/encoders-224-kbps ) que es comparable a mp3 alrededor de 110-130 kbits / seg.

[APT-X] Si es APT-X, tanto su teléfono como su receptor son compatibles con APT-X, y eso es lo que está utilizando. Suponiendo 16 bits, 44,1 kHz, el códec se ejecuta a 352 kbits / s.

klaberte
fuente
"idealmente un archivo WAV o FLAC sin comprimir" ¿No le gustaría reproducir un MP3 para ver si lo envía como MP3, etc.?
endolito
2
Solo si su objetivo es ver si A2DP admite mp3 en ambos lados (una pregunta válida). Sin embargo, mi experiencia es que el soporte de mp3 en ambos lados es raro (nunca lo he visto en ninguno de mis dispositivos, y he tenido bastantes). Entonces, al menos con dispositivos Android, sus opciones de códec A2DP más probables son SBC y APTX. La reproducción de un archivo de audio sin comprimir obliga al teléfono a volver a codificar.
klaberte
No escribí una respuesta
endolito