2012-10-31 6 views
1

Я пытаюсь реализовать простой аудиомагнитофон в Android. Это было очень легко с MediaRecorder, но для моей области мне нужен AudioRecord, потому что я должен преобразовать входные данные с помощью jTrasform. Но я не могу инициализировать Audiorecorder. Это мой код, где я пытаюсь с помощью методов findAudioRecord() использовать все комбинации для создания рекордера (CHANNEL, SAMPLE RATE ...). Никто из них не работает. Надежда на помощьAudiorecord от Android не работает

import android.app.Activity; 
import android.media.AudioFormat; 
import android.media.AudioManager; 
import android.media.AudioRecord; 
import android.media.AudioTrack; 
import android.media.MediaRecorder; 
import android.media.MediaRecorder.AudioSource; 
import android.os.Bundle; 
import android.util.Log; 
import android.widget.TextView; 

public class FFTActivity extends Activity { 

    private TextView textView1; 
    private TextView textView2; 

    private static final int RECORDSTATE_RECORDING = 3; 
    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_MONO; 
    private static final int RECORDER_AUDIO_ENCODING = AudioFormat.ENCODING_PCM_16BIT; 

    private static int[] mSampleRates = new int[] { 8000, 11025, 22050, 44100 }; 


    private int bufferSize = 0; 
    private AudioRecord recorder = null; 

    private int cont; 

    int cont2 = 0; 
    int contENCODING = 0; 
    int contCHANNEL = 0; 

    String s =""; 



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

     textView1 = (TextView) findViewById(R.id.testo1); 
     textView2 = (TextView) findViewById(R.id.testo2); 

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

     recorder = findAudioRecord(); 



} 

    public AudioRecord findAudioRecord() { 
     for (int rate : mSampleRates) { 

      for (short audioFormat : new short[] { AudioFormat.ENCODING_PCM_8BIT, AudioFormat.ENCODING_PCM_16BIT }) { 
       for (short channelConfig : new short[] { AudioFormat.CHANNEL_IN_MONO, AudioFormat.CHANNEL_IN_STEREO }) { 
        try { 
         int bufferSize = AudioRecord.getMinBufferSize(rate, channelConfig, audioFormat); 

         if (bufferSize != AudioRecord.ERROR_BAD_VALUE) { 
          // check if we can instantiate and have a success 
          AudioRecord recorder = new AudioRecord(AudioSource.DEFAULT, rate, channelConfig, audioFormat, (bufferSize*2)); 
          textView2.setText("NOT ERROR_BAD_VALUE "+mSampleRates[cont2] +" "+ bufferSize); 

          if (recorder.getState() == AudioRecord.STATE_INITIALIZED){ 

           textView2.setText("getState(): "+recorder.getState()+" getMinBufferSize(): "+AudioRecord.getMinBufferSize(RECORDER_SAMPLERATE,RECORDER_CHANNELS,RECORDER_AUDIO_ENCODING)); 

           return recorder; 
          }  
         } 
        } catch (Exception e) { 
         textView2.setText("ECCEZZIONE"+e); 
        } 
        contCHANNEL++; 
       } 
       contENCODING++; 
      } 
      cont2++; 
     } 
     textView1.setText("NON INIZIALIZZATO " + contCHANNEL + " " + contENCODING); 
     return null; 
    } 
+0

Вы должны сообщить, какие результаты вы получите с помощью этого кода. Это исключение? Ошибки компиляции? – Jerome

+0

проблема в том, что для кругов внутри findAudioRecord() попробуйте все конфигурации ... Но в конце AudioRecord не инициализируется ни одному из них. – luke88

ответ

-1

Попробуйте этот рабочий код ...............

код Класс активности:

public class SoundRecordingActivity extends Activity { 

    MediaRecorder recorder; 
    File audiofile = null; 
    private static final String TAG = "SoundRecordingActivity"; 
    private View startButton; 
    private View stopButton; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    startButton = findViewById(R.id.start); 
    stopButton = findViewById(R.id.stop); 
    } 

    public void startRecording(View view) throws IOException { 

    startButton.setEnabled(false); 
    stopButton.setEnabled(true); 

    File sampleDir = Environment.getExternalStorageDirectory(); 
    try { 
     audiofile = File.createTempFile("sound", ".3gp", sampleDir); 
    } catch (IOException e) { 
     Log.e(TAG, "sdcard access error"); 
     return; 
    } 
    recorder = new MediaRecorder(); 
    recorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
    recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); 
    recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 
    recorder.setOutputFile(audiofile.getAbsolutePath()); 
    recorder.prepare(); 
    recorder.start(); 
    } 

    public void stopRecording(View view) { 
    startButton.setEnabled(true); 
    stopButton.setEnabled(false); 
    recorder.stop(); 
    recorder.release(); 
    addRecordingToMediaLibrary(); 
    } 

    protected void addRecordingToMediaLibrary() { 
    ContentValues values = new ContentValues(4); 
    long current = System.currentTimeMillis(); 
    values.put(MediaStore.Audio.Media.TITLE, "audio" + audiofile.getName()); 
    values.put(MediaStore.Audio.Media.DATE_ADDED, (int) (current/1000)); 
    values.put(MediaStore.Audio.Media.MIME_TYPE, "audio/3gpp"); 
    values.put(MediaStore.Audio.Media.DATA, audiofile.getAbsolutePath()); 
    ContentResolver contentResolver = getContentResolver(); 

    Uri base = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; 
    Uri newUri = contentResolver.insert(base, values); 

    sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, newUri)); 
    Toast.makeText(this, "Added File " + newUri, Toast.LENGTH_LONG).show(); 
    } 
} 

основной .xml код:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="horizontal" > 

    <Button 
     android:id="@+id/start" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Start Recording" 
     android:onClick="startRecording" /> 

    <Button 
     android:id="@+id/stop" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Stop Recording" 
     android:enabled="false" 
     android:onClick="stopRecording" 
     /> 

</LinearLayout> 

Разрешение добавить в AndroidManifest.xml:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 
<uses-permission android:name="android.permission.RECORD_AUDIO" /> 
+0

Этот код использует MediaRecorder, но мне нужен AudioRecorder, потому что для метода jTransform я должен передать буфер. И я думаю, что это невозможно с MediaRecorder ... или нет? – luke88

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