2016-08-16 4 views
1

Я хочу воспроизвести аудио на Button клик. Я попробовал этот код, но звук не играет: -звук не воспроизводится при нажатии кнопки

NSString *soundFilePath = [[NSBundle mainBundle] pathForResource:@"sound" ofType:@"mp3"]; 
NSURL *soundFileURL = [NSURL fileURLWithPath:soundFilePath]; 
AVAudioPlayer *audioPlayer = [[AVAudioPlayer alloc] initWithData:soundFileURL error:nil]; 
audioPlayer.delegate = self; 
audioPlayer.volume=1.0; 
[audioPlayer setNumberOfLoops:1]; 
[audioPlayer play]; 
+1

что выход вы получите здесь 'soundFileURL' –

+0

Pls создать свойство AVAudioPlayer или объявить переменную экземпляра, так что объект AVAudioPlayer может иметь сферу за пределами этого метода. –

+0

, который поддерживает экземпляр 'AVAudioPlayer', когда ваш объем заканчивается? – holex

ответ

1

Во-первых, кажется, что Вы используете initWithData для получения доступа к звуковой файл, на который указывает URL.

Вместо этого вы должны использовать initWithContentsOfU‌RL.


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

Если созданная вами функция AVAudioPlayer находится внутри функции, она будет освобождена или освобождена в конце функции. Вот почему звук не воспроизводится.

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

Например, свойство объявлено в вашем заголовке, как

@property(strong, nonatomic) AVAudioPlayer *audioPlayer; 

и инициализирован в вашей реализации с

self.audioPlayer = [[AVAudioPlayer alloc] initWithData:soundFileURL error:nil]; 

Если это не решит проблему, то вопрос скорее всего, с файлом, на который указывает ваш URL-адрес.

+0

Это должно быть решение. –

0
NSString *soundFilePath = [NSString stringWithFormat:@"%@/test.mp3", 
    [[NSBundle mainBundle] resourcePath]]; 
NSURL *soundFileURL = [NSURL fileURLWithPath:soundFilePath]; 

AVAudioPlayer *player = [[AVAudioPlayer alloc] initWithContentsOfURL:soundFileURL error:nil]; 
player.numberOfLoops = -1; //Infinite 

[player play]; 
1

вы не создали пункт игрок

// декларировать в файле .h

AVPlayerItem *playerItem; 

// затем в .m файл

player = [AVPlayer playerWithPlayerItem:playerItem]; 

после этой игры его

[player play]; 
+0

Простите мое наблюдение, речь идет о «AVAudioPlayer», а не «AVPlayer». – Daniel

+0

Да, речь идет об аудиоплеере, но мне нужен проигрыватель для воспроизведения ... – Garry

+0

Я знаю, о чем вы говорите, и не обязательно явно создавать playerItem. Элемент игрока неявно создается, если AVPlayer включен с URL-адресом. Из документов на initWithURL «Этот метод неявно создает объект AVPlayerItem. Вы можете получить элемент игрока с помощью currentItem». – Daniel

0

печать "soundFileURL". проверьте, является ли оно нулевым (в случае, если soundFileURL содержит пробелы, которые он выводит/распечатывает null), и если это не нулевое значение, проверьте, правильно ли указано имя файла (например, здесь ваше имя файла «звук ")

0
var asyncaAudioPlayer: AVAudioPlayer! 

let audioFilePath = NSBundle.mainBundle().pathForResource(fileName, ofType: "mp3") 

let audioFileUrl = NSURL.fileURLWithPath(audioFilePath!) 

asyncaAudioPlayer = AVAudioPlayer(contentsOfURL: audioFileUrl, fileTypeHint: nil) 

audioPlayerArray.append(asyncaAudioPlayer) 

asyncaAudioPlayer.prepareToPlay() 


asyncaAudioPlayer.play() 
+0

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

0

Ваша проблема заключается в том, что вы устанавливаете NSURL для initWithData -> Wrong. В случае, если это звучит многократно, вы должны подготовить свой звук и сохранить его как сильное ref.

и вы должны использовать CGD и глобальную очередь вместо основной очереди.

-(void)onTouchUpInside{ 
     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{ 
     AVAudioPlayer *audioPlayer = [[AVAudioPlayer alloc] initWithData:self.soundFileData error:nil]; 
     audioPlayer.delegate = self; 
     audioPlayer.volume=1.0; 
     [audioPlayer setNumberOfLoops:1]; 
     if ([audioPlayer prepareToPlay] && [audioPlayer play]) 
     { 
      NSLog(@"play Success!"); 
     } 
     else 
     { 
      NSLog(@"Failed to play the audio file."); 
     } 

    }); 
} 
Смежные вопросы