android - Android中的一个简单的实时麦克风

标签 android audio real-time

我从Pro Android media这本书中获得了帮助。

这是代码:

public class MicMeter extends Activity implements OnClickListener {


RecordAudio recordTask;
int blocksize = 256;
int frequency = 8000;
int channelConfig = AudioFormat.CHANNEL_CONFIGURATION_MONO;
int audioEncoding = AudioFormat.ENCODING_PCM_16BIT;
TextView txt;
Button start;
boolean started = false;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_mic_meter);
    start = (Button)findViewById(R.id.button1);
    txt = (TextView)findViewById(R.id.textView1);

    start.setOnClickListener(this);


}


private class RecordAudio extends AsyncTask <Void,double[],Void>{

    @Override
    protected Void doInBackground(Void... params) {
        try{
        int bufferSize = AudioRecord.getMinBufferSize(frequency,channelConfig,audioEncoding);
        AudioRecord audioRecord = new AudioRecord( MediaRecorder.AudioSource.MIC, frequency, channelConfig, audioEncoding, bufferSize);

        short[] buffer = new short[blocksize];
        double[] meter = new double[blocksize];

        audioRecord.startRecording();

        while(started){
            int bufferReadResult = audioRecord.read(buffer, 0, blocksize);

            for (int i = 0; i < blocksize && i < bufferReadResult; i++) { 
                meter[i] = (double) buffer[i] / 32768.0; // signed 16 bit
            }
            publishProgress(meter);
        }
        audioRecord.stop();

    }catch (Throwable t) {
        Log.e("AudioRecord","RecordingFail");
    }

        return null;
    }

    @Override
    protected void onProgressUpdate(double[]... meter) {

        for(int i = 0 ; i < meter[0].length ; i++){
            double[] helper = meter[i];
            txt.setText(Double.toString(helper));
        }

    }


}


@Override
public void onClick(View v) {
    // TODO Auto-generated method stub

    if(started){
        recordTask.cancel(true);
    }else{
        started = true;
        recordTask = new RecordAudio();
        recordTask.execute();

    }
}

}

当我按下按钮时。
它显示255.0,然后没有响应...
有什么办法可以解决吗?
关于这个有更好的版本吗?

谢谢

最佳答案

for(int i = 0 ; i < meter[0].length ; i++){
    double helper = i;
    txt.setText(Double.toString(helper));

setText覆盖旧值。因此,只会显示最后一个通话。最后一次调用将其设置为助手,该助手将始终为meter [0] .length。由于这是一个固定数字,因此不会改变。

关于android - Android中的一个简单的实时麦克风,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15891773/

相关文章:

java - 建议非常快(微秒)的 java 日志记录?

javascript - 如何通过 jQuery 获取时间服务器的实时时间

ios - 如何在iOS中调整音频平衡

c# - 如何以编程方式设置 Windows 音频平衡级别?

android - 错误 : Program type already present: android. support.v4.app

java - 如何在 Android 中实现 sqlite3 虚拟表模块?

linux - 如何编写符合 ALSA 的虚拟设备驱动程序?

iphone - 通过 UDP 从服务器向 iPhone 发送大量实时处理的数据

android - 为什么Android 8.1看不到资源?

android - 当我第 22 次尝试生成音调时出现未初始化的 AudioTrack 异常