VoAACEncoder 是提取自AOSP 2.3项目libstagefright内的AAC编码器。
现在封装为jni库在Android项目中调用,主要用于需要将语音编码为AAC ADTS流实时发布的场景。
该库充分利用了ARM汇编指令,比之前移植的FAAC库具有更高的编码效率。
实测QSD8250处理器下,16000 采样,32k bitRate,单声道编码 cpu占用只有2%~4%
使用方法:
将libVoAACEncoder.so 放入libs/armeabi 目录
将VoAACEncoder.java 放入com.sinaapp.bashell包下
示例代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
public class MainActivity extends Activity { private AudioRecord recordInstance; private boolean isStart; private FileOutputStream fos; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); try { fos = new FileOutputStream("/sdcard/testAAC.aac"); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } new Thread(new Runnable() { @Override public void run() { VoAACEncoder vo = new VoAACEncoder(); vo.Init(44100, 32000, (short)1, (short)1);// 采样率:44100,bitRate:32k,声道数:1,编码:0.raw 1.ADTS int min = AudioRecord.getMinBufferSize(44100, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT); if(min<2048) { min=2048; } byte[] tempBuffer = new byte[2048]; recordInstance = new AudioRecord(MediaRecorder.AudioSource.MIC, 44100, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT, min); recordInstance.startRecording(); isStart = true; while (isStart) { int bufferRead = recordInstance.read(tempBuffer, 0, 2048); byte[] ret = vo.Enc(tempBuffer); if (bufferRead > 0) { System.out.println("ret:"+ret.length); try { fos.write(ret); } catch (IOException e) { e.printStackTrace(); } } } recordInstance.stop(); recordInstance.release(); recordInstance = null; vo.Uninit(); try { fos.close(); } catch (IOException e) { e.printStackTrace(); } } }).start(); } @Override protected void onDestroy() { isStart = false; super.onDestroy(); } } |
请不要忘记开启权限
1 2 |
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.RECORD_AUDIO"/> |
下载:VoAACEncoder
————2015年7月30日的分割线————-
时隔3年,撸主在整理硬盘时找到此项目,不少朋友感兴趣,也没什么好保留的,就开源吧。
https://github.com/illuspas/VoAACEncoder
原创文章,转载请注明: 转载自贝壳博客
本文链接地址: VoAACEncoder
这个AAC编码器在低端机子上用着还行,在高端机子上会有各种问题,比如声音会加快,声音会断断续续等
是的 声音加快的问题我也发现了 估计在采样的值上还需要调整
过段时间把这部分jni代码发出来一起改进下
这个编码后的数据能发布到red5吗
按照RTMP协议发布AAC流 是可以的
你好,这个AAC编码器在部份机子上声音会加快,声音会断断续续,这些问题还存在吗?
之前是对AAC编码规范不熟悉
你将采样率改为44100,每次读取2048字节进行编码
你好 我试验了下 采样率441000 声道为1的情况下速率正常 但一旦改成双声道声音就会加快 请问这和编码部分里的init设置有关系么 可以公开下代码看下么?或者请教一下声道的设置 怎样使声道设置可以变化?
还有个疑问 为什么读取2048个字节?
bufferSizeInBytes = AudioRecord.getMinBufferSize(sampleRateInHz, channelConfig, audioFormat);
byte[] tempBuffer = new byte[bufferSizeInBytes];
int bufferRead = recordInstance.read(tempBuffer, 0, bufferSizeInBytes);
如果读取从audiorecord获得的buffersize大小,也会有加速的现象。
因为AAC编码器对每一个帧的需求就是1024个采样,一个采样16bit 就是2048个字节了.
你好,我是新手,想请教一下,怎么用这个将pcm转成aac呢?
int bufferRead = recordInstance.read(tempBuffer, 0, 2048);//这句就是从声卡采集PCM
byte[] ret = vo.Enc(tempBuffer);//这句就是编码成AAC
录制出来的文件,在android可以播放,在浏览器播放不了
我想问下博主,采样8k单通道编出来的aac在设备上播放速率较慢,然后44k的又快了,这是为什么,怎么解决?
感谢分享~
你好,请问支持8K采样率的pcm音频流转码吗?
请看voaac的文档,应该是支持的,该库我也很久没有使用了
你好我这边是实时获取的流的大小是17640byte,直接aac转码的话会出现时间减少、音频加快的现象,我想问一下怎么做能每次转2048byte呢?
website with tiktok likes generator
Maulydia musically hack 2019 had identified Tik Tok Time Hacks upon Tik Tok but she only discovered the effect of Tik Tok on someone’s social existence when she saw the effect on her preteen cousin.