AVAudioPlayer не воспроизводит звук

Я работаю над приложением iOS, которое должно воспроизводить некоторые звуки, используя структуру AVFoundation . Структура рабочей области в Xcode 4 содержит два проекта:

  • Рабочее пространство
    • Само приложение (основной проект)
    • Библиотека утилиты

После создания библиотеки утилиты это приводит к созданию статической библиотеки, которая используется в основном приложении в качестве фреймворка.

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

 NSString *resourcePath = [[NSBundle mainBundle] resourcePath]; NSString *path = [NSString stringWithFormat:@"%@/sound.mp3", resourcePath]; NSURL *url = [NSURL fileURLWithPath:path]; NSError *error = nil; AVAudioPlayer *audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:&error]; [audioPlayer play]; 

Напротив, при попытке воспроизвести точно такой же звук (или любой другой) внутри библиотеки утилиты, используя тот же код, что и выше, звук вообще не воспроизводится, даже если ошибка равна нулю, а значения свойства аудиоплеера являются правильными (номер каналов, продолжительность).

Я убедился, что структура AVFoundation находится в обоих проектах.

Кроме того, мой class использует протокол AVAudioPlayerDelegate и реализует эти два метода:

 - (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag; - (void)audioPlayerDecodeErrorDidOccur:(AVAudioPlayer *)player error:(NSError *)error; 

Ни один из этих методов не вызван после попытки воспроизведения звука.

Если вместо этого я использую AudioToolbox , она воспроизводит звук. Но я заинтересован в использовании AVFoundation по нескольким причинам.

Любая идея о том, что происходит? Я что-то пропустил в AVFoundation ? Может ли это быть связано с использованием AVAudioPlayer из статической библиотеки?

Заранее спасибо.

Я нашел решение, и это связано с тем, о чем я не упоминал, и о нем не думал: я компилирую с помощью Automatic Reference Counting (ARC).

ARC вставляет вызов релиза звуковому проигрывателю, поэтому он освобождается сразу после выхода из метода, в котором он создан. Он не имеет ничего общего с AVAudioPlayer но с ARC.

Чтобы решить эту проблему, я просто создал атрибут AVAudioPlayer для classа, который имеет дело со звуками, чтобы он больше не был выпущен ARC. Ну, по крайней мере, он не будет выпущен до тех пор, пока не будет выпущен экземпляр этого classа.

Для получения дополнительной информации об ARC см. Автоматический подсчет ссылок: «Обнуление слабых ссылок» с подробной информацией о том, почему у меня была эта проблема.

Да, конечно; ARC была причиной моего кода.

Я ввел свойство:

 @property (strong, nonatomic) AVAudioPlayer *audioPlayer; 

и это заставило все работать нормально.

используйте это, он будет работать определенно ….

 AVAudioSession *session = [AVAudioSession sharedInstance]; [session setCategory:AVAudioSessionCategoryPlayback error:nil]; NSURL *url = [NSURL fileURLWithPath:@"path of the sound file :)"]; _player = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil]; [_player setDelegate:self]; [_player prepareToPlay]; [_player play]; 

Вы настроили AVAudioSession?

У меня была аналогичная проблема и исправил ее, используя что-то вроде этого:

 AVAudioSession *audioSession = [AVAudioSession sharedInstance]; [audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error:NULL]; 

или

 [audioSession setCategory:AVAudioSessionCategoryPlayback error:NULL]; 

Надеюсь, поможет.

Даже имея объявленный в classе class audioPlayer var, он не будет воспроизводиться. По крайней мере, на физическом устройстве iOS 10 iPhone 5c.

play() true поэтому ошибок не возникает.

Пришлось добавить это ( Swift 3, 4 ), и теперь он правильно воспроизводит звук.

 let session = AVAudioSession.sharedInstance() try! session.setCategory(AVAudioSessionCategoryPlayback) 

Я создал проект с открытым исходным кодом для простого аудиоплеера. Взгляните на него, если у вас возникли проблемы с воспроизведением звука в iOS (также в фоновом режиме): https://github.com/wzbozon/DKAudioPlayer

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


 NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"sounds-1027-are-you-kidding" ofType:@"mp3"]]; AVAudioPlayer *audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil]; [audioPlayer play]; sleep(2); 

Я была такая же проблема. Я решил это, добавив ниже строку в файле .h:

 @property (strong, nonatomic) AVAudioPlayer *audioPlayer; 

И в .m файле:

 NSError *error; NSString *soundFilePath = [NSString stringWithFormat:@"%@/dancepechance.mp3", [[NSBundle mainBundle] resourcePath]]; NSURL *url = [NSURL fileURLWithPath:soundFilePath]; self.audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:&error]; NSLog(@"Error %@",error); [self.audioPlayer prepareToPlay]; [self.audioPlayer play]; 

Вы можете использовать AVPlayerViewController из AVKit вместо этого для аудио и видео. Код доступен для быстрого и объективного c здесь .

Быстрое решение:

  import AVFoundation // define your player in class var player = AVAudioPlayer() override func viewDidLoad() { super.viewDidLoad() } 
  • Перемещение UIView (изображение и текст)
  • View-based NSTableView с строками с динамическими высотами
  • Как использовать CaptiveNetwork для получения текущего имени точки доступа Wi-Fi
  • strong / weak / keep / unsafe_unretained / assign
  • как сделать программный снимок экрана для iPhone?
  • Выполнение команды терминала из приложения Cocoa
  • Программно включить Bluetooth в iphone sdk?
  • Как Apple знает, что вы используете частный API?
  • Что такое простой способ разбить NSArray с 4000+ объектами в нем на несколько массивов с 30 объектами каждый?
  • Вам нужно создать NSAutoreleasePool в блоке в GCD?
  • Ошибка UIActivityViewController на iOS 8 iPads
  • Давайте будем гением компьютера.