Как воспроизвести звук с помощью Swift?
Я хотел бы воспроизвести звук с помощью Swift.
мой код работал в Swift 1.0, но теперь он больше не работает в Swift 2 или новее.
override func viewDidLoad() {
super.viewDidLoad()
let url:NSURL = NSBundle.mainBundle().URLForResource("soundName", withExtension: "mp3")!
do {
player = try AVAudioPlayer(contentsOfURL: url, fileTypeHint: nil)
} catch _{
return
}
bgMusic.numberOfLoops = 1
bgMusic.prepareToPlay()
if (Data.backgroundMenuPlayed == 0){
player.play()
Data.backgroundMenuPlayed = 1
}
}
8 ответов:
наиболее предпочтительно вы можете использовать AVFoundation. Он предоставляет все необходимое для работы с аудиовизуальными средствами массовой информации.
обновление: совместимая с Swift 2,Swift 3 и Swift 4 как было предложено некоторыми из вас в комментариях.
Swift 2.3
import AVFoundation var player: AVAudioPlayer? func playSound() { let url = NSBundle.mainBundle().URLForResource("soundName", withExtension: "mp3")! do { player = try AVAudioPlayer(contentsOfURL: url) guard let player = player else { return } player.prepareToPlay() player.play() } catch let error as NSError { print(error.description) } }
Swift 3
import AVFoundation var player: AVAudioPlayer? func playSound() { guard let url = Bundle.main.url(forResource: "soundName", withExtension: "mp3") else { return } do { try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback) try AVAudioSession.sharedInstance().setActive(true) let player = try AVAudioPlayer(contentsOf: url) player.play() } catch let error { print(error.localizedDescription) } }
Swift 4 (iOS 11 совместимый)
import AVFoundation var player: AVAudioPlayer? func playSound() { guard let url = Bundle.main.url(forResource: "soundName", withExtension: "mp3") else { return } do { try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback) try AVAudioSession.sharedInstance().setActive(true) /* The following line is required for the player to work on iOS 11. Change the file type accordingly*/ player = try AVAudioPlayer(contentsOf: url, fileTypeHint: AVFileType.mp3.rawValue) /* iOS 10 and earlier require the following line: player = try AVAudioPlayer(contentsOf: url, fileTypeHint: AVFileTypeMPEGLayer3) */ guard let player = player else { return } player.play() } catch let error { print(error.localizedDescription) } }убедитесь в том, чтобы изменить название мелодии, а также расширение. файл должен быть правильно импортированы (
Project Build Phases>Copy Bundle Resources). Вы можете поместить его вassets.xcassetsдля большее удобство.для коротких звуковых файлов вы можете пойти на несжатые аудио форматы, такие как
.wavС тех пор они имеют самое лучшее качество и низкое влияние процессора. Более высокое потребление дискового пространства не должно быть большим делом для коротких звуковых файлов. Чем длиннее файлы, вы можете пойти на сжатый формат, такой как.mp3etc. стр. Проверьте совместимый аудио форматы наCoreAudio.
Fun-факт: есть аккуратные маленькие библиотеки, которые делают воспроизведение звуков еще проще. :)
Например: SwiftySound
на Swift 3:
import AVFoundation /// **must** define instance variable outside, because .play() will deallocate AVAudioPlayer /// immediately and you won't hear a thing var player: AVAudioPlayer? func playSound() { guard let url = Bundle.main.url(forResource: "soundName", withExtension: "mp3") else { print("url not found") return } do { /// this codes for making this app ready to takeover the device audio try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback) try AVAudioSession.sharedInstance().setActive(true) /// change fileTypeHint according to the type of your audio file (you can omit this) player = try AVAudioPlayer(contentsOf: url, fileTypeHint: AVFileTypeMPEGLayer3) // no need for prepareToPlay because prepareToPlay is happen automatically when calling play() player!.play() } catch let error as NSError { print("error: \(error.localizedDescription)") } }лучшая практика для местных активов-поместить его внутрь
assets.xcassetsи вы загружаете файл следующим образом:func playSound() { guard let url = Bundle.main.url(forResource: "soundName", withExtension: "mp3") else { print("url not found") return } do { /// this codes for making this app ready to takeover the device audio try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback) try AVAudioSession.sharedInstance().setActive(true) /// change fileTypeHint according to the type of your audio file (you can omit this) /// for iOS 11 onward, use : player = try AVAudioPlayer(contentsOf: url, fileTypeHint: AVFileType.mp3.rawValue) /// else : /// player = try AVAudioPlayer(contentsOf: url, fileTypeHint: AVFileTypeMPEGLayer3) // no need for prepareToPlay because prepareToPlay is happen automatically when calling play() player!.play() } catch let error as NSError { print("error: \(error.localizedDescription)") } }
iOS 12-Xcode 10 beta 6-Swift 4.2
используйте только 1 IBAction и наведите все кнопки на это 1 действие.
import AVFoundation var player = AVAudioPlayer() @IBAction func notePressed(_ sender: UIButton) { print(sender.tag) // testing button pressed tag let path = Bundle.main.path(forResource: "note\(sender.tag)", ofType : "wav")! let url = URL(fileURLWithPath : path) do { player = try AVAudioPlayer(contentsOf: url) player.play() } catch { print ("There is an issue with this code!") } }
если код не генерирует никаких ошибок, но вы не слышите звук-создайте плеер в качестве экземпляра:
static var player: AVAudioPlayer!для меня первое решение работало, когда я сделал это изменение:)
Swift 3
import AVFoundation var myAudio: AVAudioPlayer! let path = Bundle.main.path(forResource: "example", ofType: "mp3")! let url = URL(fileURLWithPath: path) do { let sound = try AVAudioPlayer(contentsOf: url) myAudio = sound sound.play() } catch { // } //If you want to stop the sound, you should use its stop()method.if you try to stop a sound that doesn't exist your app will crash, so it's best to check that it exists. if myAudio != nil { myAudio.stop() myAudio = nil }
Swift 4 (iOS 12 совместимый)
var player: AVAudioPlayer? let path = Bundle.main.path(forResource: "note\(sender.tag)", ofType: "wav") let url = URL(fileURLWithPath: path ?? "") do { player = try AVAudioPlayer(contentsOf: url) player?.play() } catch let error { print(error.localizedDescription) }
func playSound(_ buttonTag : Int){ let path = Bundle.main.path(forResource: "note\(buttonTag)", ofType : "wav")! let url = URL(fileURLWithPath : path) do{ soundEffect = try AVAudioPlayer(contentsOf: url) soundEffect?.play() // to stop the spound .stop() }catch{ print ("file could not be loaded or other error!") } }работает в последней версии swift 4. ButtonTag будет тегом на кнопке на вашем интерфейсе. Заметки находятся в папке в папке, параллельной Main.раскадровка. Каждая нота называется примечание1, примечание2 и т. д. ButtonTag дает число 1, 2 и т. д. от кнопки, нажатой, которая передается как param
сначала импортируйте эти библиотеки
import AVFoundation import AudioToolboxустановить делегат, как это
AVAudioPlayerDelegateнаписать этот красивый код на кнопку действия или что-то действие:
guard let url = Bundle.main.url(forResource: "ring", withExtension: "mp3") else { return } do { try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback) try AVAudioSession.sharedInstance().setActive(true) player = try AVAudioPlayer(contentsOf: url, fileTypeHint: AVFileType.mp3.rawValue) guard let player = player else { return } player.play() }catch let error{ print(error.localizedDescription) }100% работает в моем проекте и протестированы
Comments