2011-07-04 5 views
0

を終了するために、私は次のコードを持っている:私はRavindra.wavに新しい録音を追加したいAndroidのオーディオデータ追加は

package com.android.AudioRecord_Player; 
//imports 
public class AudioRecord_Player extends Activity implements OnClickListener{ 

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 static final int RECORDER_SAMPLERATE = 44100; 
private static final int RECORDER_CHANNELS = AudioFormat.CHANNEL_IN_STEREO; 
private static final int RECORDER_AUDIO_ENCODING = AudioFormat.ENCODING_PCM_16BIT; 

// private static final int AUDIO_SAMPLE_FREQ = 44100; 
// private static final int AUDIO_BUFFER_SIZE = 200000; 

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

ImageButton start_record,pause_rec,stop_rec,play_rec,resume_rec; 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    start_record=(ImageButton)findViewById(R.id.rec); 
    pause_rec=(ImageButton)findViewById(R.id.pause); 
    resume_rec=(ImageButton)findViewById(R.id.resume); 
    stop_rec=(ImageButton)findViewById(R.id.stop); 
    play_rec=(ImageButton)findViewById(R.id.play); 

    pause_rec.setEnabled(false); 
    stop_rec.setEnabled(false); 
    play_rec.setEnabled(false); 
    resume_rec.setEnabled(false); 

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

    start_record.setOnClickListener(this); 
    pause_rec.setOnClickListener(this); 
    stop_rec.setOnClickListener(this); 
    play_rec.setOnClickListener(this); 
    resume_rec.setOnClickListener(this); 
} 

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

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

    return (file.getAbsolutePath() + "/" + "Ravindra" + 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); 

    //  recorder = new AudioRecord(MediaRecorder.AudioSource.MIC, 
//    AUDIO_SAMPLE_FREQ, 
//    AudioFormat.CHANNEL_CONFIGURATION_MONO, 
//    AudioFormat.ENCODING_PCM_16BIT, 
//    AUDIO_BUFFER_SIZE); 

    recorder.startRecording(); 

    isRecording = true; 

    recordingThread = new Thread(new Runnable() { 

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

    recordingThread.start(); 
} 

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

      recorder.stop(); 
      recorder.release(); 

      recorder = null; 
      recordingThread = null; 
    } 

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

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

    file.delete(); 
} 
private void writeAudioDataToFile(){ 
    byte data[] = new byte[bufferSize]; 
    String filename = getTempFilename(); 
    FileOutputStream os = null; 

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

    int read = 0; 

    if(os != null){ 
      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 copyWaveFile(String inFilename,String outFilename, boolean b){ 
    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,b); 
      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); 
} 

@Override 
public void onClick(View v) { 
    // TODO Auto-generated method stub 
    if(v==start_record) 
    { 
     Toast.makeText(AudioRecord_Player.this, "Now Recording...", Toast.LENGTH_LONG).show(); 
     startRecording(); 
     start_record.setEnabled(false); 
     pause_rec.setEnabled(true); 
     stop_rec.setEnabled(true); 

    } 
    else if(v==stop_rec) 
    { 
     Toast.makeText(AudioRecord_Player.this, "Recording Stopped...", Toast.LENGTH_LONG).show(); 
     stopRecording(true); 
     start_record.setEnabled(true); 
     stop_rec.setEnabled(false); 
     pause_rec.setEnabled(false); 

    } 
}  
} 

を。 trueオプションを使用してFileOutputStreamを試しましたが、正常に動作しません。

ここで私は間違っていますか?

答えて

0

私はこの問題の答えを見つけました。基本的にオーディオデータを追加するには、オーディオファイルのヘッダーを変更してからデータを変更する必要があります。私のために働いた

実際のコードは次のとおりです。

http://www.pastie.org/2165869

+0

リンクはdeaddddです – nzala

関連する問題