AVAudioPlayer - redarea mai multe fișiere audio, în ordine

voturi
5

Vreau să joace mai multe fișiere MP3, în ordine (una după alta), folosind AVAudioPlayer. Am încercat, și se oprește după redarea primei MP3. Cu toate acestea, dacă mă duc în depanator, funcționează bine .. orice idei? Am citit undeva AVAudioPlayer joacă audio în fundal .. cum pot împiedica să facă acest lucru? Vas

Întrebat 07/03/2009 la 03:29
sursa de către utilizator
În alte limbi...                            


5 răspunsuri

voturi
10

Cred că AVQueuePlayer(subclasa AVPlayer) face exact acest loc de muncă (juca o secvență de articole) , deoarece iOS 4.1: http://developer.apple.com/library/ios/#documentation/AVFoundation/Reference/AVQueuePlayer_Class/Reference/Reference.html

Nu am încerca eu cu toate acestea, dar va da cu siguranta o încercare de a-l.

Publicat 23/08/2012 la 12:39
sursa de către utilizator

voturi
3

Ei bine, de exemplu, codul dvs. nu a funcționat din cutie pentru mine. Soooo, m-am gândit că aș răspunde cu o versiune fixă:

Looper.h:

#import <Foundation/Foundation.h>
#import <AVFoundation/AVFoundation.h>

@interface Looper : NSObject <AVAudioPlayerDelegate> {
    AVAudioPlayer* player;
    NSArray* fileNameQueue;
    int index;
}

@property (nonatomic, retain) AVAudioPlayer* player;
@property (nonatomic, retain) NSArray* fileNameQueue;

- (id)initWithFileNameQueue:(NSArray*)queue;
- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag;
- (void)play:(int)i;
- (void)stop;

@end

Looper.m:

#import "Looper.h"
@implementation Looper
@synthesize player, fileNameQueue;

- (id)initWithFileNameQueue:(NSArray*)queue {
    if ((self = [super init])) {
        self.fileNameQueue = queue;
        index = 0;
        [self play:index];
    }
    return self;
}

- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag {
    if (index < fileNameQueue.count) {
        [self play:index];
    } else {
        //reached end of queue
    }
}

- (void)play:(int)i {
    self.player = [[AVAudioPlayer alloc] initWithContentsOfURL:[[NSURL alloc] initFileURLWithPath:[[NSBundle mainBundle] pathForResource:[fileNameQueue objectAtIndex:i] ofType:nil]] error:nil];
    [player release];
    player.delegate = self;
    [player prepareToPlay];
    [player play];    
    index++;
}

- (void)stop {
    if (self.player.playing) [player stop];
}

- (void)dealloc {
    self.fileNameQueue = nil;
    self.player = nil;        
    [super dealloc];
}

@end

Și iată cum aș numi-o:

 Looper * looper = [[Looper alloc] initWithFileNameQueue:[NSArray arrayWithObjects: audioFile, audioFile2, nil ]];

Am doar puțin peste un an de experiență cu dezvoltarea iPhone / iPad folosind Objective-C, deci nu ezitați să răspundă cu critici suplimentare.

Publicat 09/04/2012 la 21:21
sursa de către utilizator

voturi
3

Utilizați o AVAudioPlayer pe sunet.

Publicat 02/08/2009 la 16:51
sursa de către utilizator

voturi
1

Este o idee bună să inițializa, pregătească elementele și coadă înainte de timp, de exemplu, pe metoda viewDidLoad.

Dacă lucrați pe Swift,

    override func viewDidLoad() {
        super.viewDidLoad()
        let item0 = AVPlayerItem.init(URL: NSBundle.mainBundle().URLForResource("url", withExtension: "wav")!)

        let item1 = AVPlayerItem.init(URL: NSBundle.mainBundle().URLForResource("dog", withExtension: "aifc")!)
        let item2 = AVPlayerItem.init(URL: NSBundle.mainBundle().URLForResource("GreatJob", withExtension: "wav")!)


        let itemsToPlay:[AVPlayerItem] = [item0, item1, item2] 
        queuePlayer = AVQueuePlayer.init(items: itemsToPlay)
    }

și atunci când are loc un eveniment,

 queuePlayer.play()

Observați că dacă utilizați coada, încă s-ar putea avea unele lacune între sunete.

Puteți găsi versiunea Objective-C , în întrebarea Cum de a face ceva atunci când AVQueuePlayer termină ultimul playeritem

Sper ca ajuta.

Publicat 29/04/2016 la 09:35
sursa de către utilizator

voturi
1

Am implementat o clasă să se ocupe de acest lucru.

Pentru a utiliza face doar ceva de genul:

[looper playAudioFiles:[NSArray arrayWithObjects:
    @"add.mp3",
    [NSString stringWithFormat:@"%d.mp3", numeral1.tag],
    @"and.mp3",
    [NSString stringWithFormat:@"%d.mp3", numeral2.tag],
    nil
]];

Looper.m

#import "Looper.h"
@implementation Looper
@synthesize player, fileNameQueue;

- (id)initWithFileNameQueue:(NSArray*)queue {
    if ((self = [super init])) {
        self.fileNameQueue = queue;
        index = 0;
        [self play:index];
    }
    return self;
}

- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag {
    if (index < fileNameQueue.count) {
        [self play:index];
    } else {
        //reached end of queue
    }
}

- (void)play:(int)i {
    self.player = [[AVAudioPlayer alloc] initWithContentsOfURL:[[NSURL alloc] initFileURLWithPath:[[NSBundle mainBundle] pathForResource:[fileNameQueue objectAtIndex:i] ofType:nil]] error:nil];
    [player release];
    player.delegate = self;
    [player prepareToPlay];
    [player play];    
    index++;
}

- (void)stop {
    if (self.player.playing) [player stop];
}

- (void)dealloc {
    self.fileNameQueue = nil;
    self.player = nil;        
    [super dealloc];
}

@end

Looper.h

#import <Foundation/Foundation.h>


@interface Looper : NSObject <AVAudioPlayerDelegate> {
    AVAudioPlayer* player;
    NSArray* fileNameQueue;
    int index;
}

@property (nonatomic, retain) AVAudioPlayer* player;
@property (nonatomic, retain) NSArray* fileNameQueue;

- (id)initWithFileNameQueue:(NSArray*)queue;
- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag;
- (void)play:(int)i;
- (void)stop;


@end
Publicat 20/07/2011 la 06:58
sursa de către utilizator

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more