3

マルチトラック形式 (ドラム、ボーカル、ギター、ピアノなど) で曲を再生するアプリケーションを実行しています。各トラックに高度なオーディオ処理を行う必要はありません。必要なのは、各トラックを再生、一時停止、ミュート/ミュート解除することだけです。

AVAudioPlayer の複数のインスタンスを使用していましたが、デバイス テストを実行すると、最初の再生時にトラックがわずかに同期していないことに気付きました。さらに、トラックを一時停止して再生すると、さらに同期がずれます。少し調査した結果、AVAudioplayer の遅延が大きすぎて、私のアプリケーションでは機能しないことがわかりました。

私のアプリケーションでは、基本的に AVAudioPlayers の NSArray をループして再生したり、一時停止/停止したりしていました。

Apple のオーディオ ミキサーがうまく機能するように思えましたが、実装しようとすると、理解できない EXC_BAD_ACCESS エラーが発生します。

答えは OpenAL またはオーディオ ユニットを使用することだとわかっていますが、同時に 5 つの .mp3 トラックを再生するだけでよい場合、これらについて学習するのに何週間も費やす必要はないように思えます。これを達成する方法について何か提案はありますか?ありがとう

4

3 に答える 3

5

admsyn の提案のおかげで、解決策を思いつくことができました。

AVAudioPlayer には、トラックの現在の時間を返す currentTime プロパティがあり、設定することもできます。

そのため、admsyn で述べられているように startSynchronizedPlayback を実装し、トラックを停止したときに次を追加しました。

-(void) stopAll
{
int count = [tracksArr count];
for(int i = 0; i < count; i++)
    {
    trackModel = [tracksArr objectAtIndex:i]
    if(i = 0)
        {
         currentTime = [trackModel currentTime]
        }
    [trackModel stop]
    [trackModel setCurrentTime:currentTime]
    }
{

このコードは基本的に、それぞれが独自の AVAudioPlayer を保持するトラックの配列をループし、最初のトラックから現在の時間を取得してから、後続のすべてのトラックをその時間に設定します。startSynchronizedPlayback メソッドを使用すると、それらはすべて同期して再生され、一時停止を解除すると同期も維持されます。これがトラックの同期を維持しようとしている他の誰かに役立つことを願っています.

于 2012-10-16T19:43:26.580 に答える
4

play各 AVAudioPlayer に個別のメッセージを発行している場合、メッセージが異なる時間に到着するか、AVAudioPlayer が互いに同期せずにウォームアップ フェーズを終了する可能性が非常に高くなります。適切な同期を実現するには、 playAtTime:deviceCurrentTimeプロパティを使用する必要があります。deviceCurrentTime の説明に注意してください。

playAtTime: インスタンス メソッドを呼び出すときに、このプロパティを使用して「現在」を示します。複数のオーディオ プレーヤーを deviceCurrentTime からの指定されたオフセットで再生するように構成することにより、正確な同期を実行できます (そのメソッドの説明で説明されています)。

playAtTime:ディスカッションのサンプル コードにも注意してください。

// Before calling this method, instantiate two AVAudioPlayer objects and
// assign each of them a sound.

- (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
}
于 2012-10-15T21:55:15.340 に答える
0

ファイルをディスクにデコードできる場合、おそらくオーディオ ユニットが最適なレイテンシを提供するソリューションです。このようなアーキテクチャを使用する場合は、Novocaine も確認してください。

https://github.com/alexbw/novocaine

このフレームワークは、オーディオ ユニットを扱う際の頭痛の種の多くを取り除きます。

于 2012-10-16T06:52:55.300 に答える