2016-09-22 7 views
1

Я разрабатываю приложение для Android. В моем приложении мне нужно записывать аудио, используя класс AudioRecord. Теперь я создаю простое приложение для тестирования класса AudioRecord, потому что раньше я этого не использовал. Мое простое приложение - это когда пользователь нажимает кнопку «Запись», чтобы начать запись. Когда вы нажмете «остановить», прекратите запись. Затем нажмите кнопку воспроизведения, чтобы воспроизвести записанный звук. Но мое приложение дает мне ошибку, когда я нажимаю кнопку «Запись».Невозможно записать с помощью AudioRecord в Android

Это моя деятельность

public class MainActivity extends AppCompatActivity { 

    Boolean recording; 


    private Button btnPlay,btnStop,btnRecord; 
    private String outputFile = null; 
    //outputFile = Environment.getExternalStorageDirectory().getAbsolutePath()+"/recording.3gp"; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     initialize(); 
     initViews(); 
     setUpViews(); 
    } 

    private void initialize() 
    { 

    } 

    private void initViews() 
    { 
     btnPlay = (Button)findViewById(R.id.btn_play); 
     btnRecord = (Button)findViewById(R.id.btn_record); 
     btnStop = (Button)findViewById(R.id.btn_stop); 
    } 

    private void setUpViews() 
    { 
     btnRecord.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       startRecord(); 
      } 
     }); 

     btnStop.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       recording = false; 
       Toast.makeText(getBaseContext(),"Stopped",Toast.LENGTH_SHORT).show(); 
      } 
     }); 

     btnPlay.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       playRecord(); 
      } 
     }); 
    } 

    private void startRecord(){ 

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

     try { 
      file.createNewFile(); 

      OutputStream outputStream = new FileOutputStream(file); 
      BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(outputStream); 
      DataOutputStream dataOutputStream = new DataOutputStream(bufferedOutputStream); 

      int minBufferSize = AudioRecord.getMinBufferSize(11025, 
        AudioFormat.CHANNEL_CONFIGURATION_MONO, 
        AudioFormat.ENCODING_PCM_16BIT); 

      short[] audioData = new short[minBufferSize]; 

      AudioRecord audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, 
        11025, 
        AudioFormat.CHANNEL_CONFIGURATION_MONO, 
        AudioFormat.ENCODING_PCM_16BIT, 
        minBufferSize); 

      audioRecord.startRecording(); 

      Toast.makeText(getBaseContext(),"Recording",Toast.LENGTH_SHORT).show(); 

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

    } 

    private 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, 
        11025, 
        AudioFormat.CHANNEL_CONFIGURATION_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(); 
     } 
    } 

} 

Ошибка бросает, когда я нажимаю кнопку записи.

Это ошибка в LogCat:

enter image description here

Что такое ошибка? Как правильно использовать AudioRecord?

ответ

0

Наконец-то я решил проблему. Мне просто нужно было запустить новый поток для записи.

private void startRecord(){ 

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

     try { 
      file.createNewFile(); 

      OutputStream outputStream = new FileOutputStream(file); 
      BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(outputStream); 
      dataOutputStream = new DataOutputStream(bufferedOutputStream); 

      final int minBufferSize = AudioRecord.getMinBufferSize(11025, 
        AudioFormat.CHANNEL_CONFIGURATION_MONO, 
        AudioFormat.ENCODING_PCM_16BIT); 

      audioData = new short[minBufferSize]; 

      final AudioRecord audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, 
        11025, 
        AudioFormat.CHANNEL_CONFIGURATION_MONO, 
        AudioFormat.ENCODING_PCM_16BIT, 
        minBufferSize); 

      audioRecord.startRecording(); 

      Toast.makeText(getBaseContext(),"Recording",Toast.LENGTH_SHORT).show(); 


      recordingThread = new Thread(new Runnable() { 
       public void run() { 
        while(recording){ 
         int numberOfShort = audioRecord.read(audioData, 0, minBufferSize); 
         for(int i = 0; i < numberOfShort; i++){ 
          try{ 
           dataOutputStream.writeShort(audioData[i]); 
          } 
          catch (IOException e) 
          { 
           Toast.makeText(getBaseContext(),e.getMessage(),Toast.LENGTH_SHORT).show(); 
          } 
         } 
        } 
       } 
      }, "AudioRecorder Thread"); 

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

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

    } 

 Смежные вопросы

  • Нет связанных вопросов^_^