下面是相关参数的代码段。看清楚了,是在Android 2.2 SDK 包去实现支持 AAC 音频录制的。在Android 2.3.3 包下,这段代码是可以写成这样的:[mw_shl_code=java,true]mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);[/mw_shl_code]但是要兼容这个2.2系统的问题!!!![mw_shl_code=java,true]/* ①Initial:实例化MediaRecorder对象 */ mMediaRecorder = new MediaRecorder(); /* ②setAudioSource/setVedioSource */ mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);// 设置麦克风 /* * ②设置输出文件的格式:THREE_GPP/MPEG-4/RAW_AMR/Default * THREE_GPP(3gp格式,H263视频 * /ARM音频编码)、MPEG-4、RAW_AMR(只支持音频且音频编码要求为AMR_NB) */ mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT); /* ②设置音频文件的编码:AAC/AMR_NB/AMR_MB/Default */ mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); /* ②设置输出文件的路径 */ try { mRecAudioFile = File.createTempFile(strTempFile, ".mp3", mRecAudioPath); } catch (Exception e) { e.printStackTrace(); }[/mw_shl_code]
我们是于2013年成立的成都网站建设公司,提供网站建设,电商网站设计开发,外贸网站制作,响应式网页设计,小程序定制开发、等服务。为客户创造有价值的品牌营销体验,让互联网提升企业的竞争力!
这几天在 android上的音频项目,顺便把用到的aac编解码库封装了一下,有需要的可以从上面下载。当然是没有本事自己写编解码器的,还是用FFmpeg + FDK_aac来做。下面介绍一下其java接口的使用。java库见libaac.jar文件,把libaac.jar加到 libs目录下,把libaac.so加到 libs/armeabi目录即可使用。
AAC编码:
(1) 创建一个Encoder对象作为成员变量
aac.Encoder encoder;
(2) 初始化它
encoder = new aac.Encoder();
if(! encoder.open(11025, 1))
{
Log.d("mylog", "failed to open encoder !\n");
encoder = null;
}
这里要指定输入音频源(PCM格式)的sampe_rate和channel个数,如果为CHANNEL_OUT_MONO,则channel=1,否则为2。 sample_rate一般设置为11025,因为手机性能有限,设置太高的话也处理不过来,而且处理人声的话11025也是足够了。
(3) 编码
把接收到PCM数据交给encoder来处理即可,要求输入源为ENCODING_PCM_16BIT,即每个sample是16BIT的。这个encoder对象内有2个缓冲区:inbuf, outbuf。显然,在编码时,inbuf就是用于存储接收到的PCM数据,outbuf就是存编码后得到的数据。
int out_size = encoder.encode(in_size);
其返回值out_size,表示在outbuf里的有效数据长度。此时可以把outbuf里的aac数据通过网络发送或其他用途。
其中,用户需要知道encoder每次处理多长的数据,即一个frame的大小。对于单声道MONO来说,每次应该输入2048byte的数据。对于双声道STEREO来说,应该输入4096byte的数据。下面这一行可以根据声道数来计算输入的frame的大小:
int in_size = aac.Encoder.frameSize(1);
AAC解码:
(1) 创建一个Decoder对象作为成员变量
aac.Decoder decoder;
(2) 初始化
decoder = new aac.Decoder();
if( ! decoder.open())
{
Log.d("mylog", "failed to open decoder !\n");
decoder = null;
}
(3) 解码
Decoder对象也有inbuf和outbuf,把待解码的aac frame放到inbuf里
int pcm_size = decoder.decode(aac_size);
解得到数据在outbuf里,其有效长度为上述函数的返回值pcm_size,此时可以把outbuf里的PCM数据取出来播放或其他用途。
刚好了解,可以实现的,通过java代码调用ffmpeg去转换,是ok的, 但是ffmpeg没有对应java的api(我是没找到),我的实现方式去通过java代码调用命令行,来完成转换的.
楼主把后缀改为.mp4试试。因为如:mp4 = h264 + aacmp4只是个外壳格式,所以aac后缀opencore是不能识别的。