Воспроизведение удаленного mp3-файла с буферизацией / потоковыми фрагментами - PullRequest
2 голосов
/ 17 ноября 2011

В настоящее время я использую CocosDenshion для небольших звуковых эффектов (длиной в полсекунды), и теперь мне нужно проигрывать короткие 30-секундные аудиоклипы (mp3), которые размещены на сервере, а не внутри пакета ресурсов приложения.Я пытаюсь заставить некоторый код воспроизводить его с двумя «требованиями»:

  1. , чтобы он воспроизводился при загрузке, поэтому мне не пришлось бы ждать загрузки всего объекта, чтобы просто воспроизвестиit.
  2. Чтобы у него был какой-то делегат, показывающий ход воспроизводимой дорожки.

Я пытался использовать AVAudioPlayer, но он не работает для меня, плюс он не работает.'Буфер' данных, он ждет загрузки всей вещи (пробовал на симуляторе, если это имеет значение).То, что я попробовал, это:

- (IBAction)play:(id)sender{
    NSString *_mp3file = @"http://www.somesite.com/somefile.mp3";
    NSData *_mp3data = [NSData dataWithContentsOfURL:[NSURL URLWithString: _mp3file]];

    NSError *error;

    AVAudioPlayer *avp = [[AVAudioPlayer alloc] initWithData:_mp3data error:&error];
    avp.numberOfLoops = 0;
    avp.volume = 1.0f;
    avp.delegate = self;
    [avp prepareToPlay];

    if(avp == nil)
        GTMLoggerError(@"%@", error);
    else
        [avp play];
}

Буду рад вашей помощи опыт на этом :)Ура,Шай.

1 Ответ

1 голос
/ 21 апреля 2013

В вашем методе didLoad

dispatch_queue_t dispatchQueue = 
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(dispatchQueue, ^(void){
    NSString *_mp3file = @"http://cs4405.vk.me/u360087/audios/4efe178f2608.mp3";
    NSData   *_mp3Data = [NSData dataWithContentsOfURL:[NSURL URLWithString: _mp3file]];
    NSError  *_error   = nil;

    self._audioPlayer = [[AVAudioPlayer alloc] initWithData:_mp3Data error:&_error];

    if (self._audioPlayer != nil)
    {
        self._audioPlayer.delegate = self;
        if ([self._audioPlayer prepareToPlay] && [self._audioPlayer play])
        {
            NSLog(@"Successfully started playing");
        } else {
            NSLog(@"Failed to play");
        }
    } else {
        NSLog(@"Failed to instanciate player");
    }
});
...