21

私のアプリでは、AndroidフォンでMICからのオーディオを録音し、TCP経由で他のAndroidフォンに送信する必要があります。そこで再生する必要があります。

私はクラスを使用AudioRecordしています。AudioTrackこれはファイルでうまく機能します-を使用してファイルにオーディオを書き込み、を使用してファイルDataOutputStreamから読み取りますDataInputStream

ただし、ファイルではなくソケットから同じストリームを取得して書き込みを試みると、例外が発生します。

何がうまくいかないのか理解できません。どんな助けでも大歓迎です。

編集:より大きなバッファサイズ(65535バイト、160000バイト)で試しても問題は同じです。

これはコードです:

レコーダー:

int bufferSize = AudioRecord.getMinBufferSize(11025, , AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT); 

AudioRecord recordInstance = new AudioRecord(MediaRecorder.AudioSource.MIC, 11025, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT, bufferSize);

byte[] tempBuffer = new byte[bufferSize];

recordInstance.startRecording();

while (/*isRecording*/) {
      bufferRead = recordInstance.read(tempBuffer, 0, bufferSize);
      dataOutputStreamInstance.write(tempBuffer);
}

上記のDataOutputStreamは次のように取得されます。

BufferedOutputStream buff = new BufferedOutputStream(out1); //out1 is the socket's outputStream
DataOutputStream dataOutputStreamInstance = new DataOutputStream (buff);

ご覧になって、ここで間違っている可能性があることを教えてください。

ありがとう、

4

3 に答える 3

8

私はこれをある程度の助けを借りて、そして部分的にしか機能させませんでした。

http://emeadev.blogspot.com/2009/09/raw-audio-manipulation-in-android.htmlのコードから始め、FileのストリームをSocketのストリームに変更し、isAvailable()をif(inputStream)に変更しました。 .read(byteArray)!= -1)。

TCPを介したオーディオのライブストリーミングが現在行われています。

でも、

もう一方の端で聞こえるのはノイズだけです。現在、AudioRecorderとAudioTrackの正しいパラメーターのセット(周波数、チャネル構成とエンコード、オーディオソースなど)を探しています。

これについて何か考えがあれば、私に知らせてください。

ありがとう、

編集:それは私の側の愚かなエラーでした。上記のすべてに加えて、プレーヤー側でinputStream、レコーダー側でoutputStreamを使用し、shortsの代わりにバイト配列を使用すると機能します。:)

于 2010-05-02T03:42:23.820 に答える
2

問題はここにあります:

  bufferRead = recordInstance.read(tempBuffer, 0, bufferSize);
  dataOutputStreamInstance.write(tempBuffer);

相当するバイトを読み取りbufferReadますが、バッファ全体を出力ストリームに書き込もうとします。

録音プロセスを改善するために、次の点を考慮することができます。

  1. 有効NoiseSuppressorにする(API 16以降)
  2. 有効AcousticEchoCancelerにする(API 16以降)
  3. 初期バッファサイズを増やし、オーディオストリームをスムーズにするために初期バッファサイズよりも小さいバイトのチャンクを読み取る必要があります
  4. UDPに切り替えます。ストリーミングはUDPジョブです。

以前のAndroidアプリのセットアップは次のとおりです。

// Calculate minimum buffer size
int minBufferSize = AudioRecord.getMinBufferSize(44100, AudioFormat.CHANNEL_IN_MONO,
                                                 AudioFormat.ENCODING_PCM_16BIT);
// Initialize AudioRecord for getting audio from device
AudioRecord recorder = new AudioRecord(MediaRecorder.AudioSource.MIC, 44100,
                                            AudioFormat.CHANNEL_IN_MONO,
                                            AudioFormat.ENCODING_PCM_16BIT, minBufferSize * 4);

if (API > API 16) {
    if (NoiseSuppressor.isAvailable()) {
        NoiseSuppressor.create(recorder.getAudioSessionId()).setEnabled(true);
    }
    if (AcousticEchoCanceler.isAvailable()) {
        AcousticEchoCanceler.create(recorder.getAudioSessionId()).setEnabled(true);
    }
}

....

byte[] tempBuffer = new byte[minBufferSize];
while (/*isRecording*/) {
      bufferRead = recordInstance.read(tempBuffer, 0, minBufferSize);
      dataOutputStreamInstance.write(tempBuffer, 0, bufferRead);
}
于 2018-08-07T03:14:03.800 に答える
1

発生している特定の例外を知らなければ、何が問題なのかを正確に知ることは困難です。out1また、作成に使用しているコード(つまり、ソケットコード)を確認することも役立ちます。

注意が必要なのは、から読み取られるデータの量recordInstance.read()です。bufferSizeデータの全体のサイズのチャンクをそこから取得できない可能性があるため、出力ソケットにバイト0を書き込むだけに注意する必要があります。bufferRead-1

于 2010-05-01T20:17:38.680 に答える