0

MIC から短いアレイに直接録音しようとしています。

目標は、オーディオ トラックを含むファイルを書き込むことではなく、短い配列内に保存することです。

いくつかの方法を試してみましたが、AudioRecord で録音して AudioTrack で再生するのが最善でした。ここで良いクラスを見つけました:

Android: マイク入力を録音する必要があります

このクラスで必要なものはすべて揃っています。目的の結果を得るには、クラスを変更する必要がありますが...よくわかりません。何か不足しています...

これが私の変更です(まったく機能しません):

private class Audio extends Thread {
        private boolean stopped = false;
        /**
         * Give the thread high priority so that it's not canceled unexpectedly, and start it
         */
        private Audio()
        { 
            android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_URGENT_AUDIO);
            start();
        }

        @Override
        public void run()
        { 
            Log.i("Audio", "Running Audio Thread");
            AudioRecord recorder = null;
            AudioTrack track = null;
            //short[][]   buffers  = new short[256][160];
            int ix = 0;

            /*
             * Initialize buffer to hold continuously recorded audio data, start recording, and start
             * playback.
             */
            try
            {
                int N = AudioRecord.getMinBufferSize(8000,AudioFormat.CHANNEL_IN_MONO,AudioFormat.ENCODING_PCM_16BIT);
                recorder = new AudioRecord(AudioSource.MIC, 8000, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT, N*10);
                short[] buff = new short[N];
                recorder.startRecording();
                /*
                 * Loops until something outside of this thread stops it.
                 * Reads the data from the recorder and writes it to the audio track for playback.
                 */
                while(!stopped) {  
                    //Log.i("Map", "Writing new data to buffer");
                    //short[] buffer = buffer[ix++ % buffer.length];
                    N = recorder.read(buff, 0, buff.length);
                }

                recorder.stop();
                recorder.release();

                track = new AudioTrack(AudioManager.STREAM_MUSIC, 8000, 
                        AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT, N*10, AudioTrack.MODE_STREAM);
                track.play();

                for (int i =0; i< buff.length;i++) {
                    track.write(buff, i, buff.length);
                }


            } catch(Exception x)    { 
                //Log.e("Audio", x.getMessage());
                x.printStackTrace();
            } finally { 

                track.stop();
                track.release();
            }
        }

        /**
         * Called from outside of the thread in order to stop the recording/playback loop
         */
        private void close()
        { 
            stopped = true;
        }

    }

私が必要とするのは、短い配列バッファにサウンドを録音し、ユーザーがボタンを押したときに再生することです...しかし、今、私はサウンドを録音しようとしています。ユーザーがボタンを押すと、録音が​​停止し、サウンド再生開始...

誰でも私を助けることができますか?

ありがとう。

4

1 に答える 1

0

やりたいことを実行するには、コードを再構築する必要があります。私が正しく理解している場合は、「停止」がtrueに設定されるまでサウンドを読み取り、データを再生します。

記録時間の長さによっては、バッファリングされたデータが大量になる可能性があることを理解しておいてください。ファイルに書き込むか、一連のバッファを抽象データ型に格納できます。

何かを機能させるには、短い [] のベクターを作成し、「while(!stopped)」ループに新しい短い [] バッファーを割り当ててから、ベクターに詰め込みます。

while ループが停止した後、ベクターを反復処理して、バッファーを AudioTrack に書き込むことができます。

お分かりのように、あなたが聞いていたブリップは、最後の 20 ミリ秒程度の音声にすぎません。これは、バッファが最後の少しだけを保持しているためです。

于 2013-05-15T01:34:02.080 に答える