Звук не воспроизводится с AVAudioPlayer - PullRequest
8 голосов
/ 01 апреля 2012

Я искал и считаю, что моя проблема совершенно уникальна. Мне известно об ошибке Simulator 5.1 при использовании AVAudioPlayer, которая не является моей проблемой. Я работаю на устройстве iOS 5.1.

Вот мой заголовочный файл:

#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>
#import <AVFoundation/AVAudioPlayer.h>

-(IBAction)pushBell;

@end

и мой файл реализации:

#import "BellViewController.h"

@interface BellViewController ()

@end

@implementation BellViewController

-(IBAction)pushBell {

    NSString *soundPath =[[NSBundle mainBundle] pathForResource:@"bell1" ofType:@"caf"];
    NSURL *soundURL = [NSURL fileURLWithPath:soundPath];
    NSError *error;

    AVAudioPlayer *theAudio = [[AVAudioPlayer alloc] initWithContentsOfURL:soundURL error:&error];
    [theAudio setDelegate:self];
    [theAudio setNumberOfLoops:0];
    [theAudio play];

}

@end

И у меня в .xib есть кнопка, которая воспроизводит файл.

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

Когда я нажимаю кнопку, я ничего не слышу. Там нет ошибок. Я не знаю, что не так.

Дополнительная информация iPhone 4 с iOS 5.1 Xcode 4.3.2 Аудио конвертируется в формат .caf со скоростью 700 кбит / с с помощью афконвертирования из большого файла .wav.

Ответы [ 6 ]

20 голосов
/ 01 апреля 2012

решаемая.

1.- Проверьте, был ли ваш файл добавлен в «Копирование ресурсов комплекта» на этапах сборки. Copy Bundle Resources

2.- ViewController.m

#import <AVFoundation/AVAudioPlayer.h>

@interface ViewController ()
@property (nonatomic, strong) AVAudioPlayer *theAudio;
- (IBAction)pushBell;
@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    NSString *soundPath =[[NSBundle mainBundle] pathForResource:@"beep-beep" ofType:@"caf"];
    NSURL *soundURL = [NSURL fileURLWithPath:soundPath];

    NSError *error = nil;
    self.theAudio = [[AVAudioPlayer alloc] initWithContentsOfURL:soundURL error:&error];
}

- (IBAction)pushBell {
    [self.theAudio play];
}

3.- Подключите IBAction к вашей кнопке в Интерфейсном Разработчике.

Готово.

19 голосов
/ 26 апреля 2012

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

Хотите верьте, хотите нет, но, похоже, есть ошибка (по крайней мере, в iOS 5.1 на iPad 2), в которой, если вы установили боковой переключатель в положение «Выключить звук», и он был отключен, затем установите боковой переключатель в положение «Блокировка вращения», звучит AVAudioPlayer. НЕ ИГРАТЬ, кроме как через наушники!

Поэтому мне пришлось перейти в приложение «Настройки», переключить переключатель обратно на «Без звука», затем включить звук iPad, снова переключить его на «Lock Rotation», и мое приложение начало работать правильно.

14 голосов
/ 01 апреля 2012

Ваш theAudio AVAudioPlayer освобождается до того, как он может даже начать воспроизведение (поскольку он размещен как локальная переменная внутри метода pushBell.

Измените свой код на:

заголовочный файл:

#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>
#import <AVFoundation/AVAudioPlayer.h>

@interface BellViewController:UIViewController

@property (nonatomic, strong) AVAudioPlayer *theAudio;

-(IBAction)pushBell;

@end

файл реализации:

#import "BellViewController.h"

@implementation BellViewController

@synthesize theAudio = _theAudio;

- (void)viewDidLoad {

    if (!theAudio) {

        NSString *soundPath =[[NSBundle mainBundle] pathForResource:@"bell1" ofType:@"caf"];
        NSURL *soundURL = [NSURL fileURLWithPath:soundPath];
        NSError *error;

        _theAudio = [[AVAudioPlayer alloc] initWithContentsOfURL:soundURL error:&error];
        [self.theAudio setDelegate:self];
        [self.theAudio setNumberOfLoops:0];

        [self.theAudio prepareToPlay];
    }
}

-(IBAction)pushBell {

   [self.theAudio play];
}

@end

Я предполагаю, что BellController - это UIViewController, если это другой тип класса, просто измените код соответствующим образом.

4 голосов
/ 01 апреля 2012

Я думаю, что это проблема памяти, вы должны создать экземпляр AVAudioPlayer *theAudio как объект глобального класса и инициализировать его в методе init.Затем просто запустите метод [theAudio play]; в методе -(IBAction)pushBell.

Я ответил, что сделал аналогичную проблему, связанную с воспроизведением системного звука (что на самом деле и есть то, что вы пытаетесь сделать), проверьте мойОтвет внизу:

Не удалось воспроизвести системный звук после переключения на iOS 5

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

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

2 голосов
/ 01 апреля 2012

Я согласен с hooleyhoop. Попробуйте

NSLog(@"%@", error.userInfo) 

чтобы увидеть, что выходит.

Другой альтернативой может быть установка объекта игрока в viewDidLoad или initWithNib и сохранение его как свойства вашего объекта. Таким образом, вы можете использовать что-то вроде [self.theAudio prepareToPlay];

Чтобы не загружать звук при каждом нажатии кнопки, это может сэкономить вам время, если звук высокого качества. Затем просто вызовите [self.theAudio play]; в вас IBAction метод.

Извините, если этот ответ немного неаккуратный - печатать на iPad, поэтому невозможно проверить дважды.

1 голос
/ 01 апреля 2012

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

Код:

[theAudio prepareToPlay];

[self performSelector:@selector(playMusic) withObject:nil afterDelay:3.0];
...