web-dev-qa-db-ja.com

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
    }
}
93
Michel

できれば AVFoundation を使用することをお勧めします。それは視聴覚メディアを扱うためのすべての要点を提供します。

更新:Swift 2SwiftSwift 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 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)
    }
}

extension だけでなく、あなたの曲の名前も必ず変更してください。 ファイルを正しくインポートする必要があります(Project Build Phases> Copy Bundle Resources)。より便利にするために、assets.xcassetsに配置することをお勧めします。

短いサウンドファイルの場合、.wavのような非圧縮オーディオフォーマットにした方が良い場合があります。最高の品質と低いCPUへの影響があるからです。ディスクスペースの消費量が多くても、短いサウンドファイルでは大したことはありません。ファイルが長いほど、.mp3などの圧縮形式を使用することをお勧めします。pp。CoreAudio互換性のあるオーディオ形式 を確認してください。


Fun-fact:サウンドをより簡単にするための、きちんとした小さなライブラリがあります。 :)
例: SwiftySound

196
Devapploper

Swift:の場合

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)")
    }
}
37
Adi Nugroho

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

        }

}
13
Tony Ward

コードでエラーが発生しなくても音が聞こえない場合は、プレーヤーをインスタンスとして作成します。

   static var player: AVAudioPlayer!

私にとっては、この変更を行ったときの最初の解決策がうまくいきました:)

6
EranKT

スイフト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
}
3
Mr.Shin

swiftへの非常に単純なコード

あなたの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()
}
1
M VIJAY

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
Ershin Bot

最初にこれらのライブラリをインポートする

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%作業し、テストしました

1

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

Swift 4、4.2および5

RLおよびプロジェクト(ローカルファイル)からオーディオを再生

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

}
0
Akbar Khan
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などの数字を与え、それがparamとして渡されます。

0
Egi Messito
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
Hunter Akers