Décodage d'AAC à l'aide de MediaCodec API sur Android

J'essaie d'utiliser l'API MediaCodec sur Android pour décoder un flux AAC. (C'est Raw AAC.) J'ai essayé d'utiliser MediaFormat.createAudioFormat () pour créer l'objet format pour passer à MediaCodec.configure (), mais j'ai toujours eu des erreurs lors de l'utilisation d'AAC (audio / mp4a-latm). (Il fonctionne avec MP3 (audio / MPEG) cependant …)

Enfin, j'ai créé un MediaExtractor pour un fichier AAC et j'ai regardé l'objet format qu'il produisait. J'ai vu qu'il comprenait la clé "csd-0" pour un ByteBuffer composé de deux octets avec la valeur 0x12. Si j'inclus cette clé et cette valeur dans l'objet de format que j'ai utilisé pour configurer le codec AAC, tout fonctionne.

  • Comment utiliser putExtra () avec FLAG_ACTIVITY_REORDER_TO_FRONT dans les applications Android?
  • Animation de mosaïque Google Plus
  • Ancres de sélection EditText manquantes
  • Bouton Écouter pour bouton dans le fragment dans Android
  • Dossiers dessinables Android Studio
  • Obtenir JSONObject de JSONArray
  • Est-ce que quelqu'un a une idée de ce qui se passe? La documentation indique que je ne devrais pas configurer cette clé. Est-ce que quelqu'un a un pointeur vers des exemples MediaCodec pour décoder les fichiers AAC sans utiliser MediaExtractor pour générer l'objet format?

  • Encodage audio AAC à l'aide de AudioRecord et MediaCodec sur Android
  • Comment enregistrer un fichier audio avec une meilleure qualité dans Android?
  • Impossible de lire le fichier audio enregistré depuis Android dans iOS 5+
  • Comment faire pour que l'AAC puisse être recherché sur le flux http en utilisant Android MediaPlayer?
  • Streaming d'audio AAC avec Android
  • Encodeur Android AAC MediaCodec
  • 3 Solutions collect form web for “Décodage d'AAC à l'aide de MediaCodec API sur Android”

    Oui, le codec config 2 octets est la première que vous recevez. Et oui, il s'agit de blocs de données raw aac. Vous pouvez voir comment je dérive le format ci-dessous lors de l'encodage. J'ai d'abord essayé de suivre la documentation, qui a dit qu'ils étaient en format latm, et essayé d'analyser cela. J'ai ensuite trouvé un «diff» sur la documentation Android qui a déclaré que la sortie était en effet des blocs bruts. En sachant alors, il s'agissait simplement de choisir un conteneur pour mes besoins. En particulier, j'avais besoin du conteneur publicitaire plutôt que flv ou mp4.

    Copier les données de la charge utile dans un tableau suffisamment grand pour votre conteneur, ajoutez simplement vos bits. Alors, après avoir parcouru Internet pour ma solution, j'ai produit le code suivant:

    profile = (configParams[0]>>3)&0x1f; frequency_index = (this.configParams[0]&0x7) <<1 | (this.configParams[1]>>7) &0x1; channel_config = (this.configParams[1]>>3) &0xf; int finallength = encoded_length + 7; ENCodedByteArray[0] = (byte) 0xff; ENCodedByteArray[1] = (byte) 0xf1; ENCodedByteArray[2] = (byte) ( ((profile - 1) << 6) + (frequency_index << 2) +(channel_config >> 2)); ENCodedByteArray[3] = (byte) (((channel_config & 0x3) << 6) + (finallength >> 11)); ENCodedByteArray[4] = (byte)( (finallength & 0x7ff) >> 3); ENCodedByteArray[5] = (byte) (((finallength & 7) << 5) + 0x1f) ; ENCodedByteArray[6] = (byte) 0xfc; 

    Utilisant quelque chose comme ceci:

     byte chunkADTS[]=new byte[info.size + 7]; fillInADTSHeader(chunkADTS,info.size); outputBuffers[bR].get(chunkADTS,7,info.size); buffer.pushData(chunkADTS); 

    J'ai utilisé le code suivant et j'ajoute ES qui a supprimé l'en-tête ADTS, ça pourrait bien fonctionner, mais je ne sais vraiment pas pourquoi devrait définir "csd-0", ou le codec se produira une erreur

      decoder = MediaCodec.createDecoderByType("audio/mp4a-latm"); mMediaFormat = MediaFormat.createAudioFormat("audio/mp4a-latm", 44100,2); byte[] bytes = new byte[]{(byte) 0x12, (byte)0x12}; ByteBuffer bb = ByteBuffer.wrap(bytes); mMediaFormat.setByteBuffer("csd-0", bb); 

    Je n'avais aucun problème pour décoder / lire le contenu d'AAC sur les quelques appareils que j'ai testés. Mon approche était d'utiliser MediaExtractor d'abord pour définir la source de données, puis initialiser le MediaFormat et finalement faire le travail en boucle avec des tampons envoyés dans / hors de MediaCodec. Pour la surface, j'ai utilisé null, car ce n'est qu'un lecteur audio, donc il n'y a rien à afficher.

    J'ai également mis en place un exemple de code en tant que bibliothèque Android, disponible sur mon blog: http://www.pocketmagic.net/2014/06/android-audio-player-using-mediacodec-mediaextractor/

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.