サウンドをすばやく作成して再生する


103

だから私がしたいことは、ボタンを押したときに再生されるサウンドを迅速に作成して再生することです、私はObjective-Cでそれを行う方法を知っていますが、誰もがSwiftで行う方法を知っていますか?

Objective-Cの場合は次のようになります。

NSURL *soundURL = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"mysoundname" ofType:@"wav"]];
AudioServicesCreateSystemSoundID((__bridge CFURLRef)soundURL, &mySound);

そしてそれを再生するために私はやります:

AudioServicesPlaySystemSound(Explosion);

誰か私がこれを行う方法を知っていますか?


2
この質問の根本は、C関数を迅速に呼び出す方法です。これについても知りたいです。
67チェリー2014年

この行は、音のURLを作成することができます var url :NSURL = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("mysoundname", ofType: "wav"))
コナー

@connorありがとうございます。AudioServicesCreateSystemSoundIDについてはどうでしょう
Jacob Banks

それについてはよくわかりません。私はswiftからobjective-c apiを呼び出すことができました。
コナー

回答:


83

動作するFlappySwiftに追加したコードは次のとおりです。

import SpriteKit
import AVFoundation

class GameScene: SKScene {

    // Grab the path, make sure to add it to your project!
    var coinSound = NSURL(fileURLWithPath: Bundle.main.path(forResource: "coin", ofType: "wav")!)
    var audioPlayer = AVAudioPlayer()

    // Initial setup
    override func didMoveToView(view: SKView) {
        audioPlayer = AVAudioPlayer(contentsOfURL: coinSound, error: nil)
        audioPlayer.prepareToPlay()
    }

    // Trigger the sound effect when the player grabs the coin
    func didBeginContact(contact: SKPhysicsContact!) {
        audioPlayer.play()
    }

}

使用する直前にaudioPlayerを宣言できるように思えますが、シミュレーターでは機能しませんでした。あなたと同じように、私はそれを一番上に宣言しなければなりませんでした。
Adam Loving

@Adam愛することを使用する直前にaudioPlayerを宣言できますが、宣言したのと同じ関数でplay()を呼び出すようにしてください(良い答えとは対照的です)さらに、宣言coinSoundしたくないのでaudioPlayerlet代わりvarに後でこれらのオブジェクトを変更します。
fat32、2015年

3
Swift 2では、この方法で実行することを忘れdo { (player object) } catch _ { }ないでください。そうしないと、バグが発生します。:)
ParisNakitaKejser 2015年

1
しかし、注意!プレーヤーからのBGMを一時停止します。短いサウンドを再生するには、以下の回答を使用する必要があります
Nikita Pronchik

反対投票-これはシステムサウンドではなく、別のAPIを使用しています
William Entriken

119

これは他のいくつかの回答に似ていますが、おそらくもう少し「Swifty」:

// Load "mysoundname.wav"
if let soundURL = Bundle.main.url(forResource: "mysoundname", withExtension: "wav") {
    var mySound: SystemSoundID = 0
    AudioServicesCreateSystemSoundID(soundURL as CFURL, &mySound)
    // Play
    AudioServicesPlaySystemSound(mySound);
}

これは問題のコードの効果を再現する簡単な例であることに注意してください。を確認する必要があります。import AudioToolboxさらに、この種のコードの一般的なパターンは、アプリの起動時にサウンドをロードし、SystemSoundIDインスタンス変数に保存して、アプリ全体で使用し、AudioServicesDisposeSystemSoundID終了時に呼び出すことです。彼らと。


1
また、AudioToolboxをインポートする必要があります
Brody Robertson

AudioServicesDisposeSystemSoundID(mySound)後でメモリを解放するために呼び出す必要がありますか?すぐに行うと、サウンドは基本的に再生されません(すぐにクリーンアップされます)のでdispatch_after、10秒後にクリーンアップしました。
owenfi 2015

@owenfi私の回答のコードの断片は、質問のコードの断片に相当するSwiftにすぎません。AudioServicesの一般的なパターンは、アプリが起動したときにサウンドをロードし、アプリ全体で使用し、アプリが閉じたときにそれらを破棄することですが、各アプリは異なります。
Matt Gibson

@ozgur Xcodeの古いバージョンを使用しているのはなぜですか?「動作しない」の意味を知る必要があります。特定の問題がある場合は、新しい質問をする方がよいでしょう。
マットギブソン

実際には、これがwavファイルを再生する唯一の方法です。AVPlayerが機能していないようです。
ハイタオ2017

18

Handy Swift拡張:

import AudioToolbox

extension SystemSoundID {
    static func playFileNamed(fileName: String, withExtenstion fileExtension: String) {
        var sound: SystemSoundID = 0
        if let soundURL = NSBundle.mainBundle().URLForResource(fileName, withExtension: fileExtension) {
            AudioServicesCreateSystemSoundID(soundURL, &sound)
            AudioServicesPlaySystemSound(sound)
        }
    }
}

次に、アプリのどこからでも(に覚えておいてくださいimport AudioToolbox)、

SystemSoundID.playFileNamed("sound", withExtenstion: "mp3")

「sound.mp3」を再生する


SpriteKitゲームでこれを実行すると、サウンドが再生される前に常に遅延が発生します。中に入れてもDispatchQueue.global(qos: .userInitiated).async {}
Jon Kantner

NSBundleに置き換えられましたBundleBundle.main.url(forResource: fileName, withExtension: fileExtension)代わりに使用してください
diachedelic

14

これにより、SystemSoundIDというファイルからが作成されますCha-Ching.aiff

import AudioToolbox

let chaChingSound: SystemSoundID = createChaChingSound()

class CashRegisterViewController: UIViewController {
    override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(animated)
        AudioServicesPlaySystemSound(chaChingSound)
    }
}

func createChaChingSound() -> SystemSoundID {
    var soundID: SystemSoundID = 0
    let soundURL = CFBundleCopyResourceURL(CFBundleGetMainBundle(), "Cha-Ching", "aiff", nil)
    AudioServicesCreateSystemSoundID(soundURL, &soundID)
    CFRelease(soundURL)
    return soundID
}

コードをコンパイルしようとしましたか?「エクスプレッションのタイプ '管理されていない<CFURL>を変換できません!」というエラーが発生します。この行から「CFString」と入力するには "let soundURL = CFBundleCopyResourceURL(CFBundleGetMainBundle()、" Cha-Ching "、" aiff "、nil)"
bpolat

はい、それは私のためにコンパイルされます。github.com/acani/Chats/blob/master/Chats/Chats/…を
ma11hew28

2
提供されているObj-Cの例はAudioToolBoxフレームワークに基づいているので、これは受け入れられる答えになるはずです
eharo2

@ JochenBedersdorfer、Core Foundationオブジェクトが自動的にメモリ管理されるため、おそらくエラーが発生します。
XCool 2015年

8

クラスとAudioToolboxで:

import AudioToolbox

class Sound {

    var soundEffect: SystemSoundID = 0
    init(name: String, type: String) {
        let path  = NSBundle.mainBundle().pathForResource(name, ofType: type)!
        let pathURL = NSURL(fileURLWithPath: path)
        AudioServicesCreateSystemSoundID(pathURL as CFURLRef, &soundEffect)
    }

    func play() {
        AudioServicesPlaySystemSound(soundEffect)
    }
}

使用法:

testSound = Sound(name: "test", type: "caf")
testSound.play()

2
私はこの答えが大好きです。それは、システムの音がある。またので、私はXcodeの8のためにAVAudioPlayerがコンソールにスローシステムメッセージを取得しない
TPot

私が同じことをしているのを助けてください、音は再生されますが、音量が小さすぎます。聞こえない
veeresh kumbar

5
import AVFoundation

var audioPlayer = AVAudioPlayer()

class GameScene: SKScene {

    override func didMoveToView(view: SKView) {

        let soundURL = NSBundle.mainBundle().URLForResource("04", withExtension: "mp3")
        audioPlayer = AVAudioPlayer(contentsOfURL: soundURL, error: nil)
        audioPlayer.play()
    }
}

最新のSwiftではAVAudioPlayer(contentsOf:soundURL)です
箱入りの

5

このコードは私にとってはうまくいきます。AVAudioPlayerのTry and Catchを使用する

import UIKit
import AVFoundation
class ViewController: UIViewController {

    //Make sure that sound file is present in your Project.
    var CatSound = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("Meow-sounds.mp3", ofType: "mp3")!)
    var audioPlayer = AVAudioPlayer()

    override func viewDidLoad() {
        super.viewDidLoad()

        do {

            audioPlayer = try AVAudioPlayer(contentsOfURL: CatSound)
            audioPlayer.prepareToPlay()

        } catch {

            print("Problem in getting File")

        }      
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    @IBAction func button1Action(sender: AnyObject) {

        audioPlayer.play()
    }
}

4
var mySound = NSSound(named:"Morse.aiff")
mySound.play()

"Morse.aiff"はOSXのシステムサウンドですが、XCode内の "named"をクリックするだけで、この関数がサウンドを検索している場所を(QuickHelpペインで)表示できます。「サポートファイル」フォルダにあります


4
問題はiOSについてです。
rmaddy 2014年

確かに...シミュレータでそれを作ることができませんでした。現在利用できるドキュメントはありません
フィリップ2014年

4

新しいSwift 2.0によると、do try catchを使用する必要があります。コードは次のようになります。

var badumSound = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("BadumTss", ofType: "mp3"))
var audioPlayer = AVAudioPlayer()
 do {
     player = try AVAudioPlayer(contentsOfURL: badumSound)
 } catch {
     print("No sound found by URL:\(badumSound)")
 }
 player.prepareToPlay()

3

これはSwift 4で動作しています:

if let soundURL = Bundle.main.url(forResource: "note3", withExtension: "wav") {
                var mySound: SystemSoundID = 0
                AudioServicesCreateSystemSoundID(soundURL as CFURL, &mySound)
                // Play
                AudioServicesPlaySystemSound(mySound);
            }

2
コードを説明してください。コードのみの回答は説明よりも価値がありません。
Vincent

@Vincent +1、実際に私は疑問に思っています&演算子。これは、サウンドとメモリの間で参照される場合があります。
エリア

インポートAudioToolboxを追加してから上記のコードを追加する必要があります
Mohammad Aboelnasr 2018

2
//Swift 4
import UIKit
import AVFoundation

class ViewController: UIViewController {

    var player : AVAudioPlayer?

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    @IBAction func notePressed(_ sender: UIButton) {
        let path = Bundle.main.path(forResource: "note1", ofType: "wav")!
        let url = URL(fileURLWithPath: path)
        do {
            player = try AVAudioPlayer(contentsOf: url)
            player?.play()
        } catch {
            // error message
        }
    }
}

2

この質問に対するより更新されたアプローチを見てみましょう:

Import AudioToolbox

func noteSelector(noteNumber: String) {

    if let soundURL = Bundle.main.url(forResource: noteNumber, withExtension: "wav") {
        var mySound: SystemSoundID = 0
        AudioServicesCreateSystemSoundID(soundURL as CFURL, &mySound)
        AudioServicesPlaySystemSound(mySound)
}

1
コードはSwift 4で正常に動作しますが、放出されたサウンドがメディアのボリュームに追従しないようです
David Vargas

1

Matt Gibsonのソリューションがうまくいきました。Swift3バージョンです。

if let soundURL = Bundle.main.url(forResource: "ringSound", withExtension: "aiff") {
  var mySound: SystemSoundID = 0
  AudioServicesCreateSystemSoundID(soundURL as CFURL, &mySound)
  AudioServicesPlaySystemSound(mySound);
}

1

スウィフト4

import UIKit
import AudioToolbox

class ViewController: UIViewController{

var sounds : [SystemSoundID] = [1, 2, 3, 4, 5, 6, 7]

override func viewDidLoad() {
    super.viewDidLoad()

    for index in 0...sounds.count-1 {
        let fileName : String = "note\(sounds[index])"

        if let soundURL = Bundle.main.url(forResource: fileName, withExtension: "wav") {
            AudioServicesCreateSystemSoundID(soundURL as CFURL, &sounds[index])
        }
    }
}



@IBAction func notePressed(_ sender: UIButton) {
    switch sender.tag {
    case 1:
        AudioServicesPlaySystemSound(sounds[0])
    case 2:
        AudioServicesPlaySystemSound(sounds[1])
    case 3:
        AudioServicesPlaySystemSound(sounds[2])
    case 4:
        AudioServicesPlaySystemSound(sounds[3])
    case 5:
        AudioServicesPlaySystemSound(sounds[4])
    case 6:
        AudioServicesPlaySystemSound(sounds[5])
    default:
        AudioServicesPlaySystemSound(sounds[6])
    }
}
}

または

import UIKit
import AVFoundation

class ViewController: UIViewController, AVAudioPlayerDelegate{

var audioPlayer : AVAudioPlayer!

override func viewDidLoad() {
    super.viewDidLoad()
}

@IBAction func notePressed(_ sender: UIButton) {

    let soundURL = Bundle.main.url(forResource: "note\(sender.tag)", withExtension: "wav")

    do {
        audioPlayer = try AVAudioPlayer(contentsOf: soundURL!)
    }
    catch {
        print(error)
    }

    audioPlayer.play()

}
}

1

で働く Xcode 9.2

if let soundURL = Bundle.main.url(forResource: "note1", withExtension: "wav") {
   var mySound: SystemSoundID = 0
   AudioServicesCreateSystemSoundID(soundURL as CFURL, &mySound)
   // Play
    AudioServicesPlaySystemSound(mySound);
 }

1

Swiftコード例

import UIKit
import AudioToolbox

class ViewController: UIViewController {  

override func viewDidLoad() {
    super.viewDidLoad()
}

@IBAction func notePressed(_ sender: UIButton) {

    // Load "mysoundname.wav"

    if let soundURL = Bundle.main.url(forResource: "note1", withExtension: "wav") {
        var mySound: SystemSoundID = 0
        AudioServicesCreateSystemSoundID(soundURL as CFURL, &mySound)
    // Play

        AudioServicesPlaySystemSound(mySound);
    }
}

このコードが役立つ理由について詳しく説明してください。
Berendschot 2018

1

あなたはSwift 5.2でこれを試すことができます:

func playSound() {
        let soundURL = Bundle.main.url(forResource: selectedSoundFileName, withExtension: "wav")
        do {
            audioPlayer = try AVAudioPlayer(contentsOf: soundURL!)
        }
        catch {
            print(error)
        }
        audioPlayer.play()
    }

1

Swift 4およびiOS 12

var audioPlayer: AVAudioPlayer?

override func viewDidLoad() {
    super.viewDidLoad()



}

@IBAction func notePressed(_ sender: UIButton) {

    // noise while pressing button

    _ = Bundle.main.path(forResource: "note1", ofType: "wav")

    if Bundle.main.path(forResource: "note1", ofType: "wav") != nil {
        print("Continue processing")
    } else {
        print("Error: No file with specified name exists")
    }

    do {
        if let fileURL = Bundle.main.path(forResource: "note1", ofType: "wav") {
            audioPlayer = try AVAudioPlayer(contentsOf: URL(fileURLWithPath: fileURL))
        } else {
            print("No file with specified name exists")
        }
    } catch let error {
        print("Can't play the audio file failed with an error \(error.localizedDescription)")
    }


    audioPlayer?.play()    }

}


コードを投稿するだけでなく、その機能を説明してください!stackoverflow.com/help/how-to-answer
Nino Filiu

この投稿の質問を参照してください。あなたの答えを見つけることができます!ありがとう@NinoFiliu
Gulsan Borbhuiya

0

この関数を使用して、Swiftで音を出します(この関数は、音を出したい場所で使用できます)。

最初にSpriteKitとAVFoundation Frameworkを追加します。

import SpriteKit
import AVFoundation
 func playEffectSound(filename: String){
   runAction(SKAction.playSoundFileNamed("\(filename)", waitForCompletion: false))
 }// use this function to play sound

playEffectSound("Sound File Name With Extension")
// Example :- playEffectSound("BS_SpiderWeb_CollectEgg_SFX.mp3")

0

このコードは私にとってはうまくいきます:

class ViewController: UIViewController {

    var audioFilePathURL : NSURL!
    var soundSystemServicesId : SystemSoundID = 0

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        audioFilePathURL = NSBundle.mainBundle().URLForResource("MetalBell", withExtension: "wav")

        AudioServicesCreateSystemSoundID( audioFilePathURL, &soundSystemServicesId)


    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.


    }


    @IBAction func PlayAlertSound(sender: UIButton) {

         AudioServicesPlayAlertSound(soundSystemServicesId)
    }
}

0

スウィフト3

extension SystemSoundID {
    static func playFileNamed(_ fileName: String, withExtenstion fileExtension: String) {
        var sound: SystemSoundID = 0
        if let soundURL = Bundle.main.url(forResource: fileName, withExtension: fileExtension) {
            AudioServicesCreateSystemSoundID(soundURL as CFURL, &sound)
            AudioServicesPlaySystemSound(sound)
        }
    }
}

0

Swift 3は私がそれを行う方法です。

{

import UIKit
import AVFoundation

        let url = Bundle.main.url(forResource: "yoursoundname", withExtension: "wav")!
        do {

            player = try AVAudioPlayer(contentsOf: url); guard let player = player else { return }

            player.prepareToPlay()
            player.play()
        } catch let error as Error {
            print(error)

        }
    }

0

だけimport AVFoundationで、オーディオプレーヤー(var audioPlayer : AVAudioPlayer!)を選択して、サウンドを再生しませんか?(let soundURL = Bundle.main.url(forResource: "sound", withExtension: "wav"


0
import UIKit
import AudioToolbox

class ViewController: UIViewController {

    let toneSound : Array =  ["note1","note2","note3","note4","note5","note6"]

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.

    }

    func playSound(theTone : String) {
        if let soundURL = Bundle.main.url(forResource: theTone, withExtension: "wav") {
            var mySound: SystemSoundID = 0
            do {
                AudioServicesCreateSystemSoundID(soundURL as CFURL, &mySound)
                // Play
                AudioServicesPlaySystemSound(mySound);
            }
            catch {
               print(error)
            }
        }
    }

    @IBAction func anypressed(_ sender: UIButton) {
        playSound(theTone: toneSound[sender.tag-1] )
    }    

}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.