Думаю, я мог бы использовать AVAudioPlayer
для воспроизведения звука, однако мне нужно просто сыграть короткий звук, и мне не нужны никакие петли или мелкозернистый контроль над томом и т.д.
Есть ли простой способ сделать это?
Думаю, я мог бы использовать AVAudioPlayer
для воспроизведения звука, однако мне нужно просто сыграть короткий звук, и мне не нужны никакие петли или мелкозернистый контроль над томом и т.д.
Есть ли простой способ сделать это?
Каждый один из ответов отвечает на утечку памяти (если только для ARC не разрешен один из ответов)... странно, ответ, первоначально обозначенный как правильный, имеет вызов retainCount
без видимых причин.
Если вы alloc/init
что-то, его нужно освободить (если вы не используете ARC).
Если вы вызываете AudioServicesCreateSystemSoundID()
, вы должны избавиться от результирующего звука.
См. пример Audio UI Sounds.
В принципе:
@interface MyClass:UI*ViewController // fixed
{
SystemSoundID mySound;
}
@implementation MyClass
- (void) viewDidLoad {
[super viewDidLoad];
AudioServicesCreateSystemSoundID(.... URL ...., &mySound);
}
- (void) playMySoundLikeRightNowReally {
AudioServicesPlaySystemSound(mySound);
}
- (void) dealloc {
AudioServicesDisposeSystemSoundID(mySound);
[super dealloc]; // only in manual retain/release, delete for ARC
}
@end
Для полноты:
добавить AudioToolbox.framework #import <AudioToolbox/AudioToolbox.h>
Для коротких звуковых клипов (менее 30 секунд) есть библиотека SystemSounds, которая действительно хороша.
Плюсы: Вам не нужно управлять настройками громкости отдельно. Звук воспроизводится в отдельном потоке, а загрузка и воспроизведение аудиоклипа - быстро. Короче говоря, вы рассматриваете этот клип как еще один системный звук.
Минусы: вы не можете предоставить отдельную настройку управления звуком. Он привязан к настройкам системных звуков. Вы не можете играть более 30 секунд. Вероятно, вы не можете применять звуковые фильтры для улучшения звукового эффекта.
Есть, конечно, больше плюсов и минусов, но это некоторые из них, о которых я мог подумать, с моей головы.
используйте этот импорт: <AudioToolbox/AudioToolbox.h>
Добавить систему AudioToolbox
затем вызовите метод ниже, например [self playSound], где бы вы не захотели воспроизвести клип.
-(void) playSound {
NSString *soundPath = [[NSBundle mainBundle] pathForResource:@"changeTrack" ofType:@"aif"];
SystemSoundID soundID;
AudioServicesCreateSystemSoundID((CFURLRef)[NSURL fileURLWithPath: soundPath], &soundID);
AudioServicesPlaySystemSound (soundID);
[soundPath release];
}
С любовью я использовал этот код для воспроизведения короткого mp3-звука, который работал нормально: -
объявите это ниже @implementation
NSString *path;
NSURL *url;
//where you are about to add sound
path =[[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"quotes_%d",soundTags] ofType:@"mp3"];
url = [NSURL fileURLWithPath:path];
player = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:NULL];
[player setVolume:1.0];
[player play];
//just add AVFoundation framework
Другие ответы здесь используют Objective-C, поэтому я предоставляю версию Swift здесь. Swift использует автоматический подсчет ссылок (ARC), поэтому я не знаю о проблемах с утечкой памяти с этим ответом (о чем предупреждается в принятом ответе).
Вы можете использовать фреймворк AudioToolbox
для воспроизведения коротких звуков, когда вам не нужно много контролировать, как они воспроизводятся.
Вот как вы его настроили:
import UIKit
import AudioToolbox
class PlaySoundViewController: UIViewController {
var soundURL: NSURL?
var soundID: SystemSoundID = 0
@IBAction func playSoundButtonTapped(sender: AnyObject) {
let filePath = NSBundle.mainBundle().pathForResource("yourAudioFileName", ofType: "mp3")
soundURL = NSURL(fileURLWithPath: filePath!)
if let url = soundURL {
AudioServicesCreateSystemSoundID(url, &soundID)
AudioServicesPlaySystemSound(soundID)
}
}
}
Примечания:
yourAudioFileName.mp3
(или .wav
и т.д.) в ваш проект.import AudioToolbox
Импортируя фреймворк AVFoundation
, вы можете использовать AVAudioPlayer
. Он работает как для коротких аудиоклипов, так и для длинных песен. У вас также больше контроля над воспроизведением, чем с помощью метода AudioToolbox.
Вот как вы его настроили:
import UIKit
import AVFoundation
class PlaySoundViewController: UIViewController {
var mySound: AVAudioPlayer?
// a button that plays a sound
@IBAction func playSoundButtonTapped(sender: AnyObject) {
mySound?.play() // ignored if nil
}
override func viewDidLoad() {
super.viewDidLoad()
// initialize the sound
if let sound = self.setupAudioPlayerWithFile("yourAudioFileName", type: "mp3") {
self.mySound = sound
}
}
func setupAudioPlayerWithFile(file: NSString, type: NSString) -> AVAudioPlayer? {
let path = NSBundle.mainBundle().pathForResource(file as String, ofType: type as String)
let url = NSURL.fileURLWithPath(path!)
var audioPlayer: AVAudioPlayer?
do {
try audioPlayer = AVAudioPlayer(contentsOfURL: url)
} catch {
print("Player not available")
}
return audioPlayer
}
}
Примечания:
import AVFoundtation
и добавьте yourAudioFileName.mp3
в свой проект.Я использовал этот код для воспроизведения короткого звукового сигнала на iOS
#import <AudioToolbox/AudioServices.h>
SystemSoundID completeSound;
NSURL *audioPath = [[NSBundle mainBundle] URLForResource:@"downloadCompleted" withExtension:@"aiff"];
AudioServicesCreateSystemSoundID((CFURLRef)audioPath, &completeSound);
AudioServicesPlaySystemSound (completeSound);
Надеюсь, что это поможет.
ПРОСТОТА CLEAN SWIFT 3 VERSION
Мне нравится больше контролировать мои звуки, поэтому я использую AVFoundation.
import AVFoundation
class TodayViewController: UIViewController {
var clink: AVAudioPlayer?
var shatter: AVAudioPlayer?
override func viewDidLoad() {
super.viewDidLoad()
// initialize the sound
shatter = setupAudioPlayer(withFile: "shatter", type: "wav")
clink = setupAudioPlayer(withFile: "clink", type: "wav")
}
func setupAudioPlayer(withFile file: String, type: String) -> AVAudioPlayer? {
let path = Bundle.main.path(forResource: file, ofType: type)
let url = NSURL.fileURL(withPath: path!)
return try? AVAudioPlayer(contentsOf: url)
}
func onClick() {
clink?.play()
}
}
Убедитесь, что звуковой файл добавлен в ваш проект, и вы импортируете AVFoundation.
Мой ответ - ответ Билла, но я использую его без init или dealloc и отпускаю звук после его воспроизведения:
- (void)playSound:(NSURL *)url
SystemSoundID ssID = 0;
AudioServicesCreateSystemSoundID((CFURLRef)url, &ssID);
AudioServicesAddSystemSoundCompletion(ssID, NULL, NULL, (AudioServicesSystemSoundCompletionProc)MyAudioServicesSystemSoundCompletionProc, NULL);
AudioServicesPlaySystemSound(ssID);
//AudioServicesDisposeSystemSoundID(ssID);
}
void MyAudioServicesSystemSoundCompletionProc (SystemSoundID ssID, void *clientData) {
AudioServicesDisposeSystemSoundID(ssID);
}
Вот быстрый метод, который вы можете скопировать и использовать в своем приложении:
-(BOOL) playSoundFXnamed: (NSString*) vSFXName Loop: (BOOL) vLoop
{
NSError *error;
NSBundle* bundle = [NSBundle mainBundle];
NSString* bundleDirectory = (NSString*)[bundle bundlePath];
NSURL *url = [NSURL fileURLWithPath:[bundleDirectory stringByAppendingPathComponent:vSFXName]];
AVAudioPlayer *audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:&error];
if(vLoop)
audioPlayer.numberOfLoops = -1;
else
audioPlayer.numberOfLoops = 0;
BOOL success = YES;
if (audioPlayer == nil)
{
success = NO;
}
else
{
success = [audioPlayer play];
}
return success;
}
Затем просто:
[self playSoundFXnamed:@"someAudio.mp3" Loop: NO];
Если вы собираетесь зацикливаться, вам нужно взять ваш AVAudioPlayer *audioPlayer
в свой класс, чтобы остановить звук. Который вы не хотите, если вам нужен короткий звук.
Использовать ARC... и я никогда ничего не делал с NSError, поэтому используйте его, если вам нравится...
Много ответов путают, а некоторые используют структуру AudioToolbox
, отличную от рамки AVAudioFoundation
... вот что я сделал. В файле .h
я помещаю этот код в:
@property (nonatomic, retain) AVAudioPlayer *player;
Этот код объявляет аудиоплеер с именем "player". В файле .m
в вашем объявлении @implementation
добавьте @synthesize player
. Это синтезирует свойство player
.
В любой функции, которую вы хотите, привяжите свой звук к плееру, добавив эту строку кода, где yourSound
- это имя звукового файла, а aif
- расширение вашего файла:
player = [[AVAudioPlayer alloc] initWithContentsOfURL:[[NSBundle mainBundle] URLForResource:@"yourSound" withExtension:@"aif"] error:nil]
Я знаю, что Apple Documentation заявляет, что объявляет строку и NSURL, но если вы объедините ее в одну строку, тогда вам не придется ее удалять. Кроме того, поскольку это свойство в вашем файле ViewController.m
, вам не нужно будет устанавливать этот объект player
для привязки к вашему звуку.
Другие ответы также включали использование SystemSoundID
, но также налагали такие ограничения, как "файл не может быть более 30 секунд", "он должен быть в определенном формате" и работает. При этом он может воспроизводить несколько звуков за раз (в случае, если вы разрабатываете звуковую плату), и легче создавать звуки.
Чтобы воспроизвести звук, вставьте эту строку (и да, это действительно так просто):
[player play]
Если вы используете ARC, вы не можете вручную утилизировать плеер, так как система сделает это за вас. Если вы новичок в разработке, и используете самую последнюю версию Xcode, у вас есть ARC. Если по какой-то странной причине вы этого не сделаете, то код для утилизации ресурсов, используемых player
, следующий:
[player release]
Из Звук работает только на устройстве, но не в симуляторе.
Nick создана библиотека, которая может использоваться для воспроизведения звуков в приложениях iOS и Mac.
Пожалуйста, обратитесь к Простое воспроизведение аудио iOS
- (void)playSound
{
SystemSoundID soundId;
// NSURL *soundURL = [[NSBundle mainBundle] URLForResource:@"sample"
// withExtension:@"caf"];
// AudioServicesCreateSystemSoundID((__bridge CFURLRef)soundURL, &soundId);
NSString *path = [[NSBundle mainBundle] pathForResource:@"sample" ofType:@"mp3"];
AudioServicesCreateSystemSoundID((__bridge CFURLRef)[NSURL fileURLWithPath:path], &soundId);
AudioServicesAddSystemSoundCompletion(soundId,
NULL,
NULL,
systemAudioCallback,
NULL);
AudioServicesPlaySystemSound(soundId);
//AudioServicesPlayAlertSound(soundId);
}
- (void) systemAudioCallback(SystemSoundID soundId, void *clientData)
{
AudioServicesRemoveSystemSoundCompletion(soundId);
AudioServicesDisposeSystemSoundID(soundId);
}
Проверьте системное ограничение на воспроизведение короткого аудиофайла
включает инфраструктуру audiotoolbox
и создайте
systemoundid object
NSString *soundPath = [[NSBundle mainBundle] pathForResource:file ofType:@"aiff"];
AudioServicesCreateSystemSoundID((CFURLRef)[NSURL fileURLWithPath: soundPath], &soundID);
AudioServicesPlaySystemSound (soundID);