스위프트를 사용하여 소리를 재생하는 방법?


149

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
SwiftySound를 살펴 보십시오 . 이 답변에 대한 자세한 내용 .
Adam

시스템에서 사운드를 원한다면 iOS 앱에서 기존 시스템 사운드 사용
Honey

답변:


292

AVFoundation 을 사용하는 것이 가장 좋습니다 . 시청각 미디어 작업에 필요한 모든 필수 요소를 제공합니다.

업데이트 : 의견 중 일부에서 제안한대로 Swift 2 , Swift 3Swift 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


죄송하지만이 코드는 더 이상 swift 2.0에서 작동하지 않습니다. "전화를 던질 수 있지만 '시도'로 표시되지 않고 오류가 처리되지 않습니다"라는 오류가 표시됩니다.
Michel Kansou

2
교체 bgMusic = AVAudioPlayer(contentsOfURL: bgMusicURL, fileTypeHint: nil)do { bgMusic = try AVAudioPlayer(contentsOfURL: bgMusicURL, fileTypeHint: nil) } catch _ { return \\ if it doesn't exist, don't play it}
saagarjha

11
이 작업을 수행하려면 AVAudioPlayer 객체를 인스턴스 변수로 만들어야했습니다. 지역 변수로는 아무 것도 재생하지 않으며 오류가 없습니다. 대리인들도 전화를받지 않을 것입니다.
Kaleb

2
왜 여기서 경비원을 사용합니까? player = try AVAudioPlayer(contentsOf: url) guard let player = player else { return }나에게 여분의 일처럼 보인다 let player = try AVAudioPlayer(contentsOf: url).
xandermonkey

2
guard 문을 사용하면 nil 값으로 인해 충돌로부터 꽤 안전합니다.
Aashish

43

대한 스위프트 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 10.2.1, xCode 8.2.1에서 작동했습니다. 나에게있어 두 개의 "AVAudioSession"시도는 실제 장치에서 실제로 들리는 소리의 차이를 만들었습니다. 그들 없이는 소리가 들리지 않습니다.
pvanallen

이것은 나에게 도움이되었다. 나는 do블록 에서 일어나는 일을 이해하는 데 어려움을 겪고있다 . 분명히 player!.play()자기 설명입니다. 그러나 setCategoryand setActive방법 의 목적은 무엇 입니까?
Shan Robertson

2
를 제공 AVAudioSessionCategoryPlayback하면 setCategory휴대 전화가 잠금 화면에 있거나 무음 모드 인 경우에도 항상 오디오가 재생됩니다. setActive앱에서 오디오를 재생할 준비가되었음을 시스템에 알리는 것과 같습니다
Adi Nugroho

@AdiNugroho 내 질문에 도움이 될 것이라고 생각 하십니까 : stackoverflow.com/questions/44201592/… ?
JamesG

iOS 11 에서이 문제가 많이 발생했습니다. 이전에는 작동했지만 갑자기 작동하지 않습니다. 어떤 아이디어?
nickdnk

15

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!")
    }
}

5
😂😂 -보고 "완전한 iOS 앱 개발 부트 캠프 아이폰 OS 11 스위프트 4"하는이 재미 당신이 그 사람을 가정하고 있다는입니다
karlingen

12

코드에서 오류가 발생하지 않지만 소리가 들리지 않으면 플레이어를 인스턴스로 만듭니다.

   static var player: AVAudioPlayer!

나를 위해 첫 번째 솔루션은이 변경을 수행했을 때 작동했습니다 :)


나를 위해 작동합니다. 왜 이것을 정적으로 설정 해야하는지 아는 사람이 있습니까?
kuzdu

3
나는 그것이 정적 (더 이상?)이어야한다고 생각하지 않지만, 당신이 play ()를 호출하더라도, 그것이 생성 된 후에 범위를 벗어나게하면 아마도 재생되지 않을 것 같습니다. 방금 클래스의 인스턴스 변수로 만들었고 작동합니다.
biomiker

3
@kuzdu 이것은 player외부 범위에 배치하지 않기 때문 입니다. 그렇지 않으면 player지역화되지 않아 더 이상 존재하지 않는 사운드를 재생할 수 없습니다.
George_E

나를 위해 일했다-없이static
Todd

5

스위프트 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

스위프트 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
}

1

먼저이 라이브러리를 가져 오십시오

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 % 일하고 테스트했습니다.


2
AudioToolbox이 장소에서 가져올 필요가 없습니다 .
ixany

1

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)
    }
}

1

스위프트 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)
}

다음과 같은 오류가 발생 The operation couldn’t be completed. (OSStatus error 1954115647.)합니다.. 나는 모든 곳을 보았고 해결책을 찾을 수 없습니다. 그것에 대해 질문을 게시 할 수 있습니다.
George_E

1

게임 스타일 :

파일 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()

1

Swift에서 오디오 파일을 찾아서 재생하는 기본 코드입니다.

오디오 파일을 Xcode에 추가하고 아래 코드를 추가하십시오.

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()
    }
}

0
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)
        }

    }

}

0
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와 평행 한 폴더의 폴더에 있습니다. 모든 메모는 note1, note2 등으로 이름이 지정됩니다. ButtonTag는 클릭 한 버튼에서 매개 변수로 전달되는 숫자 1, 2 등을 제공합니다.


0

AVFoundation 가져 오기

AudioToolbox 가져 오기

공개 최종 클래스 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 (이름 : "JungleBook")


-1
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()
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.