39 votes

Android > 4.0 : Idées pour enregistrer/capturer l'audio interne (par exemple STREAM_MUSIC) ?

Il y a quelques mois, avec Android ICS (4.0), j'ai développé un module du noyau Android qui interceptait le module "pcmC0D0p" pour récupérer tout le son du système.

Mon objectif est de diffuser TOUT le son (ou au moins la musique jouée) vers une enceinte distante via AirPlay.

Le module du noyau a fonctionné, mais il y avait plusieurs problèmes (versions du noyau, privilèges root, etc.) donc j'ai arrêté de travailler dessus.

Maintenant, nous avons Android 4.1 et 4.2 et j'ai un nouvel espoir !

Qui a une idée de comment capturer l'audio dans Android ?

J'avais les idées suivantes :

  1. Connexion via Bluetooth sur le même téléphone, définissez le routage sur BT et récupérez l'audio à "l'autre bout" : cela ne devrait pas fonctionner.

  2. Intercepter l'audio avec un module kernel comme cela a été fait auparavant : hardcore, faire fonctionner mais pas applicable.

  3. Kit de connexion audio JACK : malheureusement, Android utilise "tinyALSA" et non "ALSA". TinyALSA ne supporte aucun filtre comme JACK (mais cela a apporté l'idée avec le module du noyau).

  4. Utiliser PulseAudio en remplacement d'AudioFlinger, mais ceci n'est pas non plus applicable


EDIT (je les ai oubliés) :

  1. J'ai compilé "tinymix" (baby-version de ALSA-mixer) à partir de tinyALSA (l'ALSA sur Android) et j'ai essayé de diriger la sortie audio vers l'entrée micro - mais sans succès ( pas comprendre pour moi ). Et cela nécessite également un enracinement : non applicable

  2. J'ai testé OpenSL ES mais je ne suis pas un C-crack et cela s'est terminé par "Je peux enregistrer un micro, mais pas plus" (peut-être que je me suis trompé ?).


Je viens de trouver ROUTE_TYPE_LIVE_AUDIO :

Un appareil qui prend en charge le routage audio en direct permettra au média audio d'être acheminé vers les destinations prises en charge. Il peut s'agir des haut-parleurs internes ou des prises audio sur le dispositif lui-même, des dispositifs A2DP, et autres.

Une fois lancé, ce routage est transparent pour l'application. Tous les fichiers audio jouée sur le flux média sera acheminée vers la destination sélectionnée. destination sélectionnée.

Peut-être que cela vous aide d'une manière ou d'une autre ?

Je suis à court d'idées mais je veux "casser cette noix", peut-être quelqu'un peut-il m'aider ?

EDITAR:

Je suis vraiment nouveau dans le codage C & kernel (mais j'ai créé avec succès un module d'interception audio compilé en croisé) - mais n'est-il pas possible d'écouter au point où les données PCM passent de l'espace utilisateur (JAVA, couche C ?) à l'espace kernel (tinyALSA, module kernel), sans piratage et enracinement ?

2voto

Nik Points 1937

Vous devez faire passer le trafic audio par votre serveur de socket local :

  1. Créer un serveur de socket local

  2. Modifiez l'adresse du flux http audio pour que le chemin passe par votre serveur de socket local, par exemple pour l'adresse

    http://example.com/stream.mp3  ->
    
    http://127.0.0.1:8888/http://example.com/stream.mp3

    où 8888 est le port de votre socket.

  3. Jouer

    http://127.0.0.1:8888/http://example.com/stream.mp3 

    avec le lecteur multimédia par défaut

  4. Lire toutes les requêtes entrantes sur le port 8888 dans votre serveur de socket local, les analyser et les transmettre au serveur example.com.

  5. Lire la réponse de example.com et la transmettre au client local (lecteur multimédia). ICI vous pouvez capturer le flux audio !

0voto

lucasddaniel Points 54

Je pense que c'est peut-être le début du chemin : http://Android-developers.blogspot.com.br/2013/08/respecting-audio-focus.html

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X