5

アプリの内部音を録音することはできますか?

私のアプリでは、音楽シーケンスを作成して再生できます。

soundPool.play(soundIds[i], 1f, 1f, 1, 0,  Constants.TIME_RATE);

シーケンスを記録して mp3 にエクスポートできるようにしたいと考えています。

Audio Captureを調べましたが、setAudioSource (int audio_source) は MIC 録音のみを受け入れるようです。

ありがとう

4

3 に答える 3

1

http://xzpeter.org/?p=254によると、Android ソースを変更すると、内部サウンドの再生をキャプチャすることが可能です。特にAudioFlinger::MixerThreadクラスの書き込み機能。(この記事は少し古いことに注意してください。最新の Android バージョンAudioFlingerでは再編成され、書き込みコードが関数内で見つかるようになりましたthreadLoop_write())。

元のソリューション作成者の引用:

AudioFlinger は dir の下に実装されてい frameworks/base/services/audioflinger/ます。これから行うことは、ミキサー出力を見つけることです。ファイル AudioFlinger.cpp にはAudioFlinger::MixerThread::threadLoop()、ミキサーの作業スレッドである があり、この MixerThread は から継承されてい AudioFlinger::BaseThreadます。次に、mOutput->write 最適なエディター (vim、emacs、gedit など) でキーワードを検索すると、threadLoop()関数の下に次のようなものが見つかります。

mLastWriteTime = systemTime();
mInWrite = true;
mBytesWritten += mixBufferSize;

int bytesWritten = (int)mOutput->write(mMixBuffer, mixBufferSize);
if (bytesWritten < 0) mBytesWritten -= mixBufferSize;
mNumWrites++;
mInWrite = false;

それは、ミキサーの出力バッファがハードウェア関連のコードに転送され、オーディオクリップが 、mMixbufferサイズがmixBufferSize. このバッファには、44100Hz のサンプリング レート、2 チャネル、パラメータとして 16 ビットのリトル エンディアンを持つ PCM 生オーディオ データがあります。このバッファを のようなファイルに書き出す場合、/data/wav.rawadb pull を使用してデータ ファイルをホスト マシンに取得し、aplay で再生できます。
aplay -t raw -c 2 -f S16_LE -r 44100 wav.raw

とにかく、それを mp3 に変換するには、Michael が述べたように外部エンコーダを使用する必要があります。

于 2014-05-29T00:50:09.470 に答える