2014-09-29 21 views
0

我想從.wav文件獲取頻率和時間並保存到二維數組中。我已經將聲音錄製到.wav文件中,但我不知道如何在android中獲取頻率值。但是使用MatLab我已經打印出頻率值。如何從.wav文件獲取頻率和時間值並保存到二維數組中?

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

}

回答

0

您可以通過將文件大小在秒的音頻的長度,例如,在我的圖書館編碼M4A隨機AAC做到這一點:

文件大小5MB

持續183秒

其中給出:40000000(5MB)/ 183 = 218579.234973位/秒或〜218kbps

Actual Bitrate: 200kbps 

由於大多數的音頻文件都有一組已知的有效比特率的水平,你可以用它來一步的比特率用於顯示的適當水平。

+0

謝謝你給我答案。但是,我想在每個毫秒內獲得我錄製文件的頻率。我將如何獲得頻率。 – nade 2014-09-29 07:40:14

相關問題