5

アプリで生成された内部音を録音することはできますか?Androidアプリの内部サウンド再生を録画/キャプチャし、mp3を書き出す?

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

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

私はシーケンスを記録してmp3に書き出したいと思っています。

私はAudio Captureに見てきたが、setAudioSource(int型audio_sourceは)のみMIC録音を受け入れているようです。

おかげ

答えて

3

いいえ、あなたはVisualizer APIを通してそれを得ることができますので、実際には、完全に真実ではない(でも独自のアプリのために、オーディオ出力を得るためのAPIがありませんが、それは、そのような低品質になるであろう私はそれがあなたのために使用されることを疑う)。

この種の機能が必要な場合は、自分で実装する必要があります。あれは;サウンドの再生を開始し、それらをミックスし、その結果をファイルに書き込むこともできます。サウンドが圧縮されている場合は、自分でデコードする場合もあります。そこにアンドロイドに含まれて何のMP3エンコーダはいないので、あなたはそれはあなたがエクスポートする形式だ場合は、とにかく自分自身のMP3エンコーダを供給する必要があるだろうということ

注意。

+0

マイケル - どのように音をミックスしてファイルに書き込むかわからないので、どこから始めるのがベストか(ドキュメンテーション、チュートリアルなど) – fxfuture

+0

最も簡単なシナリオは、すべてのサウンドが同じサンプルレート、チャンネル数などの生のPCMだった場合です。あなたは基本的な添加剤ミキサーを使いました。あなたのミキシングは、現在アクティブなサウンドからサンプルを取り出して一緒に追加した後、標準のJavaファイルAPIを使用して結果をファイルに書き込むことで構成されます。追加がオーバーフローしないように注意する必要があります。エンコーディングとデコードを開始すると、それはより複雑になります。たとえば、Googleの場合は便利な情報があります。 "ffmpeg mp3 android"または "audio mixing"の場合 – Michael

+1

非常に助けていただきありがとうございます。初心者のためにこれを見つけました - http://mobilengineering.blogspot.it/2012/06/audio-mix-and-record-in-android.html – fxfuture

1

マイケルが言ったように、uはあなたを実装する必要がありますそれのための独自のエンコーダとデコーダ。ビジュアライザーは、イコライザーと同期したカスタムビューやエフェクトに表示するために、非常に低品質のデータを提供しています。

これはlinkです。ここでは、MP3ファイル用の単純なデコーダとエンコーダが見つかります。彼らはMP3ファイルからデータを読み込んで新しいMP3ファイルに入れています。彼らは他の拡張もサポートしていました。

http://code.google.com/p/ringdroid/source/browse/#svn%2Fbranches%2Fgingerbread%2Fsrc%2Fcom%2Fringdroid

0

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から継承されています。その後、ちょうどあなたの最高のエディタ(vimの、emacsの、geditの、何でも)でキーワードmOutput->write を検索し、我々はthreadLoop()機能の下で、このような 何か見つける:

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

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

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

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

関連する問題