Создание и воспроизведение звука в Swift
Итак, что я хочу сделать, это создать и воспроизвести звук в swift, который будет воспроизводиться при нажатии кнопки, я знаю, как это сделать в Objective-C, но кто-нибудь знает, как в Swift?
Это было бы так для Objective-C:
NSURL *soundURL = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"mysoundname" ofType:@"wav"]];
AudioServicesCreateSystemSoundID((__bridge CFURLRef)soundURL, &mySound);
а потом играть в нее я бы сделал:
AudioServicesPlaySystemSound(Explosion);
кто-нибудь знает как я могу это сделать?
19 ответов:
вот немного кода, который я добавил в FlappySwift, который работает:
import SpriteKit import AVFoundation class GameScene: SKScene { // Grab the path, make sure to add it to your project! var coinSound = NSURL(fileURLWithPath: Bundle.main.path(forResource: "coin", ofType: "wav")!) var audioPlayer = AVAudioPlayer() // Initial setup override func didMoveToView(view: SKView) { audioPlayer = AVAudioPlayer(contentsOfURL: coinSound, error: nil) audioPlayer.prepareToPlay() } // Trigger the sound effect when the player grabs the coin func didBeginContact(contact: SKPhysicsContact!) { audioPlayer.play() } }
это похоже на некоторые другие ответы, но, возможно, немного более "быстрый":
// Load "mysoundname.wav" if let soundURL = Bundle.main.url(forResource: "mysoundname", withExtension: "wav") { var mySound: SystemSoundID = 0 AudioServicesCreateSystemSoundID(soundURL as CFURL, &mySound) // Play AudioServicesPlaySystemSound(mySound); }обратите внимание, что это тривиальный пример, воспроизводящий эффект код в вопрос. Вам нужно будет убедиться, что
import AudioToolbox, плюс общий шаблон для такого рода кода будет загружать ваши звуки, когда ваше приложение запускается, сохраняя их вSystemSoundIDпеременные экземпляра где-то, используйте их во всем вашем приложении, а затем позвонитеAudioServicesDisposeSystemSoundIDкогда вы закончите с ними.
удобный Swift расширение:
import AudioToolbox extension SystemSoundID { static func playFileNamed(fileName: String, withExtenstion fileExtension: String) { var sound: SystemSoundID = 0 if let soundURL = NSBundle.mainBundle().URLForResource(fileName, withExtension: fileExtension) { AudioServicesCreateSystemSoundID(soundURL, &sound) AudioServicesPlaySystemSound(sound) } } }затем, из любого места в вашем приложении (не забудьте
import AudioToolbox), вы можете позвонитьSystemSoundID.playFileNamed("sound", withExtenstion: "mp3")для воспроизведения "sound. mp3"
Это создает
SystemSoundIDиз файла под названиемCha-Ching.aiff.import AudioToolbox let chaChingSound: SystemSoundID = createChaChingSound() class CashRegisterViewController: UIViewController { override func viewWillAppear(animated: Bool) { super.viewWillAppear(animated) AudioServicesPlaySystemSound(chaChingSound) } } func createChaChingSound() -> SystemSoundID { var soundID: SystemSoundID = 0 let soundURL = CFBundleCopyResourceURL(CFBundleGetMainBundle(), "Cha-Ching", "aiff", nil) AudioServicesCreateSystemSoundID(soundURL, &soundID) CFRelease(soundURL) return soundID }
С классом & AudioToolbox:
import AudioToolbox class Sound { var soundEffect: SystemSoundID = 0 init(name: String, type: String) { let path = NSBundle.mainBundle().pathForResource(name, ofType: type)! let pathURL = NSURL(fileURLWithPath: path) AudioServicesCreateSystemSoundID(pathURL as CFURLRef, &soundEffect) } func play() { AudioServicesPlaySystemSound(soundEffect) } }использование:
testSound = Sound(name: "test", type: "caf") testSound.play()
import AVFoundation var audioPlayer = AVAudioPlayer() class GameScene: SKScene { override func didMoveToView(view: SKView) { let soundURL = NSBundle.mainBundle().URLForResource("04", withExtension: "mp3") audioPlayer = AVAudioPlayer(contentsOfURL: soundURL, error: nil) audioPlayer.play() } }
этот код работает для меня. Используйте Try and Catch для AVAudioPlayer
import UIKit import AVFoundation class ViewController: UIViewController { //Make sure that sound file is present in your Project. var CatSound = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("Meow-sounds.mp3", ofType: "mp3")!) var audioPlayer = AVAudioPlayer() override func viewDidLoad() { super.viewDidLoad() do { audioPlayer = try AVAudioPlayer(contentsOfURL: CatSound) audioPlayer.prepareToPlay() } catch { print("Problem in getting File") } // Do any additional setup after loading the view, typically from a nib. } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } @IBAction func button1Action(sender: AnyObject) { audioPlayer.play() } }
var mySound = NSSound(named:"Morse.aiff") mySound.play()"Морзе.aiff " - это системный звук OSX, но если вы просто нажмете на "named" в XCode, вы сможете просмотреть (в панели QuickHelp), где эта функция выполняет поиск звуков. Он может быть в папке "Supporting files"
в соответствии с новым Swift 2.0 мы должны использовать do try catch. Код будет выглядеть так:
var badumSound = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("BadumTss", ofType: "mp3")) var audioPlayer = AVAudioPlayer() do { player = try AVAudioPlayer(contentsOfURL: badumSound) } catch { print("No sound found by URL:\(badumSound)") } player.prepareToPlay()
это работает с Swift 4 :
if let soundURL = Bundle.main.url(forResource: "note3", withExtension: "wav") { var mySound: SystemSoundID = 0 AudioServicesCreateSystemSoundID(soundURL as CFURL, &mySound) // Play AudioServicesPlaySystemSound(mySound); }
давайте рассмотрим более обновленный подход к этому вопросу:
Import AudioToolbox func noteSelector(noteNumber: String) { if let soundURL = Bundle.main.url(forResource: noteNumber, withExtension: "wav") { var mySound: SystemSoundID = 0 AudioServicesCreateSystemSoundID(soundURL as CFURL, &mySound) AudioServicesPlaySystemSound(mySound) }
решение Мэтта Гибсона работало для меня, вот версия swift 3.
if let soundURL = Bundle.main.url(forResource: "ringSound", withExtension: "aiff") { var mySound: SystemSoundID = 0 AudioServicesCreateSystemSoundID(soundURL as CFURL, &mySound) AudioServicesPlaySystemSound(mySound); }
Swift 4
import UIKit import AudioToolbox class ViewController: UIViewController{ var sounds : [SystemSoundID] = [1, 2, 3, 4, 5, 6, 7] override func viewDidLoad() { super.viewDidLoad() for index in 0...sounds.count-1 { let fileName : String = "note\(sounds[index])" if let soundURL = Bundle.main.url(forResource: fileName, withExtension: "wav") { AudioServicesCreateSystemSoundID(soundURL as CFURL, &sounds[index]) } } } @IBAction func notePressed(_ sender: UIButton) { switch sender.tag { case 1: AudioServicesPlaySystemSound(sounds[0]) case 2: AudioServicesPlaySystemSound(sounds[1]) case 3: AudioServicesPlaySystemSound(sounds[2]) case 4: AudioServicesPlaySystemSound(sounds[3]) case 5: AudioServicesPlaySystemSound(sounds[4]) case 6: AudioServicesPlaySystemSound(sounds[5]) default: AudioServicesPlaySystemSound(sounds[6]) } } }или
import UIKit import AVFoundation class ViewController: UIViewController, AVAudioPlayerDelegate{ var audioPlayer : AVAudioPlayer! override func viewDidLoad() { super.viewDidLoad() } @IBAction func notePressed(_ sender: UIButton) { let soundURL = Bundle.main.url(forResource: "note\(sender.tag)", withExtension: "wav") do { audioPlayer = try AVAudioPlayer(contentsOf: soundURL!) } catch { print(error) } audioPlayer.play() } }
работает в
Xcode 9.2if let soundURL = Bundle.main.url(forResource: "note1", withExtension: "wav") { var mySound: SystemSoundID = 0 AudioServicesCreateSystemSoundID(soundURL as CFURL, &mySound) // Play AudioServicesPlaySystemSound(mySound); }
//Swift 4 import UIKit import AVFoundation class ViewController: UIViewController { var player : AVAudioPlayer? override func viewDidLoad() { super.viewDidLoad() } @IBAction func notePressed(_ sender: UIButton) { let path = Bundle.main.path(forResource: "note1", ofType: "wav")! let url = URL(fileURLWithPath: path) do { player = try AVAudioPlayer(contentsOf: url) player?.play() } catch { // error message } } }
Swift пример кода:
import UIKit import AudioToolbox class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() } @IBAction func notePressed(_ sender: UIButton) { // Load "mysoundname.wav" if let soundURL = Bundle.main.url(forResource: "note1", withExtension: "wav") { var mySound: SystemSoundID = 0 AudioServicesCreateSystemSoundID(soundURL as CFURL, &mySound) // Play AudioServicesPlaySystemSound(mySound); } }
используйте эту функцию, чтобы сделать звук в Swift (вы можете использовать эту функцию, где вы хотите сделать звук.)
Сначала добавьте SpriteKit и AVFoundation Framework.
import SpriteKit import AVFoundation func playEffectSound(filename: String){ runAction(SKAction.playSoundFileNamed("\(filename)", waitForCompletion: false)) }// use this function to play sound playEffectSound("Sound File Name With Extension") // Example :- playEffectSound("BS_SpiderWeb_CollectEgg_SFX.mp3")
этот код работает для меня:
class ViewController: UIViewController { var audioFilePathURL : NSURL! var soundSystemServicesId : SystemSoundID = 0 override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. audioFilePathURL = NSBundle.mainBundle().URLForResource("MetalBell", withExtension: "wav") AudioServicesCreateSystemSoundID( audioFilePathURL, &soundSystemServicesId) } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } @IBAction func PlayAlertSound(sender: UIButton) { AudioServicesPlayAlertSound(soundSystemServicesId) } }
на Swift 3:
extension SystemSoundID { static func playFileNamed(_ fileName: String, withExtenstion fileExtension: String) { var sound: SystemSoundID = 0 if let soundURL = Bundle.main.url(forResource: fileName, withExtension: fileExtension) { AudioServicesCreateSystemSoundID(soundURL as CFURL, &sound) AudioServicesPlaySystemSound(sound) } } }
Comments