0

2つのAVAudioPlayerオブジェクトで2つのサウンドを同時に正確に再生する必要があります...そのため、この例はApple AVAudioPlayerクラスリファレンス(https://developer.apple.com/library/mac/#documentation/AVFoundation/Reference/)で見つかりました。 AVAudioPlayerClassReference / Reference / Reference.html):

- (void) startSynchronizedPlayback {



NSTimeInterval shortStartDelay = 0.01;            // seconds

NSTimeInterval now = player.deviceCurrentTime;



[player       playAtTime: now + shortStartDelay];

[secondPlayer playAtTime: now + shortStartDelay];



// Here, update state and user interface for each player, as appropriate

}

私が理解していないのは、なぜsecondPlayerにもshorStartDelayがあるのか​​ということです。なくてはいけませんか?最初のプレーヤーは2番目のプレーヤーの前に呼び出されるので0.1秒の遅延が必要だと思いました...しかし、このコードでは2人のプレーヤーに遅延があります...それが正しいかどうか、そしてその理由は誰でも説明できますか?どうもありがとうマッシー

4

2 に答える 2

3

playメソッド([firstPlayer play];)のみを使用する場合、firstPlayerは、前に呼び出しを受信するため、2番目のメソッドの前に開始します。

遅延を設定しない場合([firstPlayer playAtTime:now];)、firstPlayerは開始予定時刻をチェックし、すでに経過していることを確認するため、2番目のプレーヤーの前にも開始します。したがって、playメソッドのみを使用する場合と同じ動作になります。

遅延は、2人のプレーヤーが同時に開始することを保証するためにここにあります。'now + delay'時間が経過する前に、2人のプレーヤーが確実にコールを受信するのに十分な長さであると想定されています。

私がはっきりしているかどうかはわかりません(英語は私の母国語ではありません)。ご不明な点がございましたら、より明確にさせていただくことができます

于 2013-02-19T16:19:48.313 に答える
0

ええ、彼が言ったこと^その時のプレイは、両方のプレイヤーがその時間に開始するようにスケジュールします(将来のいつか)。

わかりやすくするために、「shortStartDelay」を2秒に設定すると、両方のアイテムの再生が開始される前に2秒の一時停止が表示されます。

ここで覚えておくべきもう1つのヒントは、AVAudioPlayerを再生/一時停止しても、実際にはまったく同時に停止しないということです。したがって、再開する場合は、オーディオトラックも同期する必要があります。

迅速な例:

 let currentDeviceTime = firstPlayer.deviceCurrentTime
                        let trackTime = firstPlayer.currentTime
                        players.forEach {
                            $0.currentTime = trackTime
                            $0.play(atTime: currentDeviceTime + 0.1)
                        }

ここで、playersはAVAudioPlayersのリストであり、firstPlayerは配列の最初の項目です。

再生を続けたいオーディオトラックの秒数である「currentTime」もリセットしていることに注意してください。そうしないと、ユーザーがトラックを再生/一時停止するたびに、同期がずれてしまいます。

于 2021-07-10T21:31:22.717 に答える