Подтвердить что ты не робот

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

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

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

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

@property (strong, nonatomic) AVAudioPlayer *audioPlayer;

и это сделало все хорошо.

Ответ 3

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

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];

Ответ 4

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

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

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

или

[audioSession setCategory:AVAudioSessionCategoryPlayback error:NULL];

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

Ответ 5

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

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

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

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

Ответ 6

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

Ответ 7

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

  import AVFoundation

  // define your player in class
  var player = AVAudioPlayer()

  override func viewDidLoad() {
    super.viewDidLoad() 
  }

Ответ 8

У меня была такая же проблема. Я решил это, добавив ниже строку в файле .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];

Ответ 9

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


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);