AVAudioPlayer の複数のインスタンスを使用して、複数のオーディオ ファイルを同時に再生しています。ループを実行してオーディオ ファイルの再生を開始します (prepareToPlay は事前に呼び出され、ループは play メソッドのみを呼び出します)。
しかし、必ずプレーヤーの 1 人が同期してプレーしません。4 人のプレイヤー全員が同時にオーディオの再生を開始するにはどうすればよいですか?
ありがとう。
AVAudioPlayer の複数のインスタンスを使用して、複数のオーディオ ファイルを同時に再生しています。ループを実行してオーディオ ファイルの再生を開始します (prepareToPlay は事前に呼び出され、ループは play メソッドのみを呼び出します)。
しかし、必ずプレーヤーの 1 人が同期してプレーしません。4 人のプレイヤー全員が同時にオーディオの再生を開始するにはどうすればよいですか?
ありがとう。
Appleのドキュメントでは、「複数のサウンドを同時に再生し、オーディオ プレーヤーごとに 1 つのサウンドを正確な同期で再生する」方法について説明しています。おそらくあなたはplayAtTime:
例えば電話する必要があります[myAudioPlayer playAtTime: myAudioPlayer.deviceCurrentTime + playbackDelay];
実際、playAtTime: の Apple ドキュメントには、次のコード スニペットが含まれています。
NSTimeInterval shortStartDelay = 0.01; // seconds
NSTimeInterval now = player.deviceCurrentTime;
[player playAtTime: now + shortStartDelay];
[secondPlayer playAtTime: now + shortStartDelay];
それらは同時に再生する必要があります (十分に大きな値を選択すると仮定しますshortStartDelay
-- このスレッドが戻る前に発生するほど早くはありません)。
残念ながら、できません。AVAudioPlayer には、開始時間を細かく制御するメカニズムはありません。このcurrentTime
プロパティは、ファイル内の読み取り元のポイントを設定します。AVAudioPlayer インスタンスがいつシステム時間で再生を開始するかは保証されません。これは、複数のオーディオ ストリームを同期するために必要なものです。
この動作が必要な場合は、RemoteIO オーディオ ユニット + 3D ミキサー オーディオ ユニット + ExtAudioFile を使用します。
編集
AVAudioPlayer
iOS 4 以降、複数のインスタンスを同期できることに注意してください。playAtTime:
私のこのコード セグメントでは、すぐに実行する必要がない限り、これを実行できます。サウンドを聞きたいときのタイムスタンプとして targetTime を渡すことができます。その秘訣は、タイムスタンプと NSObject の遅延機能を利用することです。また、現在の時刻を変更するよりも、プレーヤーの音量を変更する方がはるかに時間がかからないという事実を利用しています。ほぼ完璧に正確に動作するはずです。
- (void) moveTrackPlayerTo:(double) timeInSong atTime:(double) targetTime {
[trackPlayer play];
trackPlayer.volume = 0;
double timeOrig = CFAbsoluteTimeGetCurrent();
double delay = targetTime - CFAbsoluteTimeGetCurrent();
[self performSelector:@selector(volumeTo:)
withObject:[NSNumber numberWithFloat:single.GLTrackVolume]
afterDelay:delay];
trackPlayer.currentTime = timeInSong - delay - (CFAbsoluteTimeGetCurrent() - timeOrig);
}
- (void) volumeTo:(NSNumber *) volNumb {
trackPlayer.volume = [volNumb floatValue];
}
すべての AVAudioPlayer オブジェクトに同じcurrentTimeプロパティ値を設定してみてください。