Próbuję użyć API MediaCodec na Androida do odkodowania strumienia AAC. (To jest surowy AAC.) Próbowałem użyć MediaFormat.createAudioFormat(), aby utworzyć obiekt formatu, który ma być przekazany do MediaCodec.configure(), ale ciągle otrzymywałem błędy podczas korzystania z AAC (audio/mp4a-latm). (Działa z MP3 (audio/mpeg) chociaż ...)Dekodowanie AAC przy użyciu MediaCodec API na Androidzie
W końcu stworzyłem MediaExtractor dla pliku AAC i przyjrzałem się obiektowi formatu, który on tworzył. Zobaczyłem, że zawiera on klucz "csd-0" dla ByteBuffer złożonego z dwóch bajtów o wartości 0x12. Jeśli uwzględnię ten klucz i wartość w obiekcie formatu, który użyłem do skonfigurowania kodeka AAC, wszystko działa.
Czy ktoś ma pojęcie, co się dzieje? Dokumentacja stwierdza, że nie powinienem konfigurować tego klucza. Czy ktoś ma wskaźnik do przykładów MediaCodec do dekodowania plików AAC bez użycia MediaExtractor do generowania obiektu formatu?
Dalsze dochodzenie doprowadziło mnie do przypuszczenia, że CSD-0 zawiera ESDS (Elementary Stream deskryptora). Patrząc na MakeAACCodecSpecificData w avc_utils.cpp w źródłach Androida widzę, że pierwsze 5 bitów to typ obiektu (2), następne 4 to indeks częstotliwości (4 = 48000), następne 4 to konfiguracja kanału (2). [Ta strona wiki] (http://wiki.multimedia.cx/index.php?title=Understanding_AAC) wskazuje, że pozostałe bity dotyczą długości ramki, zależą od dekodera rdzenia i flagi rozszerzenia. Używam MediaFormat.createAudioFormat(), który powinien skonfigurować ważne elementy ESDS. –