iOSでのAVAudioEngineサりンド゚ンゞンの玹介

このトピックに関する蚘事を探しおRunetを芋るず、その䞍圚に驚いおいたす。 おそらく、人々はクラスのヘッダヌに十分な説明があるかもしれたせんし、おそらく誰もが経隓的にそれを勉匷したいだけかもしれたせん。 䜕らかの圢で、このクラスに初めお出䌚った人、たたは実䟋の必芁性を感じた人のために、パヌトナヌであるMusic Topiaからこのシンプルで実甚的なガむドを提䟛したす。



サりンドを扱うずいう点では、Appleは競合他瀟よりも先を行っおおり、これは偶然ではありたせん。 同瀟は、トラックの再生、録音、凊理のための優れたツヌルを提䟛しおいたす。 これにより、AppStoreには、オヌディオコンテンツず䜕らかの圢で機胜する膚倧な数のアプリケヌションが衚瀺されたす。 これらには、優れたサりンドを持぀プレヌダヌ Vox 、゚フェクトの線集および適甚甚のツヌルを備えたオヌディオ゚ディタヌ Sound Editor 、音声倉曎アプリケヌション Voicy Helium 、察応するサりンドをかなり正確に暡倣する楜噚のさたざたなシミュレヌタヌ Virtuoso Piano が含たれたす、さらにはDJむンストレヌションのシミュレヌタヌ X Djing 。











Appleは、オヌディオを操䜜するために、いく぀かのツヌルを組み合わせたAVFoundationフレヌムワヌクを提䟛しおいたす。 たずえば、AVAudioPlayerは単䞀のトラックを再生するために䜿甚され、AVAudioRecorderはマむクからの音を録音するために䜿甚されたす。 そしお、これらのクラスが提䟛する機胜のみが必芁な堎合は、それらを䜿甚しおください。 ゚フェクトを適甚したり、耇数のトラックを同時に再生したり、ミックスしたり、オヌディオの凊理や線集を行ったり、特定のオヌディオノヌドの出力からサりンドを録音したりする必芁がある堎合は、 AVAudioEngineが圹立ちたす。 䜕よりも、このクラスはトラックに゚フェクトをかける胜力に惹かれたす。 むコラむザヌず音声を倉曎する機胜を備えた倚くのアプリケヌションは、これらの効果に基づいお構築されおいたす。 さらに、Appleは開発者が独自の゚フェクト、サりンドゞェネレヌタヌ、およびむンストゥルメントを䜜成できるようにしたす。



䞻な芁玠ずその関係



メむンのAVAudioEngine゚ンゞンから始めたしょう。 この゚ンゞンは、オヌディオ信号を生成および凊理し、オヌディオ入力および出力を衚すオヌディオノヌド接続のグルヌプです。 望たしい結果を達成するために特定の方法で配眮されたオヌディオノヌドの図ずしお説明するこずもできたす。 ぀たり、AVAudioEngineは、マむクロ回路この堎合はオヌディオノヌドが配眮されたマザヌボヌドであるず蚀えたす。



デフォルトでは、゚ンゞンはオヌディオデバむスに接続され、リアルタむムで自動的にレンダリングされたす。 たた、手動モヌドで動䜜するように構成するこずもできたす。぀たり、デバむスに接続せずに、クラむアントからの芁求に応答しお、通垞はリア​​ルタむムで、たたはさらに高速にレンダリングしたす。



このクラスを䜿甚する堎合、すべおの操䜜が正しく実行されるように、特定の順序で初期化ずメ゜ッドを実行する必芁がありたす。 アむテムに察する䞀連のアクションは次のずおりです。



  1. たず、オヌディオセッションAVAudioSessionを蚭定したす。
  2. ゚ンゞンを䜜成したす。
  3. AVAudioNodeノヌドを個別に䜜成したす。
  4. ノヌドを゚ンゞンに接続したす接続。
  5. ノヌド同士を接続したす接続したす。
  6. ゚ンゞンを始動したす。


1.オヌディオセッションのセットアップ



オヌディオセッションを蚭定しないず、アプリケヌションが正垞に動䜜しなかったり、音声がたったく聞こえなかったりしたす。 構成手順の具䜓的なリストは、゚ンゞンがアプリケヌションで実行する機胜蚘録、再生、たたはその䞡方によっお異なりたす。 次の䟋では、オヌディオセッションを再生のみに蚭定したす。



[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil]; [[AVAudioSession sharedInstance] overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:nil]; [[AVAudioSession sharedInstance] setActive:YES error:nil];
      
      





録音甚に蚭定するには、カテゎリAVAudioSessionCategoryRecordを蚭定する必芁がありたす。 すべおのカテゎリはこちらから入手できたす 。



2.゚ンゞンの䜜成



この゚ンゞンが機胜するには、AVFoundationフレヌムワヌクをむンポヌトしおクラスを初期化する必芁がありたす。



 #import <AVFoundation/AVFoundation.h>
      
      





初期化は次のずおりです。



 AVAudioEngine *engine = [[AVAudioEngine alloc] init];
      
      





3.ノヌドの䜜成



AVAudioEngineは、それに接続されおいるAVAudioNodeクラスのさたざたな子クラスで動䜜したす。 ノヌドには入力バスず出力バスがあり、接続ポむントず芋なすこずができたす。 たずえば、゚フェクトには通垞1぀の入力バスず1぀の出力バスがありたす。 バスには、AudioStreamBasicDescriptionの圢匏で衚瀺される圢匏があり 、サンプリング呚波数、チャネル数などのパラメヌタヌが含たれたす。 ノヌド間の接続が䜜成されるず、ほずんどの堎合、これらの圢匏は䞀臎するはずですが、䟋倖がありたす。



オヌディオノヌドの各タむプを個別に怜蚎しおください。



オヌディオノヌドの最も䞀般的なタむプはAVAudioPlayerNodeです。 名前が瀺すように、この皮類はオヌディオの再生に䜿甚されたす。 ノヌドは、指定されたAVAudioBufferビュヌバッファヌたたはAVAudioFileによっお開かれたオヌディオファむルのセグメントからサりンドを再生したす。 バッファずセグメントは、特定のポむントで再生するようにスケゞュヌルするこずも、前のセグメントの盎埌に再生するこずもできたす。



初期化ず再生の䟋



 AVAudioPlayerNode *playerNode = [[AVAudioPlayerNode alloc] init]; 
 NSURL *url = [[NSBundle mainBundle] URLForResource:@"sample" withExtension:@"wav"]; AVAudioFile *audioFile = [[AVAudioFile alloc] initForReading:url error:nil]; [playerNode scheduleFile:audioFile atTime:0 completionHandler:nil]; [playerNode play];
      
      





次に、AVAudioNodeクラスの子でもあるAVAudioUnitクラスに぀いお考えたす。 AVAudioUnitEffectAVAudioUnitの子クラスは、゚フェクトクラスの属クラスずしお機胜したす。 最も䞀般的に䜿甚される゚フェクトは、AVAudioUnitEQむコラむザヌ、AVAudioUnitDelay遅延、AVAudioUnitReverb゚コヌ効果、およびAVAudioUnitTimePitch加速たたは枛速効果、ピッチです。 それぞれに、サりンドを倉曎および凊理するための独自の蚭定セットがありたす。



遅延効果の䟋に察する効果の初期化ず調敎



 AVAudioUnitDelay *delay = [[AVAudioUnitDelay alloc] init]; delay.delayTime = 1.0f;//      ,  0  2 
      
      





次のノヌドAVAudioMixerNodeは、ミキシングに䜿甚されたす。 厳密に1぀の入力ノヌドを持぀他のノヌドずは異なり、ミキサヌには耇数の入力ノヌドを含めるこずができたす。 ここでは、プレヌダヌノヌドを゚フェクトノヌドずむコラむザヌず組み合わせお、ノヌド出力が既にAVAudioOutputNodeに接続されお、最終的なサりンドを出力できたす。



ミキサヌず出力ノヌドを初期化する䟋



 AVAudioMixerNode *mixerNode = [[AVAudioMixerNode alloc] init]; AVAudioOutputNode *outputNode = engine.outputNode;
      
      





4.゚ンゞンぞのノヌドの接続



ただし、ノヌドを宣蚀するだけでは機胜したせん。 ゚ンゞンに接続し、入出力バスを介しお他のノヌドに接続する必芁がありたす。 この゚ンゞンは、起動時にノヌドの動的な接続、切断、削陀をわずかな制限付きでサポヌトしたす。





ノヌドを゚ンゞンに接続するには「attachNode」メ゜ッドが䜿甚され、゚ンゞンからデタッチするには「detachNode」が䜿甚されたす。



 [engine attachNode:playerNode]; [engine detachNode:delay];
      
      





5.ノヌド同士の接続



接続されたすべおのノヌドは、サりンド出力のために共通の回路に接続する必芁がありたす。 接続は、出力する内容によっお異なりたす。 ゚フェクトが必芁です-゚フェクトノヌドをプレヌダヌノヌドに接続し、2぀のトラックを結合する必芁がありたす-2぀のプレヌダヌノヌドをミキサヌに接続したす。 たたは、2぀の個別のトラックが必芁な堎合がありたす。1぀はクリアなサりンドで、もう1぀は凊理枈みのサりンドです。 接続順序はそれほど重芁ではありたせんが、接続シヌケンスは最終的にメむンミキサヌに接続し、メむンミキサヌはオヌディオ出力ノヌドに接続する必芁がありたす。 䟋倖は入力ノヌドです。これは通垞、マむクからの録音に䜿甚されたす。



図ずコヌドの圢匏で䟋を瀺したす。



1効果のあるプレむダヌ











 [engine connect:playerNode to:delay format:nil]; [engine connect:delay to:reverb format:nil]; [engine connect:reverb to:engine.mainMixerNode format:nil]; [engine connect:engine.mainMixerNode to:outputNode format:nil]; [engine prepare];
      
      





22人のプレヌダヌ、そのうちの1人がサりンドを凊理する











 [engine connect:player1 to:eq format:nil]; [engine connect:eq to:pitch format:nil]; [engine connect:pitch to:mixerNode fromBus:0 toBus:0 format:nil]; [engine connect:player2 to:mixerNode fromBus:0 toBus:1 format:nil]; [engine connect:mixerNode to:outputNode format:nil]; [engine prepare];
      
      





34人のプレヌダヌ、うち2人はむコラむザヌによっお凊理されたす











 [engine connect:player1 to:mixer1 fromBus:0 toBus:0 format:nil]; [engine connect:player2 to:mixer1 fromBus:0 toBus:1 format:nil]; [engine connect:mixer1 to:eq format:nil]; [engine connect:eq to:engine.mainMixerNode fromBus:0 toBus:0 format:nil]; [engine connect:player3 to: engine.mainMixerNode fromBus:0 toBus:1 format:nil]; [engine connect:player4 to: engine.mainMixerNode fromBus:0 toBus:2 format:nil]; [engine connect:engine.mainMixerNode to:engine.outputNode format:nil]; [engine prepare];
      
      





゚ンゞンを操䜜するために必芁なすべおの手順を怜蚎したので、これらのすべおのアクションを䞀緒に確認し、実行する必芁がある順序をよりよく想像するための小さな䟋を䜜成したす。 AVAudioEngine゚ンゞンで調敎可胜な䜎域、䞭域、高域のむコラむザヌを備えたプレヌダヌを䜜成する䟋を次に瀺したす。



 - (instancetype)init { self = [super init]; if (self) { [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil]; [[AVAudioSession sharedInstance] overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:nil]; [[AVAudioSession sharedInstance] setActive:YES error:nil]; engine = [[AVAudioEngine alloc] init]; playerNode = [[AVAudioPlayerNode alloc] init]; AVAudioMixerNode *mixerNode = engine.mainMixerNode; AVAudioOutputNode *outputNode = engine.outputNode; AVAudioUnitEQ *eq = [[AVAudioUnitEQ alloc] initWithNumberOfBands:3]; eq.bands[0].filterType = AVAudioUnitEQFilterTypeParametric; eq.bands[0].frequency = 100.f; eq.bands[1].filterType = AVAudioUnitEQFilterTypeParametric; eq.bands[1].frequency = 1000.f; eq.bands[2].filterType = AVAudioUnitEQFilterTypeParametric; eq.bands[2].frequency = 10000.f; [engine attachNode:playerNode]; [engine attachNode:eq]; [engine connect:playerNode to:eq format:nil]; [engine connect:eq to:engine.mainMixerNode format:nil]; [engine connect:engine.mainMixerNode to:engine.outputNode format:nil]; [engine prepare]; if (!engine.isRunning) { [engine startAndReturnError:nil]; } } return self; }
      
      





さお、再生方法の䟋



 -(void)playFromURL:(NSURL *)url { AVAudioFile *audioFile = [[AVAudioFile alloc] initForReading:url error:nil]; [playerNode scheduleFile:audioFile atTime:0 completionHandler:nil]; [playerNode play]; }
      
      





起こりうる問題



AVAudioEngineを䜿甚しお開発する堎合は、アプリケヌションが正垞に動䜜しないかクラッシュする原因になるこずを忘れないでください。



1.オヌディオセッションず再生前の起動の確認



再生する前に、垞にオヌディオセッションを蚭定する必芁がありたす。䜕らかの理由で、アプリケヌションの䜿甚䞭にカテゎリがリセットたたは倉曎される堎合がありたす。 たた、再生する前に、゚ンゞンが停止しおいる可胜性があるためたずえば、同じ゚ンゞンの別のアプリケヌションに切り替えた結果ずしお、゚ンゞンが実行されおいるかどうかを確認する必芁がありたす。 そうしないず、アプリケヌションがクラッシュするリスクがありたす。



 [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil]; [[AVAudioSession sharedInstance] overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:nil]; [[AVAudioSession sharedInstance] setActive:YES error:nil]; if (!engine.isRunning) { [engine startAndReturnError:nil]; }
      
      





2.ヘッドセットの切り替え



もう1぀の重芁なポむントは、ヘッドフォンたたはBluetoothヘッドセットの接続/切断です。 同時に、゚ンゞンも停止し、頻繁に再生されるトラックの再生が停止したす。 したがっお、「AVAudioSessionRouteChangeNotification」ずいう通知を受け取るオブザヌバヌを远加するこずで、この瞬間を捉える䟡倀がありたす。 セレクタヌで、オヌディオセッションを蚭定し、゚ンゞンを再起動する必芁がありたす。



 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(audioRouteChangeListenerCallback:) name:AVAudioSessionRouteChangeNotification object:nil];
      
      





おわりに



この蚘事では、AVAudioEngineに粟通し、その操䜜方法のポむントを芋お、いく぀かの簡単な䟋を瀺したした。 これはAppleの歊噚庫にある優れたツヌルであり、これを䜿甚するず、耇雑さの皋床がさたざたで、ある皋床サりンドを凊理する倚くの興味深いアプリケヌションを䜜成できたす。



All Articles