录制音乐应用的声音

时间:2014-05-01 13:25:45

标签: java android audio

我正在开发android音乐钢琴应用程序。其中我使用soundpool播放音频,但我如何录制声音,以便用户可以唱歌并录制自己的声音以及录制音乐节拍

1 个答案:

答案 0 :(得分:0)

以下是两个用于录制和其他用于播放的功能

private void startRecord(){
      File file = new File(Environment.getExternalStorageDirectory(), "test.pcm"); 

      try {
       file.createNewFile();
       recording=true;
       OutputStream outputStream = new FileOutputStream(file);
       BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(outputStream);
       DataOutputStream dataOutputStream = new DataOutputStream(bufferedOutputStream);

       int minBufferSize = AudioRecord.getMinBufferSize(SmpleRate, 
         AudioFormat.CHANNEL_IN_MONO, 
         AudioFormat.ENCODING_PCM_16BIT);

       short[] audioData = new short[minBufferSize];

       AudioRecord audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC,
               SmpleRate,
         AudioFormat.CHANNEL_IN_MONO,
         AudioFormat.ENCODING_PCM_16BIT,
         minBufferSize);

       AudioManager audio=(AudioManager)this.getSystemService(Context.AUDIO_SERVICE);
      audio.setMicrophoneMute(true);
       //int sessionId=audioRecord.getAudioSessionId();
     //  NoiseSuppressor.create(sessionId);
       audioRecord.startRecording();

       while(recording){
        int numberOfShort = audioRecord.read(audioData, 0, minBufferSize);
        for(int i = 0; i < numberOfShort; i++){
         dataOutputStream.writeShort(audioData[i]);
        }
       }

       audioRecord.stop();
       dataOutputStream.close();

      } catch (IOException e) {
       e.printStackTrace();
      }

     }


 void playRecord(){

  File file = new File(Environment.getExternalStorageDirectory(), "test.pcm");

        int shortSizeInBytes = Short.SIZE/Byte.SIZE;

  int bufferSizeInBytes = (int)(file.length()/shortSizeInBytes);
  short[] audioData = new short[bufferSizeInBytes];

  try {
   InputStream inputStream = new FileInputStream(file);
   BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
   DataInputStream dataInputStream = new DataInputStream(bufferedInputStream);

   int i = 0;
   while(dataInputStream.available() > 0){
    audioData[i] = dataInputStream.readShort();
    i++;
   }

   dataInputStream.close();

   AudioTrack audioTrack = new AudioTrack(
     AudioManager.STREAM_MUSIC,
     SmpleRate,
     AudioFormat.CHANNEL_OUT_MONO,
     AudioFormat.ENCODING_PCM_16BIT,
     bufferSizeInBytes,
     AudioTrack.MODE_STREAM);

   audioTrack.play();
   audioTrack.write(audioData, 0, bufferSizeInBytes);


  } catch (FileNotFoundException e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  }
 }