2015-11-20 4 views
5

私の目標は、デバイスのマイク入力を低遅延で録音しながらローカルファイルを再生することです。 私はSuperpoweredライブラリにアクセスしました。なぜなら、ドキュメントからは低レイテンシの機能が提供されるからです。 私はSuperpoweredAdvancedAudioPlayerとSuperpoweredAndroidAudioIOを使ってプレイヤーを作成しました。Android Superpowered SDKの録音と再生を同時に行う

SuperpoweredAndroidAudioIOには、パラメータが設定されたコンストラクタがあります。 boolean enableInput、boolean enableOutput。現在、私はenableInput == falseとenableOutput == trueを使用しています。これらのパラメータをtrueにすると効果はありません。

ファイルを録音して他のファイルを同時に再生することは可能でしょうか?

また、ライブラリにはSuperpoweredRecorderクラスがありますが、ディスクに直接書き込むことはできません。また、createWAV、fwrite、closeWAVメソッドを使用する必要があります。 私はレコーダーを個別に実装しようとしましたが、品質は良くありません(実際の録音+音よりも2〜3倍高速です)。ここ は、私が使用される記録用のコードの最も簡単な部分です:

void SuperpoweredFileRecorder::start(const char *destinationPath) { 
    file = createWAV(destinationPath, sampleRate, 2); 
    audioIO = new SuperpoweredAndroidAudioIO(sampleRate, bufferSize, true, false, audioProcessing, NULL, bufferSize); // Start audio input/output. 
} 

void SuperpoweredFileRecorder::stop() { 
    closeWAV(file); 
    audioIO->stop(); 
} 

static bool audioProcessing(void *clientdata, short int *audioInputOutput, int numberOfSamples, int samplerate) { 
    fwrite(audioInputOutput, sizeof(short int), numberOfSamples, file); 
    return false; 
} 

たぶん私はその目的のためにSuperpoweredを使用してちょうど直接OpenSL ESで記録する必要はありませできます。

ありがとうございます!私は解決策を見つけた実験の後numberOfSamples

fwrite(audioInputOutput, sizeof(short int), numberOfSamples * 2, file); 

これは明確なステレオ出力

答えて

5

につながるを倍増するとき

+0

SuperpoweredAndroidAudioIOがこれを処理します。複数のインスタンスを持つことは、不要なコード量です。 –

+0

エフェクトをファイルに適用した後のオーディオ出力の書き方について説明してください。 –

+1

@kasurdあなたは適切な実装と同じGitHubリンクを共有してください。それは非常に役に立つでしょう.. –

0

は私にとって、これは動作します。

  1. SuperpoweredRecorderはトラックの記録に適しています。
  2. SuperpoweredAndroidAudioIOソースを分離して作成しました.1つは再生用、もう1つはレコーダー用です。いくつかの同期操作の後、それはうまくいきます(私は待ち時間を非常に低いレベルにまで最小化していますので、私のニーズに合っています)。

    https://bitbucket.org/snippets/kasurd/Mynnp/nativesuperpoweredrecorder-with

    はそれが誰かの役に立てば幸い:

は私が実装アイデアといくつかのコードスニペットを投稿します!

+0

ファイルにエフェクトを適用した後の音声の出力方法を説明できますか? –

+0

この質問のヘルプが必要です。http://stackoverflow.com/questions/42316295/how-to-write-file-to-external-storage-using-superpowered-sdk-in-android –

4

これは、enableInputとenableOutputをtrueに設定して、SuperpoweredAndroidAudioIOの1つのインスタンスで行うことができます。

audio processingコールバック(あなたのケースの場合、audioProcessing())は、audioInputOutputパラメータでオーディオ(マイク)を受け取ります。それをSuperpoweredRecorderに渡すだけで、ディスクに書き込まれます。

その後、SuperpoweredAdvancedAudioPlayerの処理を行い、結果をaudioInputOutputに変換します。それはオーディオ出力に行くでしょう。

だから、擬似コードでは、ようなものだ:それは非常に短い時間内に完了しなければならないよう

audioProcessing(audioInputOutput) { 
    recorder->process(audioInputOutput) 
    player->process(some_buffer) 
    float_to_short_int(some_buffer, audioInputOutput) 
} 

は、オーディオ処理コールバック内の任意の関数fwriteを行うことはありませんし、ディスク操作は遅すぎるかもしれません。

+0

コメントありがとうございました。 私はこの手法を使い始めましたが、2〜3回の再生と1台のレコーダーが同時に必要になると思われました。私は別のSuperpoweredAndroidAudioIOに切り替えることにしました。 あなたのアプローチは私のケースでも機能しますか? – kasurd

+0

はい、もちろんです。複数のプレーヤーが同じバッファーに処理することができます。 process()メソッドにはbufferAddパラメータがあり、それをtrueに設定し、すべて同じバッファを使用します。 –

+0

ファイルにエフェクトを適用した後のオーディオ出力の書き方を説明してください。 –

関連する問題