如何从.wav文件获取频率和时间值并保存到2D数组?

时间:2014-09-29 07:01:41

标签: android arrays frequency

我想从.wav文件中获取频率和时间并保存到2D数组中。我已经将声音录制到.wav文件中,但我不知道如何在android中获取频率值。但是使用MatLab我已经打印了频率值。

  package com.example.soundrecordingexample2;

  import android.os.Bundle;
  import android.app.Activity;
  import android.util.Log;
  import android.view.Menu;

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

 import android.media.AudioFormat;
 import android.media.AudioRecord;
 import android.media.MediaRecorder;
 import android.os.Environment;
 import android.view.View;
 import android.widget.Button;

 public class MainActivity extends Activity {
     private static final int RECORDER_BPP = 16;
     private static final String AUDIO_RECORDER_FILE_EXT_WAV = ".wav";
     private static final String AUDIO_RECORDER_FOLDER = "AudioRecorder";
     private static final String AUDIO_RECORDER_TEMP_FILE = "record_temp.raw";
     private  final int RECORDER_SAMPLERATE = 44100;
     private  final int RECORDER_CHANNELS = AudioFormat.CHANNEL_IN_STEREO;
     private  final int RECORDER_AUDIO_ENCODING = AudioFormat.ENCODING_PCM_16BIT;

     private AudioRecord recorder = null;
     private int bufferSize = 0;
     private Thread recordingThread = null;
     private boolean isRecording = false;


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

      setButtonHandlers();
      enableButtons(false);

      bufferSize = AudioRecord.getMinBufferSize(44100,
            AudioFormat.CHANNEL_IN_STEREO,
            AudioFormat.ENCODING_PCM_16BIT);
    Log.d( String.valueOf(bufferSize), "nadeeBufferaaaaaaaaaaaaaaaa");
}

 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);
 }

 private String getFilename(){
         String filepath = Environment.getExternalStorageDirectory().getPath();
         File file = new File(filepath,AUDIO_RECORDER_FOLDER);

         if(!file.exists()){
                 file.mkdirs();
         }

         return (file.getAbsolutePath() + "/" + System.currentTimeMillis() +     AUDIO_RECORDER_FILE_EXT_WAV);
 }

 private String getTempFilename(){
         String filepath = Environment.getExternalStorageDirectory().getPath();
         File file = new File(filepath,AUDIO_RECORDER_FOLDER);

         if(!file.exists()){
                 file.mkdirs();
         }

         File tempFile = new File(filepath,AUDIO_RECORDER_TEMP_FILE);

         if(tempFile.exists())
                 tempFile.delete();

         return (file.getAbsolutePath() + "/" + AUDIO_RECORDER_TEMP_FILE);
 }

 private void startRecording(){
         recorder = new AudioRecord(MediaRecorder.AudioSource.MIC,
                                         RECORDER_SAMPLERATE, RECORDER_CHANNELS,RECORDER_AUDIO_ENCODING, bufferSize);

         int i = recorder.getState();
         Log.e(String.valueOf(i), "recorder");
         if(i==1)
         {
            recorder.startRecording();
             Log.d("aaa"," equal 1");
         }
         else
         {
             Log.d("hhhh","not equal 1");
         }

         isRecording = true;

         recordingThread = new Thread(new Runnable() {

                 @Override
                 public void run() {
                         writeAudioDataToFile();
                 }
         },"AudioRecorder Thread");

         recordingThread.start();
 }

 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;

         if(null != os){
                 while(isRecording){
                         read = recorder.read(data, 0, bufferSize);

                         if(AudioRecord.ERROR_INVALID_OPERATION != read){
                                 try {
                                         os.write(data);
                                 } catch (IOException e) {
                                         e.printStackTrace();
                                 }
                         }
                 }

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

 private void stopRecording(){
         if(null != recorder){
                 isRecording = false;

                 int i = recorder.getState();
                 if(i==1)
                    recorder.stop();
                 recorder.release();

                 recorder = null;
                 recordingThread = null;
         }

         copyWaveFile(getTempFilename(),getFilename());
         deleteTempFile();
 }

 private void deleteTempFile() {
         File file = new File(getTempFilename());

         file.delete();
 }

 private void copyWaveFile(String inFilename,String outFilename){
         FileInputStream in = null;
         FileOutputStream out = null;
         long totalAudioLen = 0;
         long totalDataLen = totalAudioLen + 36;
         long longSampleRate = RECORDER_SAMPLERATE;
         int channels = 2;
         long byteRate = RECORDER_BPP * RECORDER_SAMPLERATE * channels/8;

         byte[] data = new byte[bufferSize];

         try {
                 in = new FileInputStream(inFilename);
                 out = new FileOutputStream(outFilename);
                 totalAudioLen = in.getChannel().size();
                 totalDataLen = totalAudioLen + 36;

                 AppLog.logString("File size: " + totalDataLen);

                 WriteWaveFileHeader(out, totalAudioLen, totalDataLen,
                                 longSampleRate, channels, byteRate);

                 while(in.read(data) != -1){
                         out.write(data);
                 }

                 in.close();
                 out.close();
         } catch (FileNotFoundException e) {
                 e.printStackTrace();
         } catch (IOException e) {
                 e.printStackTrace();
         }
 }

 private void WriteWaveFileHeader(
                 FileOutputStream out, long totalAudioLen,
                 long totalDataLen, long longSampleRate, int channels,
                 long byteRate) throws IOException {

         byte[] header = new byte[44];

         header[0] = 'R';  // RIFF/WAVE header
         header[1] = 'I';
         header[2] = 'F';
         header[3] = 'F';
         header[4] = (byte) (totalDataLen & 0xff);
         header[5] = (byte) ((totalDataLen >> 8) & 0xff);
         header[6] = (byte) ((totalDataLen >> 16) & 0xff);
         header[7] = (byte) ((totalDataLen >> 24) & 0xff);
         header[8] = 'W';
         header[9] = 'A';
         header[10] = 'V';
         header[11] = 'E';
         header[12] = 'f';  // 'fmt ' chunk
         header[13] = 'm';
         header[14] = 't';
         header[15] = ' ';
         header[16] = 16;  // 4 bytes: size of 'fmt ' chunk
         header[17] = 0;
         header[18] = 0;
         header[19] = 0;
         header[20] = 1;  // format = 1
         header[21] = 0;
         header[22] = (byte) channels;
         header[23] = 0;
         header[24] = (byte) (longSampleRate & 0xff);
         header[25] = (byte) ((longSampleRate >> 8) & 0xff);
         header[26] = (byte) ((longSampleRate >> 16) & 0xff);
         header[27] = (byte) ((longSampleRate >> 24) & 0xff);
         header[28] = (byte) (byteRate & 0xff);
         header[29] = (byte) ((byteRate >> 8) & 0xff);
         header[30] = (byte) ((byteRate >> 16) & 0xff);
         header[31] = (byte) ((byteRate >> 24) & 0xff);
         header[32] = (byte) (2 * 16 / 8);  // block align
         header[33] = 0;
         header[34] = RECORDER_BPP;  // bits per sample
         header[35] = 0;
         header[36] = 'd';
         header[37] = 'a';
         header[38] = 't';
         header[39] = 'a';
         header[40] = (byte) (totalAudioLen & 0xff);
         header[41] = (byte) ((totalAudioLen >> 8) & 0xff);
         header[42] = (byte) ((totalAudioLen >> 16) & 0xff);
         header[43] = (byte) ((totalAudioLen >> 24) & 0xff);

         out.write(header, 0, 44);
 }

 private View.OnClickListener btnClick = new View.OnClickListener() {
         @Override
         public void onClick(View v) {
                 switch(v.getId()){
                         case R.id.btnStart:{
                                 AppLog.logString("Start Recording");

                                 enableButtons(true);
                                 startRecording();

                                 break;
                         }
                         case R.id.btnStop:{
                                 AppLog.logString("Start Recording");

                                 enableButtons(false);
                                 stopRecording();

                                 break;
                         }
                 }
         }
 }; 



@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;
}

}

1 个答案:

答案 0 :(得分:0)

你可以通过将文件大小除以音频的长度(以秒为单位)来实现,例如,从我的库中的随机AAC编码的M4A开始:

  

文件大小5MB

     

长度183秒

     

给出:40000000(5MB)/ 183 = 218579.234973位/秒或~218kbps

Actual Bitrate: 200kbps

由于大多数音频文件都有一组已知的有效比特率级别,因此可以使用该比特率将比特率调整到适当的级别进行显示。