Мое приложение не будет воспроизводить мой записанный звук - PullRequest
0 голосов
/ 22 февраля 2011

В моем приложении я хочу использовать класс AudioTrack для воспроизведения записанного мной звука.Я записываю звук через объект AudioRecord, читаю объект и затем хочу воспроизвести записанный звук.Однако то, как я его сейчас запрограммировал, приведет к ошибке в AudioTrack-JNI, которая скажет, что «Прямой доступ к буферу не поддерживается, запись невозможна».

Код выглядит следующим образом:

public class RecorderThread extends Thread{
    private static AudioRecord mAudioRecorder;
    private final int USE_MIC = MediaRecorder.AudioSource.MIC;
    private static final int FREQUENCY = 8000;
    private int mBuffSize, mChannel, mEncoding;
    private byte[] mBuffer;
    private Context mContext;
    private volatile boolean mContinueLoop = true,
                             mDataPresent = false,
                             mProcessData = false;

    private BroadcastReceiver mActionListener = new BroadcastReceiver(){
        @Override
        public void onReceive(Context context, Intent intent){
            if(intent.getAction().equals(mContext.getString(R.string.STOP_THREAD))){
                mContinueLoop = false;
                Thread.currentThread().interrupt();
            } else if(intent.getAction().equals(mContext.getString(R.string.START_RECORDING))){
                mAudioRecorder.startRecording();
            }  else if(intent.getAction().equals(mContext.getString(R.string.STOP_RECORDING))){
                mAudioRecorder.stop();
                mDataPresent = true;
            }  else if(intent.getAction().equals(mContext.getString(R.string.PROCESS_DATA))){
                if(mDataPresent){
                    mProcessData = true;
                    mDataPresent = false;
                }
            }  
        }
    };

    public RecorderThread(Context context){
        mContext = context;
        mChannel = AudioFormat.CHANNEL_IN_MONO;
        mEncoding = AudioFormat.ENCODING_PCM_16BIT;
        mBuffSize = AudioRecord.getMinBufferSize(FREQUENCY, mChannel, mEncoding);
        mBuffer = new byte[FREQUENCY * 10];
        mAudioRecorder = new AudioRecord(USE_MIC, FREQUENCY, mChannel, mEncoding, mBuffer.length);

        IntentFilter filter = new IntentFilter();
        filter.addAction(mContext.getString(R.string.START_RECORDING));
        filter.addAction(mContext.getString(R.string.STOP_RECORDING));
        filter.addAction(mContext.getString(R.string.PROCESS_DATA));
        filter.addAction(mContext.getString(R.string.STOP_THREAD));
        mContext.registerReceiver(mActionListener, filter);
    }

    @Override
    public void run(){
        while(mContinueLoop){
            if(mProcessData){
                // Process data.
                ByteBuffer sampledData = ByteBuffer.wrap(mBuffer);
                int readSamples = mAudioRecorder.read(sampledData, sampledData.limit());
                processData(sampledData, readSamples);
                mProcessData = false;
            }
            try{
                Thread.sleep(100);
            } catch(InterruptedException e){
                e.printStackTrace();
            }
        }
        mAudioRecorder.release();
    }

    private void processData(ByteBuffer sampledData, int readSamples) {
        byte[] data = sampledData.array();
        AudioTrack track = new AudioTrack(AudioManager.STREAM_MUSIC,
                                          FREQUENCY,
                                          AudioFormat.CHANNEL_OUT_MONO,
                                          mEncoding,
                                          data.length,
                                          AudioTrack.MODE_STATIC);
        if(track != null){
            track.write(data, 0, data.length);
            track.play();
            track.release();
        }
    }
}

Я просмотрел собственный код, который делает AudioTrack-JNI (http://www.netmite.com/android/mydroid/1.6/frameworks/base/core/jni/android_media_AudioRecord.cpp),, но это не делает его более понятным. Единственный раз, когда эта ошибка появляется, это когда емкость буфера<= 0 или когда адрес этого буфера нулевой. </p>

Так что, да, я понятия не имею, почему это не работает ... Любой, у кого есть немного опыта, может иметь ... Такпожалуйста, просветите меня? Заранее спасибо ...

Ответы [ 3 ]

0 голосов
/ 23 февраля 2011

Я сделал еще несколько отладок и обнаружил, что проблема не в AudioTrack, а в методе AudioRecord.read(). У вас все еще нет решения ... Кто-нибудь?

0 голосов
/ 02 февраля 2013

Используйте AudioRecord.read (short [], int, int) или AudioRecord.read (byte [], int, int) вместо AudioRecord.read (java.nio.ByteBuffer, int);

0 голосов
/ 22 февраля 2011

аудиодорожка должна быть в формате WAV или Sampled. Данные цифрового интерфейса музыкальных инструментов (MIDI)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...