1. Hast Du Lust, bei uns mitzuarbeiten und das AH-Team zu verstärken? Alle Details zu dieser aktuellen Herausforderung findest Du hier.
  1. Wanderer, 11.02.2010 #1
    Wanderer

    Wanderer Threadstarter Neuer Benutzer

    Hallo!

    meine Applikation soll Audio Daten in den Arbeitsspeicher aufnehmen, und dann weiterverarbeiten. Deshalb benutze ich die AudioRecord Klasse und nicht den MediaRecorder.

    Bisher hatte ich einen Loop, der per "read" AudioDaten abholt und dann für eine weile schlafen gelegt wird. Das hat prinzipiell funktioniert, nur dass das Device extrem langsam wurde (trotz des schlafens).
    Ich habe das nun umgekrempelt und will mit dem "OnRecordPositionUpdateListener" auf hereinkommende Daten reagieren.
    Alles scheint zu funktionieren (Öffnen des Audio Devices etc.), nur wird der Listener scheinbar nie aufgerufen. Weiss jemand, warum?

    Info:
    Ich arbeite auf einem echten Device, kein Emulator. Das Aufnahme in einem Pseudo Busy Loop funktioniert. Nur die CallBack Funktionen des Listeners werden nie aufgerufen.

    Hier ist ein Auschnitt aus meinem Source:
    Code:
    public class myApplication extends Activity {
    
      /* audio recording */
      private static final int AUDIO_SAMPLE_FREQ = 16000;
      private static final int AUDIO_BUFFER_BYTESIZE = AUDIO_SAMPLE_FREQ * 2 * 3; // = 3000ms
      private static final int AUDIO_BUFFER_SAMPLEREAD_SIZE = AUDIO_SAMPLE_FREQ  / 10 * 2; // = 200ms
    
      private short[] mAudioBuffer = null; // audio buffer
      private int mSamplesRead; // how many samples are recently read
      private AudioRecord mAudioRecorder; // Audio Recorder
    
      ...
    
      private OnRecordPositionUpdateListener mRecordListener = new OnRecordPositionUpdateListener() {
      
        public void onPeriodicNotification(AudioRecord recorder) {
          mSamplesRead = recorder.read(mAudioBuffer, 0, AUDIO_BUFFER_SAMPLEREAD_SIZE);
          if (mSamplesRead > 0) {
    
            // do something here...
    
          }
        }
    
        public void onMarkerReached(AudioRecord recorder) {
          Error("What? Hu!? Where am I?");
        }
      };
    
      ...
    
      public void onCreate(Bundle savedInstanceState) {
    
      try {
          mAudioRecorder = new AudioRecord(
              android.media.MediaRecorder.AudioSource.MIC, 
              AUDIO_SAMPLE_FREQ,
              AudioFormat.CHANNEL_CONFIGURATION_MONO,
              AudioFormat.ENCODING_PCM_16BIT,  
              AUDIO_BUFFER_BYTESIZE);
        } catch (Exception e) {
          Error("Unable to init audio recording!");
        }
    
        mAudioBuffer = new short[AUDIO_BUFFER_SAMPLEREAD_SIZE];
        mAudioRecorder.setPositionNotificationPeriod(AUDIO_BUFFER_SAMPLEREAD_SIZE);
        mAudioRecorder.setRecordPositionUpdateListener(mRecordListener);
        mAudioRecorder.startRecording();
    	
        /* test if I can read anything at all... (and yes, this here works!) */
        mSamplesRead = mAudioRecorder.read(mAudioBuffer, 0, AUDIO_BUFFER_SAMPLEREAD_SIZE);
    
      }
    }
    
     
    Zuletzt bearbeitet: 11.02.2010
  2. Wanderer, 15.02.2010 #2
    Wanderer

    Wanderer Threadstarter Neuer Benutzer

    Benutzen denn alle hier die Audio Aufname per Busy-Loop?
     
  3. Dickwan, 06.03.2011 #3
    Dickwan

    Dickwan Neuer Benutzer

    Hallo Wander,
    konntest du das problem lösen. Ihc habe auch erst mit der Schleife aufgenommen. War aber mit der lösung nicht ganz zufrieden.
    der Ansatz mit dem updateListener funktionner ganz gu bei mit. hier ein Auszug vom Kode:

    Code:
    /* Method used for recording */
        private AudioRecord.OnRecordPositionUpdateListener updateListener = new AudioRecord.OnRecordPositionUpdateListener() {
            
            @Override
            public void onPeriodicNotification(AudioRecord arg0) {
                // Fill buffer
                wavRecorder.read(buffer, 0,buffer.length);
                
                try {
                    if (state == State.RECORDING){
                    // Write buffer to file
                    randomAccessWriter.write(buffer);
                    // Update data size
                    payloadSize += buffer.length;
                    Log.i(TAG, "Recorder is "+ getState());
                   }
                } catch (IOException e) {
                    Log.e(TAG, "Error in updateListener, recording aborted", e);
                    stop();
                }
            }
            
            @Override
            public void onMarkerReached(AudioRecord arg0) {
                Log.i(TAG, "Marker reached");
            }
        };
    Dein Code sieht eigentlich ganz in Ordnung. Sollte es nicht funzen. Überprüfe mal ganz genau ob der Configurations Parameters für den audioRecord object correct sind. Ist mal nämlich das Problem bei mir gewesen.
    
    
    ich habe mich stark an dem code von Rehearsal Assistant orientiert.


    Hoffe est hilft.

    Ich habe allerding noch zwischen durch Bufferoverflows, die ich nicht beseitigen könnte.

    PS: Arbeit bis jez nur mit dem Emulator (und seine Beschränkungen:thumbdn:)

    Gruß

    Dickwan
     
Die Seite wird geladen...
Ähnliche Themen Forum Datum
[OFFEN] Widget zeigt keine ImageView an. Android App Entwicklung Montag um 09:39 Uhr
[ERLEDIGT] (Verständnis-)Probleme mit SwipeRefreshLayout Android App Entwicklung 12.08.2017
[ERLEDIGT] Probleme mit Bluetooth / Beam Ordner Android App Entwicklung 25.07.2017
[ERLEDIGT] Probleme mit AdMob Android App Entwicklung 19.07.2017
[ERLEDIGT] Probleme mit Service unter Android N Android App Entwicklung 16.07.2017
[OFFEN] Probleme in den Speicher schreiben Android App Entwicklung 13.07.2017
[ERLEDIGT] Kleine Probleme mit einer App Android App Entwicklung 14.06.2017
[OFFEN] Probleme mit Action Floating Button Android App Entwicklung 27.05.2017
[ERLEDIGT] WebView Probleme Android App Entwicklung 19.05.2017
[ERLEDIGT] Probleme mit Wear Modul Android App Entwicklung 01.05.2017
Du betrachtest das Thema "AudioRecord Class Probleme mit Callback" im Forum "Android App Entwicklung",