[工作记录] 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(with a charge once and for all, $1000-$1500 ) but usually no fees, exept that when end user products are(/contain?) encoders/decoders.
OpenSL ES 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_HEADATENDevent 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.
OpenSL ES 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):
| Letter | Length (bits) | Description |
|---|---|---|
| A | 12 | syncword 0xFFF, all bits must be 1 |
| B | 1 | MPEG Version: 0 for MPEG-4, 1 for MPEG-2 |
| C | 2 | Layer: always 0 |
| D | 1 | protection absent, Warning, set to 1 if there is no CRC and 0 if there is CRC |
| E | 2 | profile, the MPEG-4 Audio Object Type minus 1 |
| F | 4 | MPEG-4 Sampling Frequency Index (15 is forbidden) |
| G | 1 | private stream, set to 0 when encoding, ignore when decoding |
| H | 3 | MPEG-4 Channel Configuration (in the case of 0, the channel configuration is sent via an inband PCE) |
| I | 1 | originality, set to 0 when encoding, ignore when decoding |
| J | 1 | home, set to 0 when encoding, ignore when decoding |
| K | 1 | copyrighted stream, set to 0 when encoding, ignore when decoding |
| L | 1 | copyright start, set to 0 when encoding, ignore when decoding |
| M | 13 | frame length, this value must include 7 or 9 bytes of header length: FrameLength = (ProtectionAbsent == 1 ? 7 : 9) + size(AACFrame) |
| O | 11 | Buffer fullness |
| P | 2 | Number of AAC frames (RDBs) in ADTS frame minus 1, for maximum compatibility always use 1 AAC frame per ADTS frame |
| Q | 16 | CRC if protection absent is 0 |
AAC decoding test sample (decoding only):
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
[工作记录] Android OpenSL ES: references & AAC related的更多相关文章
- [工作记录] Android OpenGL ES: non-square texture - continue
previous: [工作记录] Android OpenGL ES 2.0: square texture not supported on some device recently I found ...
- [工作记录] Android OpenGL ES 2.0: square texture not supported on some device
npot texture: non-power-of-two texture.rectangle texture: non-square (height != wdith) 在测试Samsumg Ga ...
- Android OpenSL ES 开发:Android OpenSL 介绍和开发流程说明
一.Android OpenSL ES 介绍 OpenSL ES (Open Sound Library for Embedded Systems)是无授权费.跨平台.针对嵌入式系统精心优化的硬件音频 ...
- Android OpenSL ES 开发:Android OpenSL 录制 PCM 音频数据
一.实现说明 OpenSL ES的录音要比播放简单一些,在创建好引擎后,再创建好录音接口基本就可以录音了.在这里我们做的是流式录音,所以需要用至少2个buffer来缓存录制好的PCM数据,这里我们可以 ...
- Android OpenSL ES 开发:OpenSL ES利用SoundTouch实现PCM音频的变速和变调
缘由 OpenSL ES 学习到现在已经知道 OpenSL ES 不仅能播放和录制PCM音频数据,还能改变声音大小.设置左声道或右声道播放.还能变速播放,可谓是播放音频的王者.但是变速有一点不好的就是 ...
- Android OpenSL ES 开发:使用 OpenSL 播放 PCM 数据
OpenSL ES 是基于NDK也就是c语言的底层开发音频的公开API,通过使用它能够做到标准化, 高性能,低响应时间的音频功能实现方法. 这次是使用OpenSL ES来做一个音乐播放器,它能够播放m ...
- OpenSL ES: OpenSL ES 简介
1. OpenSL ES 是什么 OpenSL ES (Open Sound Library for Embedded Systems)是无授权费.跨平台.针对嵌入式系统精心优化的硬件音频加速API. ...
- Android音视频学习第7章:使用OpenSL ES进行音频解码
/* * *这里使用了transcode-1.1.7对wav文件进行解码.然后使用opensl es进行播放 * */ //用到的变量和结构体 WAV wav; //wav文件指针 SLObjectI ...
- Android 音视频深入 十四 FFmpeg与OpenSL ES 播放mp3音乐,能暂停(附源码下载)
项目地址https://github.com/979451341/FFmpegOpenslES 这次说的是FFmpeg解码mp3,数据给OpenSL ES播放,并且能够暂停. 1.创建引擎 slCre ...
随机推荐
- htaccess rewrites重写规则实例
1..htaccess rewrite实例开始部分 Options +FollowSymLinksRewriteEngine OnRewriteBase / 2.把不带www的域名地址重定向到带www ...
- 2)Java中的==和equals
Java中的==和equals 1.如果比较对象是值变量:只用== 2.如果比较对象是引用型变量: ==:比较两个引用是不是指向同一个对象实例. equals: ...
- 【easyui】--combobox--赋值和获取选中的值
//初始化下拉选框 $('#communityIdDiv').combobox({ url:basepath+"pushController/queryCommonityName" ...
- Learning Scrapy笔记(五)- Scrapy登录网站
摘要:介绍了使用Scrapy登录简单网站的流程,不涉及验证码破解 简单登录 很多时候,你都会发现你需要爬取数据的网站都有一个登录机制,大多数情况下,都要求你输入正确的用户名和密码.现在就模拟这种情况, ...
- STM32F4_TIM输出PWM波形(可调频率、占空比)
Ⅰ.概述 上一篇文章关于STM32基本的计数原理明白之后,该文章是在其基础上进行拓展,讲述关于STM32比较输出的功能,以输出PWM波形为实例来讲述. 提供实例工程中比较实用的函数:只需要调用该函数, ...
- 第十八章 数据访问(In .net4.5) 之 I/O操作
1. 概述 本章内容包括 文件操作.流操作.读写网络数据 以及 异步I/O操作. 2. 主要内容 2.1 文件操作 ① 使用 Drive 和 DriveInfo 访问磁盘信息. DriveInfo[] ...
- LinearRegression
利用python实现简单的线性回归对房屋面积进行预测 # -*-coding:utf-8 -*- ''' Created on 2016年12月15日 @author: lpworkdstudy '' ...
- [terry笔记]RMAN综合学习之备份
rman是最经济实惠的oracle备份工具,在这里做一个rman的整体学习. 文章中大多是rman命令的语法,还是最好做做实验,以便印象深刻,因为大多数数据库的备份就是按时跑脚本,恢复也不是经常能遇到 ...
- Python脚本控制的WebDriver 常用操作 <三> 浏览器最大化
下面将模拟执行一个控制浏览器最大化的操作 测试用例场景 当我们在测试中使用一些基于图像和坐标的辅助测试工具时,我们就会需要使浏览器在每次测试时保存最大化,以便在同一分辨率下进行图像比对和坐标点选. 举 ...
- ubuntu miss tool bar
reson: unity exception 1. open terminal: /usr/bin/**terminal** 2. run command on terminal: gsetting ...