Android AudioRecord in mancanza quando si chiama il startRecording() metodo

Sto cercando di registrare l’audio in android e memorizza in un array di byte, e per che uso Android AudioRecord built-in classe.

Ho già usato questa classe, prima, e tutto andava bene, ma per qualche ragione, sembra che il AudioRecord non funziona più.

Il problema è che il AudioRecord viene inizializzato e non mostra errori, ma quando è il momento di registrare qualcosa, chiamando il suo’ startRecording() il metodo, qualcosa è mancato e non ho nemmeno ottenere un buon motivo.

Questo è TUTTI l’uscita dal Logcat dopo la chiamata di questo metodo:

01-18 18:54:49.545  11303-11338/com.mypackage E/android.media.AudioRecord MediaRecorder prepare   CallingPid =  11303  Callinguid=  10128

01-18 18:54:49.545  11303-11338/com.mypackage E/android.media.AudioRecord java.lang.Throwable
        at android.media.AudioRecord.startRecording(AudioRecord.java:631)
        at mypackage.AudioRecorder.record(AudioRecorder.java:179)

Naturalmente, l’audio non viene registrato dopo di che, per coloro che chiedono se è solo un messaggio di errore interno.

Questo è il codice per l’inizializzazione della AudioRecord classe:

int bufferSize = AudioRecord.getMinBufferSize(AUDIO_SAMPLE_RATE, RECORDER_CHANNEL, RECORDER_AUDIO_ENCODING);

        if (bufferSize != AudioRecord.ERROR_BAD_VALUE && bufferSize > 0)
        {
            //check if we can instantiate and have a success
            AudioRecord recorder = new AudioRecord(MediaRecorder.AudioSource.MIC, AUDIO_SAMPLE_RATE, RECORDER_CHANNEL,
                    RECORDER_AUDIO_ENCODING, bufferSize);

            if (recorder.getState() == AudioRecord.STATE_INITIALIZED)
            {
                m_Recorder = recorder;
                m_RecordingThread = Executors.newSingleThreadExecutor();
                m_IsInitialized = true;
                return;
            }
        }

Quando le costanti che vengono utilizzati sono:

/**
 * Recorded audio's sample rate.
 */
private static final int AUDIO_SAMPLE_RATE = 44100;

/**
 * Recorded audio's channel.
 */
private static final int RECORDER_CHANNEL = AudioFormat.CHANNEL_IN_MONO;

/**
 * Recorded audio's encoding.
 */
private static final int RECORDER_AUDIO_ENCODING = AudioFormat.ENCODING_PCM_16BIT;

L’errore sta accadendo qui:

if (m_Recorder != null)
            m_Recorder.startRecording();

Quindi, dopo aver visto questo accadere un paio di volte, ho deciso di andare più a fondo e tenta di eseguire il debug, andando più in profondità possibile, la fonte di errore nel AudioRecord classe stessa, utilizzando Jetbrain del decompiler.

Per qualche strano motivo, non appena l’app raggiunto il punto di interruzione trova all’origine dell’errore, il prossimo passo non può essere completata, come il AudioRecord si è bloccato ancora una volta, con lo stesso messaggio di errore.

Il passo successivo per me è stata la creazione di un progetto di esempio solo per un test di AudioRecord funzionalità, ma questa volta ho aggiunto una traccia audio, che sarà in uscita tutte le mie registrazioni immediatamente (una sorta di loopback), nel caso in cui il AudioRecord classe riesce a registrare qualcosa, con o senza l’errore.

E così la magia ha successo – L’app è funzionante, AudioRecord è la registrazione, e la traccia audio è in riproduzione.

Mi sembrava davvero strano che la traccia audio di classe improvvisamente risolto tutti i miei problemi, così l’ho rimosso dal mio codice e provato l’app ancora una volta.

Questa volta, il AudioRecord lavorato senza problemi, e anche se non riuscivo a sentire la sua’ uscita, posso assicurarvi che è stata la registrazione.

Con un po ‘ di sollievo, ho pensato al mio me stesso che ho finalmente superato questo problema, e io sono pronto ad andare avanti, quindi ho aggiunto un codice per codificare e decodificare i dati audio registrati.

Per ascoltare un’uscita, ho restituito il codice utilizzando la traccia audio di classe, e corse l’app.

Vuole sentire una cosa divertente? L’app è schiantato con lo stesso errore, di NUOVO.

Ora teoricamente potrebbe essere il problema di non pubblicare il AudioRecord esempio quando fatto uso di esso, ma ho coperto anche dall’inizio.

Ho provato a cercare un po ‘ ovunque su internet per trovare una soluzione, ma sembra come se nessuno si è anche verificato un problema come questo prima.

Inoltre, vorrei precisare che ho provato a reimpostare il mio dispositivo, l’ADB plugin, e la ricostruzione di tutti i progetti.

Sto usando un Meizu MX5 telefono con Android Lollipop API(21).

  • Ci mostrano un po ‘ di codice…
  • Grazie per notare, ho aggiunto le parti pertinenti del codice.
  • Si prega di aggiungere un po ‘ di codice. Penso che la dichiarazione e la definizione di AudioRecord oggetto in if {} e, quindi, il suo ambito di applicazione è limitato a che {} solo. e anche io non sono in grado di vedere m_Recorder.startRecording(); è situato in blocco. Una cosa di più si Prega di inviare full stack trace, è perché di AudioRecord non inizializzato o IllegalStateException ?
InformationsquelleAutor Timor Gruber | 2016-01-18



2 Replies
  1. 1

    Bene, ho risolto il problema, o almeno una parte di esso, provocando un’ora per lavorare.
    Il fatto è che ho provato a leggere i byte in piu ‘ rispetto alla dimensione del mio pre-buffer allocato, al momento di chiamare il metodo read() del AudioRecord classe.

    Anche se non ha risolto il problema principale di questo post, che è lo strano messaggio di errore e il uncaught exception, ha fatto il AudioRecord funzionano perfettamente, quindi per me il thread può essere visto come ha risposto e chiuso!

  2. 1

    Codice completo

    import java.io.IOException;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetAddress;
    import java.net.UnknownHostException;
    //import com.rdt.facerecord.R;
    import android.app.Activity;
    import android.media.AudioFormat;
    import android.media.AudioRecord;
    import android.media.MediaRecorder;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.TextView;
    
    public class StreamD extends Activity {
    private Button startButton,stopButton;
    
    public byte[] buffer;
    public static DatagramSocket socket;
    private int port=8089;
    
    AudioRecord recorder;
    
    private int sampleRate = 16000 ; //44100 for music
    private int channelConfig = AudioFormat.CHANNEL_CONFIGURATION_MONO;    
    private int audioFormat = AudioFormat.ENCODING_PCM_16BIT;       
    int minBufSize = AudioRecord.getMinBufferSize(sampleRate, channelConfig,     audioFormat);
    private boolean status = true;
    
    TextView prompt;
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.stream);
    
    prompt = (TextView)findViewById(R.id.textView1);
    
    startButton = (Button) findViewById (R.id.start_bbb);
    stopButton = (Button) findViewById (R.id.stop_bbb);
    
    startButton.setOnClickListener (startListener);
    stopButton.setOnClickListener (stopListener);
    
    }
    
    private final OnClickListener stopListener = new OnClickListener() {
    
    @Override
    public void onClick(View arg0) {
                status = false;
                recorder.release();
    
                System.out.println("Recorder released");
    }
    
    };
    
    private final OnClickListener startListener = new OnClickListener() {
    
    @Override
    public void onClick(View arg0) {
                status = true;
                startStreaming();           
    }
    
    };
    
    public void startStreaming() {
    
    
    Thread streamThread = new Thread(new Runnable() {
    
        @Override
        public void run() {
            try {
    
                DatagramSocket socket = new DatagramSocket();
    
                System.out.println("Socket Created");
    
                byte[] buffer = new byte[minBufSize];
    
                System.out.println("Buffer created of size " + minBufSize);
    
                DatagramPacket packet;
    
                final InetAddress destination =     InetAddress.getByName("218.000.000.000");
    
                System.out.println("Address retrieved");
    
    
                recorder = new             AudioRecord(MediaRecorder.AudioSource.MIC,sampleRate,channelConfig,audioFormat,m    inBufSize*10);
                System.out.println("Recorder initialized");
    
                recorder.startRecording();
    
    
                while(status == true) {
    
    
                    //reading data from MIC into buffer
                    minBufSize = recorder.read(buffer, 0, buffer.length);
    
                    //putting buffer in the packet
                    packet = new DatagramPacket (buffer,buffer.length,destination,port);
    
                    socket.send(packet);
                    System.out.println("MinBufferSize: " +minBufSize);
    
                }
    
    
    
            } catch(UnknownHostException e) {
                System.out.println("UnknownHostException");
            } catch (IOException e) {
                e.printStackTrace();
                System.out.println("IOException");
            } 
        }
    
    });
    streamThread.start();
     }
     }

    e aggiungere autorizzazione

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.RECORD_AUDIO" />

Lascia un commento