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 изнутри статический библиотека?



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

683   10  

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

    Ничего не найдено.