アプリの内部音を録音することはできますか?
私のアプリでは、音楽シーケンスを作成して再生できます。
soundPool.play(soundIds[i], 1f, 1f, 1, 0, Constants.TIME_RATE);
シーケンスを記録して mp3 にエクスポートできるようにしたいと考えています。
Audio Captureを調べましたが、setAudioSource (int audio_source) は MIC 録音のみを受け入れるようです。
ありがとう
アプリの内部音を録音することはできますか?
私のアプリでは、音楽シーケンスを作成して再生できます。
soundPool.play(soundIds[i], 1f, 1f, 1, 0, Constants.TIME_RATE);
シーケンスを記録して mp3 にエクスポートできるようにしたいと考えています。
Audio Captureを調べましたが、setAudioSource (int audio_source) は MIC 録音のみを受け入れるようです。
ありがとう
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.raw
adb pull を使用してデータ ファイルをホスト マシンに取得し、aplay で再生できます。
aplay -t raw -c 2 -f S16_LE -r 44100 wav.raw
とにかく、それを mp3 に変換するには、Michael が述べたように外部エンコーダを使用する必要があります。