0

現在、Android用のアンプを構築しようとしています。目標は、記録されているものを同時に記録および再生することです。これを処理するスレッドを作成しました。ただし、音は途切れ途切れです。これが私が試したものです。

private class RecordAndPlay extends Thread{
    int bufferSize;
    AudioRecord aRecord;
    short[] buffer;

    public RecordAndPlay() {
        bufferSize = AudioRecord.getMinBufferSize(22050, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT);
        buffer = new short[bufferSize];

    }

    @Override
    public void run() {         
            aRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, 22050, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT, bufferSize);

            try {
                aRecord.startRecording();
            } catch (Exception e) {

            }
            int bufferedResult = aRecord.read(buffer,0,bufferSize);
            final AudioTrack aTrack = new AudioTrack(AudioManager.STREAM_MUSIC, samplingRate, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT, bufferedResult, AudioTrack.MODE_STREAM);
            aTrack.setNotificationMarkerPosition(bufferedResult);
            aTrack.setPlaybackPositionUpdateListener(new OnPlaybackPositionUpdateListener() {

                @Override
                public void onPeriodicNotification(AudioTrack track) {
                    // TODO Auto-generated method stub

                }

                @Override
                public void onMarkerReached(AudioTrack track) {
                    Log.d("Marker reached", "...");
                    aTrack.release();                       
                    aRecord.release();
                    run();

                }
            });
            aTrack.play();
            aTrack.write(buffer, 0, buffer.length);     

    }

    public void cancel(){
        aRecord.stop();
        aRecord.release();

    }
}
4

1 に答える 1

0

AudioTrack が不足し、データがスムーズに取得されないため、再生が途切れます。コードでは、run を再帰的に呼び出し、マーカーごとに新しい AudioTrack を作成しています。代わりに、AudioRecord と AudioTrack を一度だけインスタンス化し、それらのイベントを処理するだけです。また、再生をスムーズにするために、おそらく再生の少し前に記録を開始し、記録されたバッファのキューを維持する必要があります。次に、これらのバッファーを AudioTrack に渡すことを管理し、各マーカー イベントで送信する新しいバッファーが常に存在するようにします。

于 2013-08-07T22:57:32.920 に答える