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 база в обоих проекты.
кроме того, мой класс использует AVAudioPlayerDelegate протокол и реализует эти два метода:
- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag;
- (void)audioPlayerDecodeErrorDidOccur:(AVAudioPlayer *)player error:(NSError *)error;
ни один из этих методов вызывается после попытки воспроизведения звука.
если я использую AudioToolbox рамки вместо этого, то он воспроизводит звук. Но я заинтересован в использовании AVFoundation по нескольким причинам.
есть идеи, что происходит? Я что-то упустил AVFoundation? Может ли это быть связано с использованием AVAudioPlayer изнутри статический библиотека?
спасибо заранее.
10 ответов:
Я нашел решение, и это связано с чем-то, о чем я не упоминал и не думал: я компилирую с автоматическим подсчетом ссылок (ARC).
ARC вставляет вызов release в аудиоплеер, поэтому он освобождается сразу после выхода из метода, где он создан. Это не имеет ничего общего с
AVAudioPlayerно с дугой.чтобы решить эту проблему, я просто создал
AVAudioPlayerатрибут к классу, который имеет дело со звуками, так что он больше не выпускается по дуге. Ну, по крайней мере, он не выпущен, пока не будет выпущен экземпляр этого класса.дополнительную информацию о 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];надеюсь, что это помогает.
даже если аудиоплеер 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;и в .файл м :
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 вместо аудио и видео. Код доступен как для swift, так и для objective c здесь.
Быстрое Решение:
import AVFoundation // define your player in class var player = AVAudioPlayer() override func viewDidLoad() { super.viewDidLoad() }
Comments