10

AudioRecord クラスを使用して、通話中の音声を録音します。

電話を所有している人の声だけを (マイクから) 録音することに興味があります。録音中にオーディオ処理を行いたいのですが、これは今のところトピック外です。

Android には、次の AudioSources オプションがあります。

  • MediaRecorder.AudioSource.VOICE_CALL
  • MediaRecorder.AudioSource.MIC
  • MediaRecorder.AudioSource.VOICE_UPLINK
  • MediaRecorder.AudioSource.VOICE_DOWNLINK

それらの違いは何ですか?わかりました MIC は明らかですが、 VOICE_CALL 対 VOICE_UPLINK 対 VOICE_DOWNLINK ?

また、サンプルレート ( 8000Hz、16000Hz、2250Hz、44100Hz ) を選択する必要があります。選択するサンプルレートとその理由を教えてください。

オーディオ形式については、AudioFormat.ENCODING_PCM_16BIT を選択しましたが、次のものもあります。

最後に、使用する必要があるチャネルの数とその理由を教えてください。( AudioFormat.CHANNEL_IN_STEREO または AudioFormat.CHANNEL_IN_MONO )

4

3 に答える 3

12

Google によれば、動作が保証されている唯一のサンプル レートであるため、常にサンプル レートとして 44100 を使用することを目指す必要があります。

「ヘルツで表されるサンプルレート。現在、44100Hz はすべてのデバイスで動作することが保証されている唯一のレートですが、22050、16000、および 11025 などの他のレートは一部のデバイスで動作する可能性があります。」開発サイト

ステレオ対モノに関しては、モノを使用してください。

「オーディオ チャネルの構成について説明します。CHANNEL_IN_MONO および CHANNEL_IN_STEREO を参照してください。CHANNEL_IN_MONO は、すべてのデバイスで動作することが保証されています。」開発サイト

最後に: 8bit pcm 対 16bit pcm: 16bit pcm を使用し、

"オーディオデータ形式: PCM 16 ビット/サンプル。デバイスでサポートされることが保証されています。" 開発サイト

16 ビットを使用する場合は、byte バッファの代わりに short[] バッファを使用することを忘れないでください。16bit は 2 バイトなので、バッファ内の 2 つのエントリを一度に結合する必要があります。

byte][]{sample_1_upper, sample_1_lower, sample_2_upper, sample_2_lower,...,sample_n_lower} ただし、short[]バッファを使用する場合:
short[]{sample1, sample2, ..., sample3}

通話を録音しようとしたことはありませんが、OS が MIC ソースをバインドしていない場合は、おそらくそこから録音できます。マイクから録音しているので、ユーザーの声だけを取得する必要があります。

于 2012-07-17T09:12:26.967 に答える
11

それらの違いは何ですか?わかりました MIC は明らかですが、 VOICE_CALL 対 VOICE_UPLINK 対 VOICE_DOWNLINK ?

VOICE_UPLINK: 自分から相手に送信される音声。IOW、マイクに向かって話す内容 (さらに、ノイズ抑制が使用されているかどうか、およびそのパフォーマンスに応じて周囲のノイズ)。

VOICE_DOWNLINK: 相手から自分に送信された音声。

VOICE_CALL: VOICE_UPLINK + VOICE_DOWNLINK。

于 2012-10-26T16:02:30.647 に答える
2

少し遅れましたが、オーディオ デバイスにクエリを実行して何ができるかを調べることができます。

AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
String sampleRate =  audioManager.getProperty(AudioManager.PROPERTY_OUTPUT_SAMPLE_RATE);
String sampleBufferSize = audioManager.getProperty(AudioManager.PROPERTY_OUTPUT_FRAMES_PER_BUFFER);
int bufferSize = AudioRecord.getMinBufferSize(Integer.parseInt(sampleRate), AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT);
于 2016-03-02T11:18:03.467 に答える