android aac格式,android aac文件格式音频的录制和播放

封装的工具类:

package com.example.voaactest;

import java.io.File;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

import com.sinaapp.bashell.VoAACEncoder;

import android.R.integer;

import android.media.AudioFormat;

import android.media.AudioRecord;

import android.media.MediaRecorder;

import android.os.Handler;

import android.os.SystemClock;

import android.util.Log;

/**

* aac音频处理

*

* @author liueg

*

*/

public class VoAACRecordManager {

private final String TAG = "VoAAVRecordManager";

private AudioRecord mAudioRecord;

private File file;

private int SAMPLERATE = 8000;// 设置采样率

private int bitRate = 16000;// 设置bit率

private Handler mHandler;

private long startTime;

private long endTime;

private boolean isRecodering;

private int SPACE = 300;// 间隔取样时间

private FileOutputStream fos;

private int r;

private int v;

public VoAACRecordManager() {

}

public VoAACRecordManager(File file) {

File parentFile = file.getParentFile();

if (!parentFile.exists()) {

parentFile.mkdirs();

}

if (!file.exists()) {

try {

file.createNewFile();

} catch (IOException e) {

e.printStackTrace();

}

}

this.file = file;

}

/**

* 开始录音,使用aac格式

*/

public void startRecord() {

new Thread(new Runnable() {

@Override

public void run() {

try {

fos = new FileOutputStream(file);

} catch (FileNotFoundException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

VoAACEncoder vo = new VoAACEncoder();

int min = AudioRecord.getMinBufferSize(SAMPLERATE,// 得到一个需要的最小录音缓存大小,SAMPLERATE:采样率

AudioFormat.CHANNEL_IN_MONO,// 声道设置,单声道

AudioFormat.ENCODING_PCM_16BIT);// 编码制式

vo.Init(SAMPLERATE, 16000, (short) 1, (short) 1);// 采样率:8000,bitRate:16000,声道数:1,编码:0.raw

// 1.ADTS

if (min < 2048) {

min = 2048;

}

byte[] temp = new byte[2048];

mAudioRecord = new AudioRecord(

MediaRecorder.AudioSource.MIC,// 麦克风音源

SAMPLERATE, AudioFormat.CHANNEL_IN_DEFAULT,

AudioFormat.ENCODING_PCM_16BIT, min);

mAudioRecord.startRecording();

isRecodering = true;

startTime = System.currentTimeMillis();

updateMicStatus();

while (isRecodering) {

r = mAudioRecord.read(temp, 0, min);

if (r > 0) {

v = 0;

for (int i = 0; i < temp.length; i++) {

v += temp[i] * temp[i];

}

byte[] ret = vo.Enc(temp);

try {

fos.write(ret);

} catch (IOException e) {

// TODO Auto-generated catch block

isRecodering = false;

e.printStackTrace();

}

}

}

mAudioRecord.stop();

mAudioRecord.release();

mAudioRecord = null;

vo.Uninit();

try {

fos.close();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}).start();

}

private void updateMicStatus() {

new Thread(new Runnable() {

@Override

public void run() {

// TODO Auto-generated method stub

if (mHandler != null) {

while (isRecodering) {

int value = (int) (Math

.abs((int) (v / (float) r) / 100) >> 1);// 得到即时声音的振幅(测试的是0-30之间)

mHandler.sendEmptyMessage(value);

SystemClock.sleep(SPACE);

}

}

}

}).start();

}

/**

* 停止录音返回录音时长

*

* @return

*/

public long stopRecord() {

if (mAudioRecord == null)

return 0L;

isRecodering = false;

endTime = System.currentTimeMillis();

return endTime = startTime;

}

public File getFile() {

return file;

}

public void setFile(File file) {

this.file = file;

}

public Handler getmHandler() {

return mHandler;

}

public void setmHandler(Handler mHandler) {

this.mHandler = mHandler;

}

}

在activity中的使用: package com.example.voaactest; import java.io.File; import java.io.IOException; import android.app.Activity; import android.media.MediaPlayer; import android.media.MediaRecorder; import android.os.Bundle; import android.os.Environment; import android.os.Handler; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; public class MainActivity extends Activity { private String FileName = null;   private Button startRecord; private Button stopRecord; private Button startPlay; private Button stopPlay; private TextView tv_voice; private MediaPlayer mPlayer = null;  private MediaRecorder mRecorder = null; private String mRecordFileName; VoAACRecordManager manager; private Handler handler = new Handler(){ public void handleMessage(android.os.Message msg) { int v =msg.what; tv_voice.setText("voice:"+v); }; }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); manager = new VoAACRecordManager(); manager.setmHandler(handler);        mRecordFileName = Environment.getExternalStorageDirectory() .toString() + "/testAAC.aac";        File file = new File(mRecordFileName);        manager.setFile(file);        tv_voice = (TextView) findViewById(R.id.tv_voice); startRecord = (Button)findViewById(R.id.startRecord);  startRecord.setOnClickListener(new startRecordListener());   stopRecord = (Button)findViewById(R.id.stopRecord);   stopRecord.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub manager.stopRecord(); } });  startPlay = (Button)findViewById(R.id.startPlay);     startPlay.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub mPlayer = new MediaPlayer(); try { mPlayer.setDataSource(mRecordFileName); mPlayer.prepare(); mPlayer.start(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } });     stopPlay = (Button)findViewById(R.id.stopPlay);     stopPlay.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub mPlayer.release(); mPlayer = null; } } );   } class startRecordListener implements OnClickListener{ @Override public void onClick(View v) { // TODO Auto-generated method stub manager.startRecord(); //mRecorder = new MediaRecorder();   //mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); //mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); //mRecorder.setOutputFile(FileName);   //mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); //try { //mRecorder.prepare(); //}  catch (Exception e) { //e.printStackTrace(); //}  //mRecorder.start(); }   }     }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值