AVAudioPlayerで連続して複数のオーディオファイルを再生するには?

私はAVAudioPlayerで次々に再生したい5つの曲を私のアプリケーションに持っています。

これの例はありますか?どうすればこれを達成できますか?

どのようなコード例も大いにありがとう!

ありがとう!

9
これについての情報を見つけることは非常に難しいです...
追加された 著者 dot,

4 答え

AVQueuePlayerはこのような状況に対応しています。

AVQueuePlayer is a subclass of AVPlayer you use to play a number of items in sequence.

13
追加された
きれいに答えた..これは私が望んだものです..
追加された 著者 Akshatha Srinivas,

AVAudioPlayerの代わりに、Kenが提案したようにこのユースケースに適したAVQueuePlayerを使用することができます。 使用できるコードは次のとおりです。

@interface AVSound : NSObject 

@property (nonatomic, retain) AVQueuePlayer* queuePlayer;

- (void)addToPlaylist:(NSString*)pathForResource ofType:(NSString*)ofType;
- (void)playQueue;

@end

@implementation AVSound
- (void)addToPlaylist:(NSString*)pathForResource ofType:(NSString*)ofType
{
   //Path to the audio file
    NSString *path = [[NSBundle mainBundle] pathForResource:pathForResource ofType:ofType];

   //If we can access the file...
    if ([[NSFileManager defaultManager] fileExistsAtPath:path])
    {

        AVPlayerItem *item = [[AVPlayerItem alloc] initWithURL:[NSURL fileURLWithPath:path]];

        if (_queuePlayer == nil) {
            _queuePlayer = [[AVQueuePlayer alloc] initWithPlayerItem:item];
        }else{
            [_queuePlayer insertItem:item afterItem:nil];
        }
    }

}


- (void)playQueue
{
    [_queuePlayer play];
}
@end

次にそれを使用する: あなたのインターフェイスファイルで:

@property (strong, nonatomic) AVSound *pageSound;

あなたの実装ファイル:

- (void)addAudio:(Book*)book pageNum:(int)pageNum
{

    NSString *soundFileEven = [NSString stringWithFormat:@"%02d", pageNum-1];
    NSString *soundPathEven = [NSString stringWithFormat:@"%@_%@", book.productId,     soundFileEven];
    NSString *soundFileOdd = [NSString stringWithFormat:@"%02d", pageNum];
    NSString *soundPathOdd = [NSString stringWithFormat:@"%@_%@", book.productId, soundFileOdd];

    if (_pageSound == nil) {
        _pageSound = [[AVSound alloc]init];
        _pageSound.player.volume = 0.5;
    }

    [_pageSound clearQueue];

    [_pageSound addToPlaylist:soundPathEven ofType:@"mp3"];
    [_pageSound addToPlaylist:soundPathOdd ofType:@"mp3"];
    [_pageSound playQueue];
}

HTH

9
追加された

単一の AVPlayer を作るすべての曲について、

NSURL *url = [NSURL URLWithString:pathToYourFile];
AVPlayer *audioPlayer = [[AVPlayer alloc] initWithURL:url];
[audioPlayer play];

プレイヤーが終了すると通知を受けることができます。プレーヤを設定するときに AVPlayerItemDidPlayToEndTimeNotification をチェックしてください:

  audioPlayer.actionAtItemEnd = AVPlayerActionAtItemEndNone; 

  [[NSNotificationCenter defaultCenter] addObserver:self
                                           selector:@selector(playerItemDidReachEnd:)
                                               name:AVPlayerItemDidPlayToEndTimeNotification
                                             object:[audioPlayer currentItem]];

これは、プレイヤーが最後に停止するのを防ぎます。

通知の中で:

- (void)playerItemDidReachEnd:(NSNotification *)notification
{
   //start your next song here
}

あなたは、現在の演奏曲が完了したことを知らせるとすぐに次の曲を始めることができます。セレクタ呼び出しで永続的なカウンタをいくつか維持します。そのようにして counter%[songs count] を使用すると、無限ループプレイリストが得られます:)

プレイヤーを解放するときに、通知の登録を解除することを忘れないでください。

1
追加された
ええ、そうすることができます。上記のコードは理論的です。それは保証するものではありません。しかし、アイデアは実行可能なようだ...
追加された 著者 Srikar Appalaraju,
私はplayerItemDidReachEndに何を入れますか? audioPlayer2を再生しますか?もし私が5曲を持っていたら?
追加された 著者 dot,

残念ながら、AVAudioPlayerは1つのファイルしか再生できません。 2つのファイルを再生するには、AVAudioPlayerの最初のインスタンスを終了し、もう一度それを再作成する必要があります( - (id)initWithContentsOfURL:(NSURL *)url error:(NSError **)outError )。このアプローチの問題は、最初のファイルの再生が終了してから、2番目のファイルの再生が開始されるまでの間に若干の遅延があることです。この遅延を取り除きたい場合は、 Core Audio よりはるかに複雑なソリューションを考え出してください。

1
追加された
私は方法があると思う。私の答えをチェックしてください。 AVPlayer には、現在再生中の曲が終了したときに通知する通知セレクタがあります。そうすれば、現在のことができるだけ早く次の曲を演奏することができます。それはうまくいくかもしれない。
追加された 著者 Srikar Appalaraju,
オーディオファイル自体に白いノイズや何らかのブランクノイズがある場合を除き、通知を使用しようとすると目立つギャップがあると想像できません。このように AVAudioPlayer は再生されますが、ユーザーはギャップがあると考えます。なぜこれがそうであるか知りたいのはまだ興味があります...
追加された 著者 Srikar Appalaraju,
私は実際にiPhoneとiPad用のラジオアプリを作った。 iOS 4.2の時点で、AVAudioPlayerを使用して2つのファイルを連続して再生しようとすると、まだ遅延があることがわかりました。私は prepareToPlay メソッドを使って別のAVAudioPlayerを準備しようとしていて、最初のものが終わるとただちに再生を開始しましたが、少し遅れていました。音の間に少しの遅延があっても大したことではありませんが、2つのファイル間の完全な連続再生を望むなら、私はAVAudioPlayerが行く方法だとは思わないでしょう。
追加された 著者 Michael Frederick,
このギャップは、オーディオファイルを再生するためのAVAudioPlayerの準備から来ています
追加された 著者 Michael Frederick,