2011-01-28 7 views
3

私は過去2週間これを行っていて、それは私を狂っています。私は数日前にこの質問をしましたが(Extract iPod Library raw PCM samples and play with sound effects)、その答えが私の半分のところに届いていましたが、私はまだ立ち往生しています。複数のiPodライブラリーの曲をiPhoneで再生するピッチ曲げとその他のエフェクトを同時に使用する

基本的に私が達成しようとしているものを、そのようななどピッチベンド、EQエフェクトなどの効果で再生するためのiPodライブラリから複数の曲をアップロードです...

私はAVPlayerのルートをダウンしたとAVAudioPlayerましたあまりにも単純です。これらのエフェクトでオーディオを再生できる唯一のフレームワークはOpenALです。私はいくつかの目的のCラッパー(FinchとObjectAL)を試しましたFinchは圧縮されたオーディオを再生しませんが、ObjectALはファイルのURLを渡すと私に変換します(これは互換性のないiPodライブラリのURL)。

beautifillyしたいアプリの例はTap DJです。それはTouchDJとは異なり、高速のiPodライブラリから曲を(アップロードすることができ、それが効果のすべての種類とそれらを果たしている。すべてのヘルプははるかに高く評価されるだろう

答えて

5

あなたは生のPCMフォーマットにオーディオデータを得ることができる場合。OpenALのが好きなことを、あなたはObjectALにロードすることができます

が必要なものは次のとおりです。

  • オーディオデータ
  • データのバイト単位のサイズ
  • データ(AL_FORMAT_MONO16またはAL_FORMAT_STEREO16)
  • ます。また、必要ALSourceはバッファを再生するよ

サンプルレートのフォーマット。 (

[OALSimpleAudio sharedInstance].reservedSources = 20; // or some number < 32 

はソースを作成する必要があります:あなたはOALSimpleAudioのと一緒にこれを使用している場合は、利用可能なソースのすべてを取らないことを伝える必要があります、(それはあなたのための装置およびコンテキストを処理しますので、お勧めします) )INITでこれを実行します。

mySource = [[ALSource source] retain]; 

あなたはそうのようなカスタムデータをALBufferを作成することができます。

ALBuffer* myBuffer = [ALBuffer bufferWithName:someName 
          data:myAudioData 
          size:audioDataSizeInBytes 
         format:audioFormat 
         frequency:sampleRateInHz]; 

今あなたがプレイすることができます:

を210
[mySource play:myBuffer]; 

編集:ALBufferはオーディオデータの管理を引き継ぎ、割り当てが解除されるとfree()を呼び出します。したがって、ダブルフリーにならないように注意してください。

編集2:データを解放するかどうかを制御できるように、ALBufferに「freeDataOnDestroy」プロパティを追加しました(デフォルトはYES)。

編集3:ねじを締めます。私はこれまでずっと行っているし、すべての道を行くかもしれない。 OALSimpleAudioに "playBuffer"メソッドを追加しました。

だから今はちょうど全体のことのためにOALSimpleAudioに滞在することができます。

myBuffer = [[ALBuffer bufferWithName:someName 
          data:myAudioData 
          size:audioDataSizeInBytes 
         format:audioFormat 
         frequency:sampleRateInHz] retain]; 

を...今もあります

id<ALSoundSource> source = [[OALSimpleAudio sharedInstance] playBuffer:myBuffer 
                   volume:1.0 
                   pitch:1.0 
                    pan:0 
                    loop:NO]; 

[source pitchTo:2.0 
     duration:5.0 
     target:nil 
     selector:nil]; 
// And so on... 
+0

単純 '[[OALManager sharedInstance] bufferFromUrl:URLのreduceToMono:内部的に 'bufferWithName:data:size:format:frequency'を使用します。それを使って 'ALBuffer *'を作成し、 'playBuffer'メソッドを使用してください –