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
}
}
답변
AVFoundation 을 사용하는 것이 가장 좋습니다 . 시청각 미디어 작업에 필요한 모든 필수 요소를 제공합니다.
업데이트 : 의견 중 일부에서 제안한대로 Swift 2 , Swift 3 및 Swift 4 와 호환됩니다 .
스위프트 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)
}
}
스위프트 4 (iOS 13 호환)
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
최상의 품질 및 낮은 CPU 영향)을 원할 수 있습니다 . 짧은 사운드 파일에는 디스크 공간이 많이 소모 되어도 큰 문제가되지 않습니다. 파일이 길수록 압축 형식 등의 압축 형식을 원할 수 있습니다 .mp3
. pp 호환되는 오디오 형식 을 확인하십시오 CoreAudio
.
재미있는 사실 : 소리를 훨씬 쉽게 연주 할 수있는 깔끔한 작은 라이브러리가 있습니다. 🙂
예 : SwiftySound
답변
대한 스위프트 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 베타 6-Swift 4.2
IBAction을 1 개만 사용하고 모든 단추를 해당 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!
나를 위해 첫 번째 솔루션은이 변경을 수행했을 때 작동했습니다 🙂
답변
스위프트 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()
}
}
답변
스위프트 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
}
답변
먼저이 라이브러리를 가져 오십시오
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 % 일하고 테스트했습니다.