web-dev-qa-db-fra.com

Android> 4.0: des 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 Android module noyau qui interceptait le "pcmC0D0p" -module pour récupérer tout l'audio du système.

Mon objectif est de diffuser TOUT l'audio (ou au moins la musique jouée) vers un haut-parleur distant via AirPlay.

Le module du noyau fonctionnait, mais il y avait plusieurs problèmes (versions du noyau, privilèges root, etc.) alors 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. Connectez-vous via Bluetooth au même téléphone, définissez le routage sur BT et saisissez l'audio à "l'autre extrémité": cela ne devrait pas fonctionner

  2. Intercepter l'audio avec un module du noyau comme fait auparavant: hardcore, ça marche mais pas applicable

  3. JACK Audio Connection Kit : malheureusement Android utilise "tinyALSA" et non "ALSA". TinyALSA ne prend en charge aucun filtre comme JACK (mais cela a amené l'idée avec le noyau) module)

  4. Utilisez PulseAudio en remplacement d'AudioFlinger, mais cela ne s'applique pas non plus


EDIT (les a oubliés):

  1. J'ai compilé "tinymix" (version bébé du mélangeur ALSA) à partir de tinyALSA (l'ALSA sur Android) et j'ai essayé de router la sortie audio vers l'entrée micro - mais sans succès ( pas compréhensible 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 microphone, mais pas plus" (peut-être que j'avais tort?)


Je viens de trouver ROUTE_TYPE_LIVE_AUDIO :

Un appareil qui prend en charge le routage audio en direct permettra au flux audio multimédia d'être acheminé vers les destinations prises en charge. Cela peut inclure des haut-parleurs internes ou des prises audio sur l'appareil lui-même, des appareils A2DP, etc.

Une fois lancé, ce routage est transparent pour l'application. Tout l'audio lu sur le flux multimédia sera acheminé vers la destination sélectionnée.

Peut-être que cela aide en aucune façon?

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

ÉDITER:

Je suis vraiment nouveau dans le codage C & kernel (mais j'ai réussi à créer un module d'interception audio compilé de manière croisée) - mais n'est-il en aucune façon possible d'écouter au moment où les données PCM vont de l'espace utilisateur (Java , Couche C?) À l'espace noyau (tinyALSA, module noyau), sans piratage ni enracinement?

39
Martin L.

Vous devez transmettre le trafic audio via votre serveur de socket local:

  1. Créer un serveur de socket local

  2. Modifiez l'adresse du flux http audio en chemin via 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 votre port de socket.

  3. Jouer

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

    avec lecteur multimédia par défaut

  4. Lisez toutes les demandes entrantes vers le port 8888 dans votre serveur de socket local, analysez-le et passez au serveur example.com.

  5. Lisez la réponse d'exemple.com et transmettez-la au client local (lecteur multimédia). ICI vous pouvez capturer le flux audio!

2
Nik