为audioRecord实现getMaxAmplitude [英] Implement getMaxAmplitude for audioRecord

查看:413
本文介绍了为audioRecord实现getMaxAmplitude的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在我的应用程序中使用audioRecord而不是mediarecorder,但工作正常,但是我的逻辑高度依赖于最大振幅,使用音频记录确实很难获得最大振幅,这是读取缓冲区时使用的声音

I am using audioRecord instead of mediarecorder in my app it's working fine but I have a logic that depends highly on the maxamplitude which is really hard to obtain using the audiorecord here is what I am using when reading the buffer

 private void writeAudioDataToFile(){
        byte data[] = new byte[bufferSize];

        String filename = getTempFilename();
        FileOutputStream os = null;

        try {
            os = new FileOutputStream(filename);
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        int read = 0;
        max=0;
        if(null != os){
            while(isRecording){
                read = recorder.read(buffer, 0, bufferSize);
                int ab = (buffer[0] & 0xff) << 8 | buffer[1];
                amplitude = Math.abs(ab);

            if(amplitude>0&&amplitude<25000)
                isSilence=true;         
            else
                isSilence=false;

                //System.out.println(">>>>>>>>>>>"+amplitude);
                if(AudioRecord.ERROR_INVALID_OPERATION != read){
                    try {
                        os.write(buffer);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }

            try {
                os.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

但这不起作用对我来说,因为值变化很快,所以我需要为audioRecord实现类似getMaxAmplitude()的方法。

but this doesn't work for me as the value changes real fast I need to implement something like getMaxAmplitude() for audioRecord.

推荐答案

还有更多...然后将最大点数输出到在excel中可读的文件。 (我本人是在解决此问题的,所以时机很偶然。)

This does what you want and more... then it outputs the max points to a file which is readable in excel. (I was solving this problem myself, so timing is fortuitous.)

package com.example.audiorecord;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Calendar;

import android.app.Activity;
import android.media.AudioFormat;
import android.media.AudioRecord;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.View;
import android.widget.Button;


public class MainActivity extends Activity {
        private static final int RECORDER_SAMPLERATE = 44100;
        private static final int RECORDER_CHANNELS = AudioFormat.CHANNEL_IN_MONO;
        private static final int RECORDER_AUDIO_ENCODING = AudioFormat.ENCODING_PCM_16BIT;
        private AudioRecord recorder = null;
        private Thread recordingThread = null;
        private boolean isRecording = false;
        private String floatString = "";

        Calendar c = Calendar.getInstance();
        SimpleDateFormat df = new SimpleDateFormat("ddMMMyyyy_HHmmss");
        String formattedDate = df.format(c.getTime());

        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);

            setButtonHandlers();
            enableButtons(false);

            int bufferSize = AudioRecord.getMinBufferSize(RECORDER_SAMPLERATE,
                    RECORDER_CHANNELS, RECORDER_AUDIO_ENCODING); 
        }

        private void setButtonHandlers() {
            ((Button) findViewById(R.id.btnStart)).setOnClickListener(btnClick);
            ((Button) findViewById(R.id.btnStop)).setOnClickListener(btnClick);
        }

        private void enableButton(int id, boolean isEnable) {
            ((Button) findViewById(id)).setEnabled(isEnable);
        }

        private void enableButtons(boolean isRecording) {
            enableButton(R.id.btnStart, !isRecording);
            enableButton(R.id.btnStop, isRecording);
        }

        int BufferElements2Rec = 1024; // want to play 2048 (2K) since 2 bytes we use only 1024
        int BytesPerElement = 2; // 2 bytes in 16bit format

        private void startRecording() {
            final File logFile = new File("sdcard/log_"+formattedDate+".txt");
               if (!logFile.exists())
               {
                  try
                  {
                     logFile.createNewFile();
                  } 
                  catch (IOException e)
                  {
                     // TODO Auto-generated catch block
                     e.printStackTrace();
                  }
               }

            recorder = new AudioRecord(MediaRecorder.AudioSource.MIC,
                    RECORDER_SAMPLERATE, RECORDER_CHANNELS,
                    RECORDER_AUDIO_ENCODING, BufferElements2Rec * BytesPerElement);

            recorder.startRecording();
            isRecording = true;
            recordingThread = new Thread(new Runnable() {
                public void run() {
                    writeAudioDataToFile(logFile);
                }
            }, "AudioRecorder Thread");
            recordingThread.start();
        }


        private void writeAudioDataToFile(File logFile) {
            // Write the output audio in byte

            short sData[] = new short[BufferElements2Rec];
            while (isRecording) {
                // gets the voice output from microphone to byte format

                recorder.read(sData, 0, BufferElements2Rec);
                String sDataString = "";
                double sDataMax = 0;
                for(int i=0; i<sData.length; i++){
                    if(Math.abs(sData[i])>=sDataMax){sDataMax=Math.abs(sData[i]);};
                    sDataString += "\n" + sDataMax;

                }

               try
               {
                  //BufferedWriter for performance, true to set append to file flag
                  BufferedWriter buf = new BufferedWriter(new FileWriter(logFile, true)); 
                  buf.append(sDataString);
                  buf.newLine();
                  buf.close();
               }
               catch (IOException e)
               {
                  // TODO Auto-generated catch block
                  e.printStackTrace();
               }
        }
        }
        private void stopRecording() {
            // stops the recording activity
            if (null != recorder) {
                isRecording = false;
                recorder.stop();
                recorder.release();
                recorder = null;
                recordingThread = null;
            }
        }

        private View.OnClickListener btnClick = new View.OnClickListener() {
            public void onClick(View v) {
                switch (v.getId()) {
                case R.id.btnStart: {
                    enableButtons(true);
                    startRecording();
                    break;
                }
                case R.id.btnStop: {
                    enableButtons(false);
                    stopRecording();
                    break;
                }
                }
            }
        };

        @Override
        public boolean onKeyDown(int keyCode, KeyEvent event) {
            if (keyCode == KeyEvent.KEYCODE_BACK) {
                finish();
            }
            return super.onKeyDown(keyCode, event);
        }



    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

}

这篇关于为audioRecord实现getMaxAmplitude的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆