Tôi đang cố gắng sử dụng API MediaCodec trên Android để giải mã luồng AAC. (Đó là AAC thô.) Tôi đã thử sử dụng MediaFormat.createAudioFormat() để tạo đối tượng định dạng để chuyển tới MediaCodec.configure(), nhưng tôi vẫn gặp lỗi khi sử dụng AAC (audio/mp4a-latm). (Nó hoạt động với MP3 (audio/mpeg) mặc dù ...)Giải mã AAC bằng API MediaCodec trên Android
Cuối cùng tôi đã tạo MediaExtractor cho một tệp AAC và xem đối tượng định dạng mà nó đang tạo. Tôi thấy rằng nó bao gồm khóa "csd-0" cho một ByteBuffer bao gồm hai byte cả với giá trị 0x12. Nếu tôi bao gồm khóa và giá trị đó trong đối tượng định dạng mà tôi đã sử dụng để định cấu hình codec AAC, mọi thứ hoạt động.
Có ai có ý tưởng gì đang xảy ra không? Tài liệu nói rằng tôi không nên cấu hình khóa đó. Có ai có một con trỏ để MediaCodec ví dụ để giải mã tập tin AAC mà không sử dụng MediaExtractor để tạo ra các đối tượng định dạng?
Tiếp tục điều tra đã dẫn tôi để tin rằng csd-0 chứa ESDS (Tiểu Suối Descriptor). Nhìn vào MakeAACCodecSpecificData trong avc_utils.cpp trong các nguồn Android tôi thấy rằng 5 bit đầu tiên là kiểu đối tượng (2), 4 tiếp theo là chỉ số tần số (4 = 48000), 4 tiếp theo là cấu hình kênh (2). [Trang wiki này] (http://wiki.multimedia.cx/index.php?title=Understanding_AAC) chỉ ra rằng các bit còn lại là chiều dài khung, phụ thuộc vào bộ giải mã lõi và cờ mở rộng. Tôi đang sử dụng MediaFormat.createAudioFormat() mà nên thiết lập các yếu tố quan trọng của ESDS. –