如何录制不同频率的音频?

时间:2017-04-20 18:55:24

标签: android audio audio-processing

我正在尝试以不同的频率录制音频。虽然我一直试图通过以下代码实现它,但它不起作用(应用程序意外停止)。

//importing packages    
        import android.app.Activity;
        import android.media.AudioFormat;
        import android.media.AudioRecord;
        import android.media.MediaRecorder;
        import android.os.Bundle;
        import android.os.Environment;
        import android.view.KeyEvent;
        import android.view.View;
        import android.widget.Button;

        import java.io.FileNotFoundException;
        import java.io.FileOutputStream;
        import java.io.IOException;

    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;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            setButtonHandlers();//handling buttons
            enableButtons(false);

            int bufferSize = AudioRecord.getMinBufferSize(RECORDER_SAMPLERATE,
                    RECORDER_CHANNELS, RECORDER_AUDIO_ENCODING);
        }
        private void setButtonHandlers() {
            ((Button) findViewById(R.id.Start)).setOnClickListener(btnClick);
            ((Button) findViewById(R.id.Stop)).setOnClickListener(btnClick);
        }

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

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

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

        public void Record()
        {
            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();
                }
            }, "AudioRecorder Thread");
            recordingThread.start();

        }
        private byte[] short2byte(short[] sData) {
            int shortArrsize = sData.length;
            byte[] bytes = new byte[shortArrsize * 2];
            for (int i = 0; i < shortArrsize; i++) {
                bytes[i * 2] = (byte) (sData[i] & 0x00FF);
                bytes[(i * 2) + 1] = (byte) (sData[i] >> 8);
                sData[i] = 0;
            }
            return bytes;

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

            String filePath = Environment.getExternalStorageDirectory().getAbsolutePath()+"/myrec.pcm";
            short sData[] = new short[BufferElements2Rec];

            FileOutputStream os = null;
            try {
                os = new FileOutputStream(filePath);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }

            while (isRecording) {
               // gets the voice output from microphone to byte format

                recorder.read(sData, 0, BufferElements2Rec);
                System.out.println("Short wirting to file" + sData.toString());
                try {
                   // // writes the data to file from buffer
                   // // stores the voice buffer
                    byte bData[] = short2byte(sData);
                    os.write(bData, 0, BufferElements2Rec * BytesPerElement);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            try {
                os.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        public void Record_Stop()
        {
            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.Start: {
                        enableButtons(true);
                        Record();
                        break;
                    }
                    case R.id.Stop: {
                        enableButtons(false);
                        Record_Stop();
                        break;
                    }
                }
            }
        };

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

只要按下开始按钮,应用程序就会意外停止。

  

com.example.kaushal.learningfft E / AndroidRuntime:FATAL EXCEPTION:   main流程:com.example.kaushal.learningfft,PID:4705   java.lang.IllegalStateException:调用startRecording()   未初始化的AudioRecord。在   android.media.AudioRecord.startRecording(AudioRecord.java:97 6)at   com.example.kaushal.learningfft.MainActivity.Record(MainActi vity.java:57)   在   com.example.kaushal.learningfft.MainActivity $ 2.onClick(皮埃尔ctivity.java:126)   在android.view.View.performClick(View.java:5610)at   android.view.View $ PerformClick.run(View.java:22265)at   android.os.Handler.handleCallback(Handler.java:751)at   android.os.Handler.dispatchMessage(Handler.java:95)at   android.os.Looper.loop(Looper.java:154)   android.app.ActivityThread.main(ActivityThread.java:6077)at   java.lang.reflect.Method.invoke(Native Method)at   com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(Z ygoteInit.java:865)   在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)

0 个答案:

没有答案