Décodage AAC en utilisant MediaCodec API sur Android

Je suis en train d'utiliser les MediaCodec API sur Android pour décoder un flux AAC. (C'est cru AAC.) J'ai essayé d'utiliser le MediaFormat.createAudioFormat() pour créer le format de l'objet à transmettre à MediaCodec.configurer(), mais j'ai continué de faire des erreurs lors de l'utilisation de l'AAC (audio/mp4a-latm). (Il fonctionne avec les formats MP3 (audio/mpeg) quoique...)

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

Quelqu'un a une idée de ce qui se passe? La documentation précise que je ne devrais pas la configuration de cette touche. Quelqu'un aurait-il un pointeur vers MediaCodec exemples pour décoder les fichiers AAC sans l'aide de MediaExtractor pour générer le format de l'objet?

Complément d'enquête m'a conduit à croire que la cdd-0 contient l'ESD (Flux Élémentaire Descripteur). En regardant dans MakeAACCodecSpecificData avc_utils.cpp dans l'Android sources, je vois que les 5 premiers bits sont le type de l'objet (2), les 4 sont l'indice de fréquence (4 = 48000), les 4 prochaines sont le canal de config (2). Cette page du wiki indique que les bits restants sont pour la longueur de trame, dépend de base d'un décodeur, d'extension et de drapeau. Je suis en utilisant MediaFormat.createAudioFormat() qui devrait configuration les éléments importants de l'ESD.

OriginalL'auteur Benjamin Reed | 2012-10-17