1

こんにちは、MIC からの着信オーディオを使用し、保存されているサウンド ファイルと比較するアプリを作成しています。現時点では、AudioRecord 関数からのデータがバイト配列に保存されたときにどのように見えるかを理解しようとしています。私の問題は、返される値がすべてゼロであることです。AudioRecord機能を適切に使用/設定していない可能性があるかどうかはわかりません。これが私のコードです:

import android.app.Activity;
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 SnoreAlarmActivity extends Activity implements OnClickListener {
/** Called when the activity is first created. */

Button start, stop;
TextView display;
Boolean rec = false;
AudioRecord snore;
byte[] arrayOfByte = new byte[16 * 1024 / 8];

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    start = (Button) findViewById(R.id.bStart);
    stop = (Button) findViewById(R.id.bStop);
    display = (TextView) findViewById(R.id.tAnswer);

    start.setOnClickListener(this);
    stop.setOnClickListener(this);

    int i = AudioRecord.getMinBufferSize(44100, 16, 2);
    snore = new AudioRecord(MediaRecorder.AudioSource.MIC, 44100, 16, 2, i);// From
                                                                            // MIC,Sample
                                                                            // Rate
                                                                            // of
                                                                            // 44100,
                                                                            // Channel_IN_MONO,16Bit
                                                                            // Encoding,buffer
                                                                            // size
                                                                            // i
    new Record().start();
}

@Override
public void onClick(View arg0) {
    // TODO Auto-generated method stub
    switch (arg0.getId()) {

    case R.id.bStart:
        rec = true;
        break;

    case R.id.bStop:
        rec = false;
        snore.stop();
        snore.release();

        for (int i = 0; i < 100; i++) {
            int x = (int) arrayOfByte[i];
            Log.w("Tag", "" + x);

        }
        break;
    }
}

class Record extends Thread {
    Record() {

    }

    @Override
    public void run() {
        // TODO Auto-generated method stub
        while (rec) {
            snore.startRecording();
            snore.read(arrayOfByte, 0, (16 * 1024 / 8));
        }
    }

   }
}

私の質問は、なぜゼロになるのですか? *また、16 ビット エンコーディングのため、データを短い形式で保存する必要があることもわかっています。後でそれを行います。現時点では、AudioRecord 関数から返される値を理解しようとしています。

4

2 に答える 2

1

MICを介して録音すると頭が痛くなります:)

私はそれで遊んで一日を失ったので、これが役立つことを願っています. MIC が機能するために満たす必要がある手順は次のとおりです。

  1. Maniefst.xml には以下が含まれている必要があります。

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

  2. AudioRecord バッファは AudioRecord.getMinBufferSize で設定する必要があります (正しく行いました)

  3. MIC が解放されていない場合、再び MIC にバインドすることはできません。電話を再起動すると、MIC がリセットされます。

これが私が行った簡単な例です。

private android.media.AudioRecord aRecorder = null;
private Boolean breakLoop = false;
private byte[] buffer;
public Boolean StartRecording()
    int freq = 22050;
    try
    {
        prepareWaveFile(MyRandomAccessFile); //open file and writes WAV header
        int bufferSize = android.media.AudioRecord.getMinBufferSize(freq, android.media.AudioFormat.CHANNEL_IN_MONO, android.media.AudioFormat.ENCODING_PCM_16BIT);
        buffer = new byte[bufferSize];
        if(bufferSize == AudioRecord.ERROR_BAD_VALUE){
                Log.e(LOG_TAG, "Min buff size error");
                return false;
        }

        aRecorder = new android.media.AudioRecord(MediaRecorder.AudioSource.MIC, freq, android.media.AudioFormat.CHANNEL_IN_MONO, android.media.AudioFormat.ENCODING_PCM_16BIT, bufferSize);

        aRecorder.startRecording();
        breakLoop = false;
        int TotalSize=0; //koliko je snimljeno podataka
        while (TotalSize < freq * 2 * 1 * 30) { //SampleRate * BytesPerSample * NumberOfChannels * seconds  
            int bufferReadResult = aRecorder.read(buffer, 0, bufferSize);
            TotalSize+=bufferReadResult; // filesize failsafe
            if (breakLoop) break; //if other thread stops recording
            if (bufferReadResult>0) MyRandomAccessFile.write(buffer, 0, bufferReadResult); //write into some file ...
        }

        aRecorder.stop();
        aRecorder.release(); //this is mandatory !
        updateWaveFile(MyRandomAccessFile); //updates wave header
        MyRandomAccessFile.close();
        return true;
    } catch (Exception e)
    {
        Log.e(LOG_TAG, "StartRecording: LOOP " + e);

        try
        {
            aRecorder.stop();
        } catch(Exception ex) {}

        try
        {
            aRecorder.release();
        } catch(Exception ex) {}

        try
        {
            randomAccessWriter.close();
        } catch(Exception ex) {}
        return false;
    }    
于 2013-02-20T11:06:22.733 に答える
0

あなたはエミュレーターにいますか?マイクが効かないそうです。

于 2012-07-21T21:57:47.210 に答える