Как воспроизвести звук с помощью 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
}
}
Ответы
Ответ 1
Наиболее предпочтительно вы можете использовать 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)
}
}
Свифт 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 12)
import AVFoundation
var player: AVAudioPlayer?
func playSound() {
guard let url = Bundle.main.url(forResource: "soundName", withExtension: "mp3") else { return }
do {
try AVAudioSession.sharedInstance().setCategory(.playback, mode: .default)
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
поскольку они имеют наилучшее качество и низкое влияние на процессор. Более высокое потребление дискового пространства не должно иметь большого значения для коротких звуковых файлов. Чем длиннее файлы, тем лучше использовать сжатый формат, например .mp3
и т.д. Проверьте совместимые аудиоформаты CoreAudio
.
Интересный факт: есть аккуратные маленькие библиотеки, которые делают воспроизведение звуков еще проще. :)
Например: SwiftySound
Ответ 2
Для 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)")
}
}
Ответ 3
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!")
}
}
Ответ 4
Если код не вызывает никаких ошибок, но вы не слышите звук - создайте плеер как экземпляр:
static var player: AVAudioPlayer!
Для меня первое решение сработало, когда я сделал это изменение:)
Ответ 5
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 best to check that it exists.
if myAudio != nil {
myAudio.stop()
myAudio = nil
}
Ответ 6
Сначала импортируйте эти библиотеки
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% работает в моем проекте и тестируется
Ответ 7
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)
}
Ответ 8
Протестировано с Swift 4 и iOS 12:
import UIKit
import AVFoundation
class ViewController: UIViewController{
var player: AVAudioPlayer!
override func viewDidLoad() {
super.viewDidLoad()
}
func playTone(number: Int) {
let path = Bundle.main.path(forResource: "note\(number)", ofType : "wav")!
let url = URL(fileURLWithPath : path)
do {
player = try AVAudioPlayer(contentsOf: url)
print ("note\(number)")
player.play()
}
catch {
print (error)
}
}
@IBAction func notePressed(_ sender: UIButton) {
playTone(number: sender.tag)
}
}
Ответ 9
очень простой код для быстрого
добавьте ваш аудиофайл в ваш Xcode и дайте код как указано
import AVFoundation
class ViewController: UIViewController{
var audioPlayer = AVAudioPlayer() //declare as Globally
override func viewDidLoad() {
super.viewDidLoad()
guard let sound = Bundle.main.path(forResource: "audiofilename", ofType: "mp3") else {
print("error to get the mp3 file")
return
}
do {
audioPlayer = try AVAudioPlayer(contentsOf: URL(fileURLWithPath: sound))
} catch {
print("audio file error")
}
audioPlayer.play()
}
@IBAction func notePressed(_ sender: UIButton) { //Button action
audioPlayer.stop()
}
Ответ 10
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!")
}
}
работает в быстрой версии 4 последней версии. ButtonTag будет тегом на кнопке на вашем интерфейсе. Примечания находятся в папке в папке, параллельной Main.storyboard. Каждая нота называется note1, note2 и т.д. ButtonTag дает номер 1, 2 и т.д. Нажатой кнопки, которая передается как параметр
Ответ 11
import UIKit
import AVFoundation
class ViewController: UIViewController{
var player: AVAudioPlayer?
override func viewDidLoad() {
super.viewDidLoad()
}
@IBAction func notePressed(_ sender: UIButton) {
guard let url = Bundle.main.url(forResource: "note1", withExtension: "wav") else { return }
do {
try AVAudioSession.sharedInstance().setCategory((AVAudioSession.Category.playback), mode: .default, options: [])
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.wav.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)
}
}
}
Ответ 12
Свифт 4, 4.2 и 5
Воспроизведение аудио с URL и из вашего проекта (локальный файл)
import UIKit
import AVFoundation
class ViewController: UIViewController{
var audioPlayer : AVPlayer!
override func viewDidLoad() {
super.viewDidLoad()
// call what ever function you want.
}
private func playAudioFromURL() {
guard let url = URL(string: "https://geekanddummy.com/wp-content/uploads/2014/01/coin-spin-light.mp3") else {
print("error to get the mp3 file")
return
}
do {
audioPlayer = try AVPlayer(url: url as URL)
} catch {
print("audio file error")
}
audioPlayer?.play()
}
private func playAudioFromProject() {
guard let url = Bundle.main.url(forResource: "azanMakkah2016", withExtension: "mp3") else {
print("error to get the mp3 file")
return
}
do {
audioPlayer = try AVPlayer(url: url)
} catch {
print("audio file error")
}
audioPlayer?.play()
}
}
Ответ 13
Стиль игры:
файл Sfx.swift
import AVFoundation
public let sfx = Sfx.shared
public final class Sfx: NSObject {
static let shared = Sfx()
var apCheer: AVAudioPlayer? = nil
private override init() {
guard let s = Bundle.main.path(forResource: "cheer", ofType: "mp3") else {
return print("Sfx woe")
}
do {
apComment = try AVAudioPlayer(contentsOf: URL(fileURLWithPath: s))
} catch {
return print("Sfx woe")
}
}
func cheer() { apCheer?.play() }
func plonk() { apPlonk?.play() }
func crack() { apCrack?.play() } .. etc
}
где-нибудь вообще в коде
sfx.explosion()
sfx.cheer()
Ответ 14
import AVFoundation
var player:AVAudioPlayer!
func Play(){
guard let path = Bundle.main.path(forResource: "KurdishSong", ofType: "mp3")else{return}
let soundURl = URL(fileURLWithPath: path)
player = try? AVAudioPlayer(contentsOf: soundURl)
player.prepareToPlay()
player.play()
//player.pause()
//player.stop()
}