2012-03-13 3 views
1

В моем проекте у меня есть AVAudioPlayer, который воспроизводит песню. После того, как я сделаю паузу и снова сыграю, он начинается, вместо того, чтобы играть там, где я сделал паузу. Почему это происходит? Кроме того, когда я впервые нажимаю игру, он загружает песню около 3-4 секунд. Я решил, что решил это, загрузив его на другой поток, но он все еще загружается слишком медленно (по крайней мере, вид больше не замерзает). Как я могу это исправить? Вот код:AVAudioPlayer pausing issue

- (IBAction)play:(id)sender { 
    songIsCurrentlyPaused = NO; 
    if(songIsCurrentlyPaused==YES){ 
    [self.background play]; 
    } else { 
    playQueue = dispatch_queue_create("volume_change", NULL); 
    dispatch_async(playQueue, ^{ NSString *filePath = 
     [[NSBundle mainBundle]pathForResource:@"some_song" ofType:@"mp3"]; 
     NSURL *fileURL = [[NSURL alloc] initFileURLWithPath:filePath]; 
     self.background = [[AVAudioPlayer alloc] initWithContentsOfURL:fileURL error:nil]; 
     self.background.delegate = self; 
     [self.background setNumberOfLoops:1]; 
     [self.background setVolume:0.5]; 
     [self.background play]; }); 

     [trackNameLabel setText:@"Currently playing :\n some_song"]; 
     self.timer = [NSTimer scheduledTimerWithTimeInterval:0.25 target:self selector:@selector(updateProgressBar) userInfo:nil repeats:YES]; 
    } 
} 

- (IBAction)pause:(id)sender { 
    songIsCurrentlyPaused = YES; 
    [self.background pause]; 
    [trackNameLabel setText:@"Currently playing : some_song (paused)"]; 
    [self.progressBar setProgress:self.background.currentTime/self.background.duration animated:YES]; 
} 

Спасибо!

ответ

1

Вы установка songIsCurrentlyPausedNO в начале play:

Постарайся комментируя это:

- (IBAction)play:(id)sender { 
    //songIsCurrentlyPaused = NO; 
    if(songIsCurrentlyPaused==YES){ 
    [self.background play]; 
    } else { 
    playQueue = dispatch_queue_create("volume_change", NULL); 
    dispatch_async(playQueue, ^{ NSString *filePath = 
     [[NSBundle mainBundle]pathForResource:@"some_song" ofType:@"mp3"]; 
     NSURL *fileURL = [[NSURL alloc] initFileURLWithPath:filePath]; 
     self.background = [[AVAudioPlayer alloc] initWithContentsOfURL:fileURL error:nil]; 
     self.background.delegate = self; 
     [self.background setNumberOfLoops:1]; 
     [self.background setVolume:0.5]; 
     [self.background play]; }); 

     [trackNameLabel setText:@"Currently playing :\n some_song"]; 
     self.timer = [NSTimer scheduledTimerWithTimeInterval:0.25 target:self selector:@selector(updateProgressBar) userInfo:nil repeats:YES]; 
    } 
} 

- (IBAction)pause:(id)sender { 
    songIsCurrentlyPaused = YES; 
    [self.background pause]; 
    [trackNameLabel setText:@"Currently playing : some_song (paused)"]; 
    [self.progressBar setProgress:self.background.currentTime/self.background.duration animated:YES]; 
} 

Если вы хотите избавиться от этой начальной паузы тебе придется полностью реорганизовать настройки вашего плеера. Инициализируйте его, прежде чем пользователь может нажать кнопку воспроизведения, а также позвоните:

[self.background prepareToPlay]; 

, который предварительно загрузит песню. Также переместите songIsCurrentlyPaused = NO; в более раннее место в коде.

EDIT:

Чтобы избавиться от начальной задержки, вы должны переместить свой инициализирующий код где-то, как loadView или viweDidLoad.

//initialization code 
    NSString *filePath = [[NSBundle mainBundle]pathForResource:@"some_song" ofType:@"mp3"]; 
    NSURL *fileURL = [[NSURL alloc] initFileURLWithPath:filePath]; 
    self.background = [[AVAudioPlayer alloc] initWithContentsOfURL:fileURL error:nil]; 
    self.background.delegate = self; 
    [self.background setNumberOfLoops:1]; 
    [self.background setVolume:0.5]; 
    [self.background prepareToPlay]; 

Теперь это может вызвать отставание в дисплее пользовательского интерфейса, чтобы вы могли wan't рассмотреть поджимать данные в фоновом потоке.

Ваши IBAction методы должны быть затем модифицирован:

- (IBAction)play:(id)sender 
{ 

    if (songIsCurrentlyPaused==YES) 
    { 
     [self.background play]; 
    } 
    else 
    { 
     playQueue = dispatch_queue_create("volume_change", NULL); 
     dispatch_async(playQueue, ^{ 
     [self.background setCurrentTime: 0.0]; 
     [self.background play]; 
     }); 

     [self.progressBar setProgress:0.0 animated:YES]; 
     [trackNameLabel setText:@"Currently playing :\n some_song"]; 
     self.timer = [NSTimer scheduledTimerWithTimeInterval:0.25 target:self selector:@selector(updateProgressBar) userInfo:nil repeats:YES]; 

    } 
    songIsCurrentlyPaused = NO; 
} 

- (IBAction)pause:(id)sender 
{ 
    songIsCurrentlyPaused = YES; 
    [self.background pause]; 
    [trackNameLabel setText:@"Currently playing : some_song (paused)"]; 
    [self.progressBar setProgress:self.background.currentTime/self.background.duration animated:YES]; 
} 
+0

Проблема с паузой решена! Спасибо, очень признателен! Но загрузка по-прежнему медленная :( – nemesis

+0

@nemesis: я отредактировал свой ответ. Не могу он код, так как я не нахожусь на моем mac на данный момент. Он должен работать, но может потребоваться некоторая настройка. Идея заключается в предварительной загрузке музыка, если вы можете переместить предварительную загрузку на какой-то фоновый поток, тогда должна быть (почти) нет задержки. –

+0

Ну, это работает, если вы нажмете кнопку воспроизведения через некоторое время, когда изображение загрузится. Не существует способа полностью удалить задержка? Спасибо! – nemesis