2013-02-05 84 views
2

我想通过使用循环播放多个文件。
我写的代码如下..
请帮我。!!
如何在AVAudioPlayer中循环播放多个音频文件?

soundList = [[NSArray alloc] initWithObjects:@"mySong1.mp3",@"mySong2.mp3",@"mySong3.mp3",@"mySong4.mp3",@"mySong5.mp3",@"mySong6.mp3",@"mySong7.mp3",@"mySong8.mp3",@"mySong9.mp3", nil]; 
for (i=0; i<=([soundList count] - 1);) {     
    while(i<[soundList count]){ 
     NSLog(@"File is : %@",[soundList objectAtIndex:i]); 
     mediaPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:[[NSURL alloc] initFileURLWithPath:[[NSBundle mainBundle] pathForResource:[soundList objectAtIndex:i] ofType:nil]] error:&error]; 
     [mediaPlayer setDelegate:self]; 
     self.lblCurrentSongName.text = [soundList objectAtIndex:i]; 
     [mediaPlayer prepareToPlay]; 
     i++; 
    } 
} 

请给我建议。!!

回答

5

我要给你一个准则做,但要注意它不是测试代码。你给不用于多种原因工作的代码,1。你不叫上avaudioplayer 2.边玩边循环将执行太快,歌曲将相互重叠或因为你不存储参考以往avaudioplayer它可能会造成麻烦(不知道确切)

NSInteger currentSoundsIndex; //Don't forget to set this in viewDidLoad or elsewhere 

//In viewDidLoad add this line 
{ 
... 
currentSoundsIndex = 0; 
... 
} 

-(void) playCurrentSong 
{ 
NSError *error; 
mediaPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:[[NSURL alloc] initFileURLWithPath:[[NSBundle mainBundle] pathForResource:[soundList objectAtIndex:currentSoundsIndex] ofType:nil]] error:&error]; 
if(error !=nil) 
{ 
    NSLog(@"%@",error); 
    //Also possibly increment sound index and move on to next song 
} 
else 
{ 
self.lblCurrentSongName.text = [soundList objectAtIndex:currentSoundsIndex]; 
[mediaPlayer setDelegate:self]; 
[mediaPlayer prepareToPlay]; //This is not always needed, but good to include 
[mediaPlayer play]; 
} 

} 

//This is the delegate method called after the sound finished playing, there are also other methods be sure to implement them for avoiding possible errors 
- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag 
{ 
//Increment index but don't go out of bounds 
currentSoundsIndex = ++currentSoundsIndex % [soundList count]; 
[self playCurrentSong]; 
} 
+0

非常感谢你[guenis(http://stackoverflow.com/users/837244/guenis) –

+0

HI [guenis(HTTP:// stackoverflow.com/users/837244/guenis)..我尝试了它,它是成功的,但它不会自动播放下一首歌曲。我应该为此采取行动。请帮助我自动播放所有歌曲。再次感谢.. –

+0

我已编辑的代码,通知[MediaPlayer的setDelegate:自我]现在是里面playCurrentSong。事实证明,当你分配你需要设置代理再次在vc新avaudioplayer,否则audioPlayerDidFinishPlaying方法开不被调用,它不会自动播放下一首歌曲,我的错误 – guenis

0

有可能没有最优雅的解决方案,但你会发现在这里有一个共同的想法。这是一个完整的工作代码,您可以将其复制/粘贴到您的项目中,并且应该可以工作。当然,你必须改变你的文件名。如果您有任何问题,请告诉我。

#import "MainViewController.h" 
#import <AVFoundation/AVFoundation.h> 

@interface MainViewController() <AVAudioPlayerDelegate> 

@property (nonatomic, strong) AVAudioPlayer *audioPlayer; 
@property (nonatomic, strong) NSMutableArray *soundsPathsList; 
@property (nonatomic, assign) NSInteger curSoundIdx; 

@end 


@implementation MainViewController 

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{ 
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
    if (self) { 
     // Custom initialization 
     NSArray *soundList = [[NSArray alloc] initWithObjects:@"myAudioFile 1", @"myAudioFile 2", @"myAudioFile 3", 
           @"myAudioFile 4", @"myAudioFile 5", @"myAudioFile 6", @"myAudioFile 7", 
           @"myAudioFile 8", @"myAudioFile 9", @"myAudioFile 10", nil]; 

     self.soundsPathsList = [NSMutableArray new]; 
     for (NSString *fileName in soundList) { 
      NSString *pathToFile = [[NSBundle mainBundle] pathForResource:fileName ofType:@"mp3"]; 
      NSURL *url = [NSURL fileURLWithPath:pathToFile]; 
      [self.soundsPathsList addObject:url]; 
     } 

     [self playNext]; 
    } 
    return self; 
} 

- (void) playNext { 

    if (self.curSoundIdx >= [self.soundsPathsList count]) { 
     self.curSoundIdx = 0; 
    } 

    // destroy player object 
    [self.audioPlayer stop]; 
    self.audioPlayer = nil; 

    // create new player object 
    self.audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL: 
         [self.soundsPathsList objectAtIndex:self.curSoundIdx] error:nil]; 
    self.audioPlayer.delegate = self; 
    [self.audioPlayer play]; 

    self.curSoundIdx++; 
} 

#pragma mark - AVAudioPlayerDelegate 

- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag { 
    [self playNext]; 
} 

@end 
+0

非常感谢你[罗斯特(http://stackoverflow.com/users/706319/rost) –

+0

乌尔欢迎;)) –

0

首先声明

AVAudioPlayer * audioPlayer;

的NSMutableArray * audioQueue;

,然后用下面的代码

-(void) addToPlayerQueue: (NSString *) file { 

    if ([audioQueue count] == 0) 
    { 
     [audioQueue addObject:file]; 
     [self playSound: file]; 
    } 
    else 
    { 
     [audioQueue addObject:file]; 
    } 
} 


-(void) playSound : (NSString *) soundFile 
{ 
    NSURL *soundUrl = [NSURL fileURLWithPath: [[NSBundle mainBundle] pathForResource:soundFile ofType:@"caf"]]; 
    if (soundUrl) { 
     audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:soundUrl error:nil]; 
     [audioPlayer setDelegate:self]; 
     [audioPlayer setVolume: playerVolume]; 
     [audioPlayer play]; 
    } 
} 



#pragma mark - 
#pragma mark AVAudioPlayer Delegate Method 

- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag { 
    NSLog(@"Just got done playing %@", [audioQueue objectAtIndex:0]); 
    [audioPlayer release]; 

    [audioQueue removeObjectAtIndex:0]; 

    if ([audioQueue count] > 0) 
    { 
     NSString *file = [audioQueue objectAtIndex:0]; 
     [self playSound:file]; 
    } 
} 
+0

非常感谢你[Bhu_zX](http://stackoverflow.com/users/938288/ bhu-zx) –

+0

欢迎男人!!! :) – BhushanVU

0
simply do it by using recursion .. 

@property (nonatomic, strong) NSArray *arrTrackList; 
@property (nonatomic, strong) NSMutableArray *arrAduioQueue; 
@property (nonatomic, strong) AVAudioPlayer *audioPlayer; 
@property (nonatomic) NSUInteger itemIndex; 

@end 

@implementation PLayMultipleTrackViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    self.arrTrackList = [NSArray arrayWithObjects:@"apple_ring",@"shukriya_pakistan",@"pakistan_anthem", nil]; 
    self.itemIndex = 0; 
} 

- (IBAction)TrackToPlay:(id)sender 
{ 
    self.btnPlayAll.enabled = NO; 
    NSString *trackFile = [self.arrTrackList objectAtIndex:self.itemIndex]; 
    [self AddToPlayList:trackFile]; 
} 

-(void)AddToPlayList:(NSString *)file 
{ 
     [self.arrAduioQueue addObject:file]; 
     [self playTrack:file]; 
} 

-(void)playTrack:(NSString *)soundFile 
{ 
    NSString *soundFilePath =[[NSBundle mainBundle] pathForResource: soundFile ofType: @"m4r"]; 
    NSURL *fileURL = [[NSURL alloc] initFileURLWithPath: soundFilePath]; 
    self.audioPlayer =[[AVAudioPlayer alloc] initWithContentsOfURL: fileURL error: nil]; 
    [self.audioPlayer prepareToPlay]; 
    [self.audioPlayer setDelegate:self]; 
    self.audioPlayer.volume = 1.0; 
    [self.audioPlayer play]; 
} 

-(void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag 
{ 
    [self.arrAduioQueue removeObjectAtIndex:0]; 
    self.itemIndex++; 
    NSUInteger trackListIndex = [self.arrTrackList count]; 

    if (self.itemIndex < trackListIndex) 
    { 
     NSString *nextTrack = [self.arrTrackList objectAtIndex:self.itemIndex]; 
     [self AddToPlayList:nextTrack]; 
    } 
    else 
    { 
     NSLog(@"PLaylist empty"); 
    } 
} 
@end