2013-02-28 5 views
1

В принципе, я использую AudioRecord для записи звукового файла в каталог sdcard. Он записывается в течение 5 секунд, а затем воспроизводится с помощью AudioTrack.Android AudioRecord в файл затем использует AudioTrack для воспроизведения

Ну, для меня записанный файл не существует. Возможно, он не успел записаться. Что-нибудь я сделал неправильно в записи? как насчет части воспроизведения?

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    int minBufferSize = AudioTrack.getMinBufferSize(44100, AudioFormat.CHANNEL_CONFIGURATION_MONO, 
      AudioFormat.ENCODING_PCM_16BIT); 

    audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, 44100, AudioFormat.CHANNEL_CONFIGURATION_MONO, 
     AudioFormat.ENCODING_PCM_16BIT, minBufferSize, AudioTrack.MODE_STREAM); 


    recordSound(); 
} 



private void recordSound(){ 
    File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/"+"recordsound"); 
    // /mnt/sdcard/recordsound 
    // Delete any previous recording. 
    if (file.exists()) 
      file.delete(); 

    try { 
        file.createNewFile(); 

        // Create a DataOuputStream to write the audio data into the saved file. 
        OutputStream os = new FileOutputStream(file); 
        BufferedOutputStream bos = new BufferedOutputStream(os); 
        dos = new DataOutputStream(bos); 



        // Create a new AudioRecord object to record the audio. 
        int bufferSize = audioRecord.getMinBufferSize(FREQUENCY, CHANNEL_CONFIGURATION, AUDIO_ENCODING); 
        audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, FREQUENCY, CHANNEL_CONFIGURATION, AUDIO_ENCODING, bufferSize); 

        short[] buffer = new short[bufferSize]; 
        audioRecord.startRecording(); 

        new Timer().schedule(stop(), 5000); //time in miliseconds 

        // while (audioRecord.RECORDSTATE_RECORDING==1) 
        { 
          int bufferReadResult = audioRecord.read(buffer, 0, bufferSize); 
          for (int i = 0; i < bufferReadResult; i++) 
            dos.writeShort(buffer[i]); 
        } 



        // dos.close(); 
      } catch (FileNotFoundException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
      } catch (IllegalArgumentException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
      } catch (IllegalStateException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
      } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
      } 

} 

private TimerTask stop() 
{ 
    TimerTask t = new TimerTask() { 

     @Override 
     public void run() { 
      // TODO Auto-generated method stub 
      audioTrack.stop(); 
      audioTrack.release(); 
      try { 
       dos.close(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 



      try { 
        playfilesound(); 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 



     } 
    }; 
    return t; 

} 


private void playfilesound() throws IOException 
{ 




    int count = 512 * 1024; // 512 kb 
    //Reading the file.. 
    byte[] byteData = null; 
    File file = null; 
    file = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/"+"recordsound"); //filePath 

    if (file.exists()) 
    { 
     int a=0; 


    } 

    byteData = new byte[(int)count]; 
    FileInputStream in = null; 
    try { 
    in = new FileInputStream(file); 

    } catch (FileNotFoundException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
    } 


    int bytesread = 0, ret = 0; 
    int size = (int) file.length(); 
    audioTrack.play(); 


    while (bytesread < size) { // Write the byte array to the track 
     ret = in.read(byteData,0, count); //ret =size in bytes 

     if (ret != -1) { 
      audioTrack.write(byteData,0, ret); 
      bytesread += ret; } //ret 
     else break; } //while 

     in.close(); audioTrack.stop(); audioTrack.release(); 
    } 

ответ

2

Если ваше требование во время записи она должна играть (средство перекручивания назад звук), в вашем потоке времени цикла, вы хранение записанных данных (аудиоданный bufer), там себя вы можете скопировать его в плеере объект с в цикле while (player.write (audioData, 0, numShortsRead);). Вы сказали, что ваш поток пользовательского интерфейса застрял, возможно, из-за того, что вы уделяете больше внимания потоку аудиозаписи.

Проверьте ниже код, который я использовал для выше петли обратно требование:

boolean m_isRun=true; 
    public void loopback() { 
      // Prepare the AudioRecord & AudioTrack 
      try { 
       buffersize = AudioRecord.getMinBufferSize(SAMPLE_RATE, 
         AudioFormat.CHANNEL_CONFIGURATION_MONO, 
         AudioFormat.ENCODING_PCM_16BIT); 

      if (buffersize <= BUF_SIZE) { 
       buffersize = BUF_SIZE; 
      } 
      Log.i(LOG_TAG,"Initializing Audio Record and Audio Playing objects"); 

      m_record = new AudioRecord(MediaRecorder.AudioSource.MIC, 
        SAMPLE_RATE, AudioFormat.CHANNEL_CONFIGURATION_MONO, 
        AudioFormat.ENCODING_PCM_16BIT, buffersize * 1); 

      m_track = new AudioTrack(AudioManager.STREAM_ALARM, 
        SAMPLE_RATE, AudioFormat.CHANNEL_CONFIGURATION_MONO, 
        AudioFormat.ENCODING_PCM_16BIT, buffersize * 1, 
        AudioTrack.MODE_STREAM); 

      m_track.setPlaybackRate(SAMPLE_RATE); 
     } catch (Throwable t) { 
      Log.e("Error", "Initializing Audio Record and Play objects Failed "+t.getLocalizedMessage()); 
     } 

     m_record.startRecording(); 
     Log.i(LOG_TAG,"Audio Recording started"); 
     m_track.play(); 
     Log.i(LOG_TAG,"Audio Playing started"); 

     while (m_isRun) { 
      m_record.read(buffer, 0, BUF_SIZE); 
      m_track.write(buffer, 0, buffer.length); 
     } 

     Log.i(LOG_TAG, "loopback exit"); 
    } 

    private void do_loopback() { 
     m_thread = new Thread(new Runnable() { 
      public void run() { 
       loopback(); 
      } 
     }); 

Еще одна вещь, если ваше требование записи в течение нескольких секунд, а затем играть, в то время как он играет свою запись должна начаться снова , вы можете сделать это с потоком обработчика задержки с тайм-аутом, в этом потоке вы можете остановить запись копии буфера, а затем начать запись.

+0

привет, пожалуйста, изучите этот вопрос? http://stackoverflow.com/q/29271839/2508414 – OnePunchMan