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
}
}
AV Foundation을 사용하는 것이 가장 좋습니다.이것은 시청각 미디어 작업에 필요한 모든 필수 요소를 제공합니다.
업데이트 : 댓글에서 제안하신 스위프트 2, 스위프트 3, 스위프트 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)
}
}
Swift 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)")
}
}
빠른 버전: 5.4 이상
import AVFoundation
var player: AVAudioPlayer?
func playSound() {
guard let path = Bundle.main.path(forResource: "beep", ofType:"mp3") else {
return }
let url = URL(fileURLWithPath: path)
do {
player = try AVAudioPlayer(contentsOf: url)
player?.play()
} catch let error {
print(error.localizedDescription)
}
}
iOS 12 - Xcode 10 베타 6 - Swift 4.2
IA 액션을 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()
}
}
Swift 5 "AV Foundation"의 경우\
로컬 경로에서 오디오를 재생할 수 있는 오류 처리가 없는 간단한 코드
import AVFoundation
var audio:AVPlayer!
func stopAlarm() {
// To pause or stop audio in swift 5 audio.stop() isn't working
audio.pause()
}
func playAlarm() {
// need to declare local path as url
let url = Bundle.main.url(forResource: "Alarm", withExtension: "mp3")
// now use declared path 'url' to initialize the player
audio = AVPlayer.init(url: url!)
// after initialization play audio its just like click on play button
audio.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
}
Swift에서 오디오 파일을 찾아 재생하는 기본 코드입니다.
X 코드에 오디오 파일을 추가하고 아래 코드를 추가합니다.
import AVFoundation
class ViewController: UIViewController {
var audioPlayer = AVAudioPlayer() // declare globally
override func viewDidLoad() {
super.viewDidLoad()
guard let sound = Bundle.main.path(forResource: "audiofilename", ofType: "mp3") else {
print("Error getting the mp3 file from the main bundle.")
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()
}
}
그것은 간단하고 일을 끝냅니다!
import AVFoundation
var player: AVAudioPlayer!
let url = Bundle.main.url(forResource: "sound_name", withExtension: "mp3")
player = try! AVAudioPlayer(contentsOf: url!)
player.play()
게임 스타일:
파일Sfx.swift
import AVFoundation
public let sfx = Sfx.shared
public final class Sfx: NSObject {
static let shared = Sfx()
var apCheer: AVAudioPlayer? = nil
// etc
private override init() {
guard let s = Bundle.main.path(forResource: "cheer", ofType: "mp3") else { print("Sfx woe"); return }
do { apCheer = try AVAudioPlayer(contentsOf: URL(fileURLWithPath: s)) } catch { print("Sfx woe"); return }
// etc
}
func cheer() { apCheer?.play() }
func plonk() { apPlonk?.play() }
func crack() { apCrack?.play() }
// etc
}
이것들 중 하나만...
var apCheer: AVAudioPlayer? = nil
각 오디오 스팅에 대해 설명합니다.그래서 여러분은 5, 20, 10, 뭐든지 가질 수 있습니다.
각 초기화 코드의 두 줄을 복사/붙여넣기만 하면 됩니다.
guard let s = Bundle.main.path(forResource: "cheer", ofType: "mp3") else { return print("Sfx woe") }
do { apCheer = try AVAudioPlayer(contentsOf: URL(fileURLWithPath: s)) } catch { return print("Sfx woe") }
그러면 어디서든, 어떤 코드에서든, 어떤 파일에서든, 다음과 같은 작업을 수행할 수 있습니다.
sfx.cheer()
sfx.crack()
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)
}
}
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()
}
먼저 라이브러리 가져오기
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% 프로젝트에 참여하여 테스트 완료
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)
}
}
}
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)
}
var soundEffect = AVAudioPlayer()
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.storyboard와 평행한 폴더에 있습니다.모든 노트는 노트1, 노트2 등으로 이름이 지정됩니다.ButtonTag는 클릭한 버튼에서 1, 2 등의 숫자를 제공하고 있으며, 이 숫자는 param으로 전달됩니다.
import AVFoundation
import AudioToolbox
public final class MP3Player : NSObject {
// Singleton class
static let shared:MP3Player = MP3Player()
private var player: AVAudioPlayer? = nil
// Play only mp3 which are stored in the local
public func playLocalFile(name:String) {
guard let url = Bundle.main.url(forResource: name, withExtension: "mp3") else { return }
do {
try AVAudioSession.sharedInstance().setCategory(AVAudioSession.Category.playback)
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)
}
}
}
이 함수를 호출하려면
MP3Player.shared.playLocalFile(name: "JungleBook")
SK Actions 사용 중...
// Preload the sound(s)
private let buttonSound = SKAction.playSoundFileNamed("SoundButton.wav", waitForCompletion: false)
// Play using run function
buttonNode?.run(buttonSound)
언급URL : https://stackoverflow.com/questions/32036146/how-to-play-a-sound-using-swift
'programing' 카테고리의 다른 글
Xcode 스크립트 실행 빌드 단계 "설치할 때만 스크립트 실행" 옵션 (0) | 2023.05.18 |
---|---|
Azure 함수에 대한 로그 수준 구성 (0) | 2023.05.18 |
UI 이미지 크기를 조정하는 가장 간단한 방법은 무엇입니까? (0) | 2023.05.18 |
MongoDB Change Streams로 인한 심각한 성능 저하 (0) | 2023.05.18 |
fe_sendauth: 암호가 제공되지 않았습니다. (0) | 2023.05.18 |