Java 如何从我的Android手机麦克风捕获音频

Java 如何从我的Android手机麦克风捕获音频,java,android,audio,Java,Android,Audio,我编写了一个简单的安卓代码,从我的HTC HD Desire安卓手机中捕获音频,并将其写入SD卡上的音频文件中。我的代码编写了音频文件,但无法打开该文件。我怀疑音频文件格式不正确 这是我写的代码,并解释了它是如何工作的。我很感激任何关于如何调试我的代码的提示。多谢各位 代码 recorder类有一个方法StartRecording(),负责从麦克风捕获声音20秒 package com.audio; import android.media.AudioFormat; import androi

我编写了一个简单的安卓代码,从我的HTC HD Desire安卓手机中捕获音频,并将其写入SD卡上的音频文件中。我的代码编写了音频文件,但无法打开该文件。我怀疑音频文件格式不正确

这是我写的代码,并解释了它是如何工作的。我很感激任何关于如何调试我的代码的提示。多谢各位

代码

recorder类有一个方法StartRecording(),负责从麦克风捕获声音20秒

package com.audio;

import android.media.AudioFormat;
import android.media.AudioRecord;
import android.media.MediaRecorder.AudioSource;

public class Recorder {

    private short[] recordedAudioBuffer;
    private int bufferRead;

    public short[] startRecording() {

        int recorderBufferSize = AudioRecord.getMinBufferSize(8000,
                AudioFormat.CHANNEL_CONFIGURATION_MONO,
                AudioFormat.ENCODING_PCM_16BIT) * 2;

        AudioRecord recorder = new AudioRecord(AudioSource.DEFAULT, 8000,
                AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT,
                recorderBufferSize);

        recordedAudioBuffer = new short[recorderBufferSize];
        recorder.startRecording();

        bufferRead = recorder.read(recordedAudioBuffer, 0, recorderBufferSize);

        synchronized (this) {
            try {
                this.wait(20000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        recorder.stop();
        recorder.release();
        return recordedAudioBuffer;

    }

    public int getBufferRead() {
        return bufferRead;
    }
}
我用AudioRecorderActivity驱动录音机代码。这个类使用一个简单的FileOutputStream包在BufferedOUtputStream中,并将录音机中的音频缓冲区数组写入一个文件

    package com.audio;

import java.io.BufferedOutputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;

public class AudioRecorderActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        // create a file to dump the recording
        File f = new File(Environment.getExternalStorageDirectory()
                .getAbsolutePath() + "/test.raw");
        try {
            f.createNewFile();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        // Record audio
        Recorder recorderInstance = new Recorder();
        short[] recordedAudioBuffer = recorderInstance.startRecording();

        // Write the audio to the file
        BufferedOutputStream bufferedStreamInstance = null;

        try {
            bufferedStreamInstance = new BufferedOutputStream(
                    new FileOutputStream(f));
        } catch (FileNotFoundException e) {
            throw new IllegalStateException("Cannot Open File", e);
        }

        DataOutputStream dataOutputStreamInstance = new DataOutputStream(
                bufferedStreamInstance);

        try {
            for (int idxBuffer = 0; idxBuffer < recordedAudioBuffer.length; idxBuffer++) {
                dataOutputStreamInstance
                        .writeShort(recordedAudioBuffer[idxBuffer]);
            }
        } catch (IOException e) {
            throw new IllegalStateException(
                    "dataOutputStreamInstance.writeShort(curVal)");
        }

    }
}
package.com.audio;
导入java.io.BufferedOutputStream;
导入java.io.DataOutputStream;
导入java.io.File;
导入java.io.FileNotFoundException;
导入java.io.FileOutputStream;
导入java.io.IOException;
导入android.app.Activity;
导入android.os.Bundle;
导入android.os.Environment;
公共类录音机活动扩展活动{
/**在首次创建活动时调用*/
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//创建一个文件以转储录制
文件f=新文件(Environment.getExternalStorageDirectory()
.getAbsolutePath()+“/test.raw”);
试一试{
f、 createNewFile();
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
//录音
记录器立场=新记录器();
short[]recordedAudioBuffer=recorderInstance.startRecording();
//将音频写入文件
BufferedOutputStream bufferedStreamInstance=null;
试一试{
bufferedStreamInstance=新的BufferedOutputStream(
新的FileOutputStream(f));
}catch(filenotfounde异常){
抛出新的非法状态异常(“无法打开文件”,e);
}
DataOutputStream dataOutputStreamInstance=新DataOutputStream(
bufferedStreamInstance);
试一试{
对于(int idxBuffer=0;idxBuffer
这是我的android清单:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.audio"
      android:versionCode="1"
      android:versionName="1.0">
    <uses-sdk android:minSdkVersion="9" />

    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".AudioRecorderActivity"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

    </application>

    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
</manifest>

音频录制产生的数据由PCM样本组成。这是声音的“原始”形式。在上面的示例中,您将每秒获得8000个16位(两字节)样本。将此数据写入文件只会创建一个包含此原始数据的文件

您可能希望数据采用某种标准文件格式,其中包含某种类型的头,并可能包含某种压缩(也称为编码)


以已知格式录制音频的最简单方法是使用MediaRecorder类。MediaRecorder的文档有一个简短的示例,我不想在这里重复。

如果您不想在应用程序上实现此功能,也可以使用intent

final Intent audioIntent = new Intent(MediaStore.Audio.Media.RECORD_SOUND_ACTION);
            File audioFile = new File(Environment.getExternalStorageDirectory(), "videoTest.mp4");
            audioFileUri = Uri.fromFile(audioFile);
            audioIntent.putExtra(MediaStore.EXTRA_OUTPUT, audioFileUri);
            startActivityForResult(audioIntent, TAKE_AUDIO);
audioFileUri是SD卡中文件的uri