首页 > 代码库 > [工作记录] Android OpenSL ES: references & AAC related

[工作记录] Android OpenSL ES: references & AAC related

AAC V.S. MP3

http://en.wikipedia.org/wiki/Advanced_Audio_Coding#AAC.27s_improvements_over_MP3

 

AAC patent lisense FAQ:

http://www.vialicensing.com/licensing/aac-faq.aspx

you may need a license but usually no fees, exept that when end user products are(/contain?) encoders/decoders.

 

Overview:

$(NDK_ROOT)/docs/opensles/index.html

Decode audio to PCM

Note: this feature is available at API level 14 and higher.

A standard audio player plays back to an audio device, and the data sink is specified as an output mix. However, as an Android extension, an audio player instead acts as a decoder if the data source is specified as a URI or Android file descriptor data locator with MIME data format, and the data sink is an Android simple buffer queue data locator with PCM data format.

This feature is primarily intended for games to pre-load their audio assets when changing to a new game level, similar to android.media.SoundPool.

The application should initially enqueue a set of empty buffers to the Android simple buffer queue, which will be filled with PCM data. The Android simple buffer queue callback is invoked after each buffer is filled. The callback handler should process the PCM data, re-enqueue the now-empty buffer, and then return. The application is responsible for keeping track of decoded buffers; the callback parameter list does not include sufficient information to indicate which buffer was filled or which buffer to enqueue next.

The end of stream is determined implicitly by the data source. At the end of stream a SL_PLAYEVENT_HEADATEND event is delivered. The Android simple buffer queue callback will no longer be called after all consumed data is decoded.

The sink‘s PCM data format typically matches that of the encoded data source with respect to sample rate, channel count, and bit depth. However, the platform implementation is permitted to decode to a different sample rate, channel count, or bit depth. There is a provision to detect the actual PCM format; see section "Determining the format of decoded PCM data via metadata" below.

Decode to PCM supports pause and initial seek. Volume control, effects, looping, and playback rate are not supported.

Depending on the platform implementation, decoding may require resources that cannot be left idle. Therefore it is not recommended to starve the decoder by failing to provide a sufficient number of empty PCM buffers, e.g. by returning from the Android simple buffer queue callback without enqueueing another empty buffer. The result of decoder starvation is unspecified; the implementation may choose to either drop the decoded PCM data, pause the decoding process, or in severe cases terminate the decoder.  

 

API docs:

$(NDK_ROOT)/docs/opensles/OpenSL_ES_Specification_1.0.1.pdf

Samples:

$(NDK_ROOT)/samples/NativeAudio

 

ADTS header (http://wiki.multimedia.cx/index.php?title=ADTS):

LetterLength (bits)Description
A12syncword 0xFFF, all bits must be 1
B1MPEG Version: 0 for MPEG-4, 1 for MPEG-2
C2Layer: always 0
D1protection absent, Warning, set to 1 if there is no CRC and 0 if there is CRC
E2profile, the MPEG-4 Audio Object Type minus 1
F4MPEG-4 Sampling Frequency Index (15 is forbidden)
G1private stream, set to 0 when encoding, ignore when decoding
H3MPEG-4 Channel Configuration (in the case of 0, the channel configuration is sent via an inband PCE)
I1originality, set to 0 when encoding, ignore when decoding
J1home, set to 0 when encoding, ignore when decoding
K1copyrighted stream, set to 0 when encoding, ignore when decoding
L1copyright start, set to 0 when encoding, ignore when decoding
M13frame length, this value must include 7 or 9 bytes of header length: FrameLength = (ProtectionAbsent == 1 ? 7 : 9) + size(AACFrame)
O11Buffer fullness
P2Number of AAC frames (RDBs) in ADTS frame minus 1, for maximum compatibility always use 1 AAC frame per ADTS frame
Q16CRC if protection absent is 0 

 

AAC decoding test sample (decoding only):

https://android.googlesource.com/platform/frameworks/wilhelm/+/master/tests/examples/slesTestDecodeAac.cpp

 

AAC encoding (offline):

https://trac.ffmpeg.org/wiki/Encode/AAC

 

AAC profile suitable for streaming:

HE-AACv1(AAC+) / HE-AACv2( enhanced-AAC+)

http://en.wikipedia.org/wiki/High_Efficiency_Advanced_Audio_Coding