3

このコードを使用して、 AudioTrackAudioRecordを使用して、録音したオーディオをリアルタイムで録音および再生します。

package com.example.audiotrack;

import android.app.Activity;
import android.media.AudioFormat;
import android.media.AudioManager;
import android.media.AudioRecord;
import android.media.AudioTrack;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.util.Log;

public class MainActivity extends Activity {
    private int freq = 8000;
    private AudioRecord audioRecord = null;
    private Thread Rthread = null;

    private AudioManager audioManager = null;
    private AudioTrack audioTrack = null;
    byte[] buffer = new byte[freq];
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_URGENT_AUDIO);
        final int bufferSize = AudioRecord.getMinBufferSize(freq,
                AudioFormat.CHANNEL_CONFIGURATION_MONO,
                AudioFormat.ENCODING_PCM_16BIT);


        audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, freq,
                AudioFormat.CHANNEL_CONFIGURATION_MONO,
                MediaRecorder.AudioEncoder.AMR_NB, bufferSize);

        audioTrack = new AudioTrack(AudioManager.ROUTE_HEADSET, freq,
                AudioFormat.CHANNEL_CONFIGURATION_MONO,
                MediaRecorder.AudioEncoder.AMR_NB, bufferSize,
                AudioTrack.MODE_STREAM);



        audioTrack.setPlaybackRate(freq);
         final byte[] buffer = new byte[bufferSize];
        audioRecord.startRecording();
        Log.i("info", "Audio Recording started");
        audioTrack.play();
        Log.i("info", "Audio Playing started");
        Rthread = new Thread(new Runnable() {
            public void run() {
                while (true) {
                    try {
                        audioRecord.read(buffer, 0, bufferSize);                                    
                        audioTrack.write(buffer, 0, buffer.length);

                    } catch (Throwable t) {
                        Log.e("Error", "Read write failed");
                        t.printStackTrace();
                    }
                }
            }
        });
        Rthread.start();
    }

}

私の問題 :

1.音質が悪い

2.異なる周波数を試すと、アプリがクラッシュします

4

1 に答える 1

2

AMRコーデックを使用してオーディオデータを圧縮しているため、オーディオ品質が低下する可能性があります。AMRは音響モデルに基づく圧縮を使用するため、人間の発話以外の音は低品質になります

それ以外の

MediaRecorder.AudioEncoder.AMR_NB

試す

AudioFormat.ENCODING_PCM_16BIT 

AudioRecordは低レベルのツールであるため、パラメータの互換性に注意する必要があります。ドキュメントで述べられているように、多くの周波数が機能することは保証されていません。

したがって、録音または再生を試みる前に、すべての組み合わせを調べて、それらのどれにアクセスできるかを確認することをお勧めします。

素晴らしい解決策はstackOverflowで数回言及されました、例えばここ ではAndroidでの周波数検出-AudioRecord

チェックpublic AudioRecord findAudioRecord()方法

于 2012-12-23T00:53:05.917 に答える