Воспроизведение короткого звука в iOS
Я думаю, я мог бы использовать AVAudioPlayer
чтобы воспроизвести звук, однако, мне нужно просто воспроизвести короткий звук, и мне не нужны никакие петли или мелкозернистый контроль над громкостью и т. д.
существует ли простой способ сделать это?
13 ответов:
каждый из других ответов утечки памяти (если ARC не включен для один ответы)... как ни странно, ответ, первоначально помеченный как правильный, имеет вызов
retainCount
без видимых причин.если вы
alloc/init
что-то, это должно быть освобождено (если вы не используете ARC).если вы называете
AudioServicesCreateSystemSoundID()
вы должны избавиться от получившегося звука.посмотреть аудио UI звучит образец.
по сути:
@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.рамки#import <AudioToolbox/AudioToolbox.h>
для коротких звуковых клипов (менее 30 секунд) есть библиотека SystemSounds, которая действительно хороша.
плюсы: Вам не нужно управлять настройками громкости отдельно. Звук воспроизводится в отдельном потоке, а загрузка и воспроизведение аудиоклипа-v быстро. Короче говоря, вы относитесь к этому клипу как к другому системному звуку.
минусы: вы не можете обеспечить отдельную настройку управления звуком. Он привязан к настройкам системных звуков. Вы не можете играть более 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]; }
Свифт
другие ответы здесь используют Objective-C, поэтому я предоставляю быструю версию здесь. Swift использует автоматический подсчет ссылок (ARC), поэтому я не знаю о каких-либо проблемах с утечкой памяти с этим ответом (как предупреждено в принятом ответе).
С Помощью AudioToolbox
можно использовать
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) } } }
Примечания:
- этот пример адаптирован из как играть короткий звуковой клип с AudioToolbox в Swift.
- не забудьте добавить
yourAudioFileName.mp3
(или.wav
, etc) к вашему проекту.- не забудьте
import AudioToolbox
- этот ответ помещает код в нажатие кнопки IBAction, но его можно так же легко поместить в другую функцию, конечно.
используя AVAudioPlayer
импорт
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 } }
Примечания:
- этот пример адаптирован из научитесь кодировать приложения iOS с помощью Swift Tutorial 5: сделать его красивым (добавление Звук)
- не забудьте
import AVFoundtation
и добавитьyourAudioFileName.mp3
в проект.
недавно я использовал этот код для воспроизведения короткого 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
я использовал этот код для воспроизведения короткого aiff-звука на iOS
#import <AudioToolbox/AudioServices.h> SystemSoundID completeSound; NSURL *audioPath = [[NSBundle mainBundle] URLForResource:@"downloadCompleted" withExtension:@"aiff"]; AudioServicesCreateSystemSoundID((CFURLRef)audioPath, &completeSound); AudioServicesPlaySystemSound (completeSound);
надеюсь, что это помогает.
ПРОСТАЯ ЧИСТАЯ ВЕРСИЯ SWIFT 3
Мне нравится больше контроля над моими звуками, поэтому я использую 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
выход в свой класс, чтобы иметь возможность остановить звук.. Что вы не делаете, если вы просто хотите короткий звук.используйте дугу... и я никогда ничего не делал с NSError, так что используйте его, если хотите...
многие ответы сбивают с толку, а некоторые используют
AudioToolbox
рамки, отличные отAVAudioFoundation
основы... вот что я сделал. В.h
файл, я вставил этот код в:
@property (nonatomic, retain) AVAudioPlayer *player;
этот код объявляет аудиоплеер с именем " player.- В , под
@implementation
декларации, добавьте@synthesize player
. Это синтезирует, чтоplayer
собственность.в любой функции вы хотите, связать свой звук в плеер, добавив эту строку кода, где
yourSound
- имя звукового файла, иaif
- это расширение файла:
player = [[AVAudioPlayer alloc] initWithContentsOfURL:[[NSBundle mainBundle] URLForResource:@"yourSound" withExtension:@"aif"] error:nil]
я знаю, что в документации Apple говорится объявить строку и NSURL, но если вы объедините ее в одну строку, вам не придется избавляться от нее впоследствии. Кроме того, поскольку это свойство в своем
ViewController.m
файл, то вам не придется продолжать устанавливать этоplayer
объект, чтобы связать с вашей звуковой.другие ответы также включены с помощью
SystemSoundID
, но это также накладывает ограничения, такие как "файл не может быть более 30 секунд", "он должен быть в определенном формате" и работает. При этом он может воспроизводить несколько звуков одновременно (в случае, если вы разрабатываете Деку), и легче создавать звуки.чтобы на самом деле воспроизвести звук, вставьте эту строку (и да, это действительно так просто):
[player play]
если вы используете ARC, вы не можете вручную избавиться от игрока, так как система будет сделай это для себя. Если вы новичок в разработке и используете последнюю версию Xcode, то у вас включена ARC. Если по какой-то странной причине вы этого не сделаете, то код для утилизации ресурсов, используемых
player
- это:
[player release]
С Помощью Swift 4
import AudioToolbox func playSoundEasy(note : String) { var soundURL: NSURL? var soundID: SystemSoundID = 0 let filePath = Bundle.main.path(forResource: note, ofType: "wav") soundURL = NSURL(fileURLWithPath: filePath!) if let url = soundURL { AudioServicesCreateSystemSoundID(url, &soundID) AudioServicesPlaySystemSound(soundID) }
}
с звук работает только на устройстве, но не в симулятор
Ник создана библиотека, которая может быть использована для воспроизведения звуков в приложениях iOS и Mac.
посмотреть nicklockwood / SoundManager
пожалуйста, обратитесь к простое воспроизведение аудио 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); }
Проверьте systemsound для воспроизведения короткого аудиофайла
включить audiotoolbox framework
и создать
systemsoundid object
NSString *soundPath = [[NSBundle mainBundle] pathForResource:file ofType:@"aiff"]; AudioServicesCreateSystemSoundID((CFURLRef)[NSURL fileURLWithPath: soundPath], &soundID); AudioServicesPlaySystemSound (soundID);