1。用android进行录音上传到服务器,录音往往有这几种: a. 用MediaRecorder进行录音,示例代码如下:
MediaRecorder recorder = new MediaRecorder();
* recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
* recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
* recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
* recorder.setOutputFile(PATH_NAME);
* recorder.prepare();
* recorder.start(); // Recording is now started
* ...
* recorder.stop();
* recorder.reset(); // You can reuse the object by going back to setAudioSource() step
* recorder.release(); /
b.用AudioRecord的进行录音。示例代码如下:(代码片段)
int bufferSize = AudioRecord.getMinBufferSize(16000,
AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT);
mBuffer = new short[bufferSize];
mRecorder = new AudioRecord(MediaRecorder.AudioSource.MIC, 16000, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT, bufferSize);
mRecorder.startRecording();
new Thread(new Runnable() {
@Override
public void run() {
DataOutputStream output = null;
int volum = 0;
try {
output = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(file)));
while (isRecordering) {
int readSize = mRecorder.read(mBuffer, 0, mBuffer.length);
for (int i = 0; i < readSize; i++) {
output.writeShort(mBuffer[i]);
}
}
} catch (IOException e) {
} finally {
if (output != null) {
try {
output.flush();
} catch (IOException e) {
} finally {
try {
output.close();
} catch (IOException e) {
}
}
}
}
}
}).start();
用a进行录音可以直接生成音频文件,用b进行录音可以手动对流进行一些处理,比如获得音量,(在网上可搜到)
获得音频后需要支撑iphone播放所以要转换为mp3格式。我选择了第二种录音方式,生成后缀为raw文件然后用lame进行转换,(转换成功)
lame:
因为lame用c写的android需要调用就需要写jni,并且进行编译。
首先,编写本地方法:
如下
public native void initEncoder(int numChannels, int sampleRate, int bitRate, int mode, int quality);
public native void destroyEncoder();
public native int encodeFile(String sourcePath, String targetPath);
编写三个本地方法后用javah来生成头文件,并且编写c文件。在c文件中调用lame中的相对应的方法(需要看lame)
然后编写android.mk进行编译,自己搜。(或者用别人的.so文件,但是必须知道对方本地方法的名字和所在的包,然后在自己的工程里建对应的包和类名)
因为在生成的h头文件中的方法名是以本地方法的包名为名的。