Swiftを使用してサウンドを再生する方法


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


システムからのサウンドのみが必要な場合は、「iOSアプリで既存のシステムサウンドを使用する
Honey

回答:


292

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

更新:一部のコメントで提案されているように、Swift 2Swift 3Swift 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 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への影響が少ないなど、非圧縮のオーディオ形式を使用することをお勧めします。短いサウンドファイルでは、ディスク領域の消費量が多くても大したことにはなりません。ファイルが長い場合は、.mp3etc。などの圧縮形式を使用することをお勧めします。pp。の互換性のあるオーディオ形式を確認してくださいCoreAudio


豆知識:サウンドの再生をさらに簡単にする、きちんとした小さなライブラリがあります。:)
例:SwiftySound


申し訳ありませんが、Swift 2.0ではこのコードは機能しなくなり、「コールはスローできますが、 'try'のマークが付けられておらず、エラーは処理されません」というエラーが表示されます
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オブジェクトをインスタンス変数にする必要がありました。ローカル変数として、何も再生せず、エラーも発生しません。代議員も呼ばれませんでした。
カレブ2016年

2
なぜここで警備員を使うのですか?player = try AVAudioPlayer(contentsOf: url) guard let player = player else { return }私には余分な仕事のように思えますが、なぜlet player = try AVAudioPlayer(contentsOf: url)ですか?
xandermonkey '19

2
ガードステートメントを使用すると、nil値によるクラッシュからかなり安全になります。
アーシッシュ2017年

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で動作しました。私にとって、2つの「try AVAudioSession」行は、実際のデバイスで実際に聞こえる音とそうでない音の違いを作り出しました。それらがなければ、音は出ません。
pvanallen 2017年

これは私にトンを助けました、doしかし私はブロックで何が起こるか理解するのにいくつかの問題を抱えています。明らかに自明player!.play()です。しかし、setCategoryおよびsetActiveメソッドの目的は何ですか?
シャンロバートソン

2
に提供するAVAudioSessionCategoryPlaybacksetCategory、電話がロック画面またはサイレントモードであっても、オーディオが常に再生されるようになります。setActiveアプリがオーディオを再生する準備ができていることをシステムに伝えるようなものです
Adi Nugroho 2017

@AdiNugrohoあなたは私の質問を助けることができると思いますか:stackoverflow.com/questions/44201592/…
JamesG

iOS 11でこれに多くの問題を抱えています。以前は機能していましたが、今は突然機能しなくなりました。何か案は?
nickdnk 2017年

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アプリの開発合宿iOSの11&スウィフト4」されているそれはおかしいあなたがそのすべての人を想定していることだ
karlingen

12

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

   static var player: AVAudioPlayer!

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


私のために働く。これを静的に設定する必要がある理由を誰かが知っていますか?
kuzdu 2018

3
私はそれが静的である必要はないと思います(もう?)私はそれを自分のクラスのインスタンス変数にしただけで機能します。
biomiker

3
@kuzduこれはplayer、スコープを外側に配置しないためです。そうしplayerないと、ローカライズが解除され、存在しないサウンドを再生できなくなります。
George_E

私のために働いた-なしstatic
トッド

5

Swift 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

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

次のエラーが表示されます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は、paramとして渡されるクリックされたボタンから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(name: "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.