स्विफ्ट में साउंड बनाना और बजाना


103

तो मैं क्या करना चाहता हूँ बनाने के लिए और तेज में एक ध्वनि खेलते हैं जो कि एक बटन दबाने पर खेलेंगे, मुझे पता है कि इसे ऑब्जेक्टिव-सी में कैसे करना है, लेकिन क्या कोई जानता है कि स्विफ्ट में कैसे करें?

यह उद्देश्य-सी के लिए इस तरह होगा:

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

और फिर इसे खेलने के लिए मैं करूँगा:

AudioServicesPlaySystemSound(Explosion);

क्या किसी को पता है कि मैं ऐसा कैसे कर सकता हूं?


2
इस सवाल की जड़ यह है कि सी फ़ंक्शन को स्विफ्ट से कैसे कॉल किया जाए। मैं इस बारे में भी उत्सुक हूं।
67

यह लाइन ध्वनि url बना सकती है: var url :NSURL = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("mysoundname", ofType: "wav"))
कॉनर

@connor धन्यवाद कि काम करता है, लेकिन क्या के बारे में AudioServicesCreateSystemSoundID
याकूब बैंकों

मैं इस बारे में निश्चित नहीं हूं। मैं केवल स्विफ्ट से ऑब्जेक्टिव-सी एपीआई को कॉल करने में सक्षम हूं।
कोनोर

जवाबों:


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, लेकिन आप play () एक ही समारोह में आप इसे घोषित इसके अलावा (के रूप में अच्छा जवाब के खिलाफ) में आह्वान सुनिश्चित कर लें, मैं घोषणा करेंगे coinSoundऔर audioPlayerसाथ letके बजाय varजब से तुम नहीं करना चाहते बाद में इन वस्तुओं को समय पर बदल दें।
वसा ३२

3
स्विफ्ट 2 में इसे इस तरह से चलाने के लिए याद रखें do { (player object) } catch _ { }या आपका बग मिलेगा! :)
पैरिसकिटकेजर

1
लेकिन ध्यान! यह खिलाड़ी से पृष्ठभूमि संगीत को रोक देगा। छोटी ध्वनि बजाने के लिए हमें नीचे उत्तर का उपयोग करना चाहिए
निकिता प्रोनिक

डाउनवोट - यह एक सिस्टम साउंड नहीं है, यह एक अलग एपीआई का उपयोग कर रहा है
विलियम एंट्रीकेन

119

यह कुछ अन्य उत्तरों के समान है, लेकिन शायद थोड़ा अधिक "स्विफ्टी":

// 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
आपको ऑडियोटूलबॉक्स
ब्रॉडी रॉबर्टसन

क्या आपको AudioServicesDisposeSystemSoundID(mySound)बाद में मेमोरी को खाली करने के लिए कॉल करने की आवश्यकता है ? यदि आप इसे ठीक से करते हैं तो ध्वनि मूल रूप से नहीं बजती है (तुरंत साफ हो जाती है) तो मैंने किया dispatch_afterऔर इसे 10 सेकंड बाद साफ किया।
7

@owenfi मेरे उत्तर में कोड का टुकड़ा प्रश्न में कोड के टुकड़े के बराबर स्विफ्ट है। AudioServices के लिए सामान्य पैटर्न यह है कि जब आपका ऐप आग उगलता है, तो वे आपकी आवाज़ों को लोड करते हैं, ऐप में उनका उपयोग करते हैं, और ऐप बंद होने पर उनका निपटान करते हैं, लेकिन प्रत्येक ऐप अलग होगा।
मैट गिब्सन

@ozgur आप Xcode के पुराने संस्करण का उपयोग क्यों कर रहे हैं? हमें यह जानना होगा कि "काम नहीं करने" का अर्थ क्या है, और यदि आपके पास विशिष्ट मुद्दे हैं, तो आप एक नया सवाल पूछना बेहतर होगा।
मैट गिब्सन

वास्तव में यह wav फ़ाइल को चलाने का एकमात्र तरीका है। AVPlayer काम नहीं करता है।
हाइताओ

18

आसान स्विफ्ट एक्सटेंशन:

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 {}
जॉन कांतनर

NSBundleद्वारा प्रतिस्थापित किया गया है Bundle, Bundle.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) ()," चा-चिंग ","
aiff

हां, यह मेरे लिए संकलन है। देखें github.com/acani/Chats/blob/master/Chats/Chats/…
ma11hew28

2
यह स्वीकृत उत्तर होना चाहिए, यह देखते हुए कि प्रदान किया गया Obj-C उदाहरण AudioToolBox फ्रेमवर्क में आधारित है
eharo2

@JochenBedersdorfer, आपको संभवतः कोर फ़ाउंडेशन ऑब्जेक्ट्स द्वारा स्वचालित रूप से मेमोरी प्रबंधित होने के कारण त्रुटि हो रही है।
XCool

8

एक क्लास और ऑडियोटूलबॉक्स के साथ:

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
मुझे यह जवाब पसंद है। यह भी है क्योंकि यह सिस्टम साउंड है, मुझे सिस्टम मैसेज नहीं मिलता है कि AVAudioPlayer कंसोल में Xcode 8 के लिए है।
TPot

कृपया मदद मैं एक ही काम कर रहा हूँ, ध्वनि खेलता है, लेकिन मात्रा बहुत कम है। सुना नहीं जा सकता
वीरेश कुंभार

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

यह आधुनिक स्विफ्ट में AVAudioPlayer (contentOf: soundurL) है
बॉक्सिंग

5

यह कोड मेरे लिए काम करता है। AVAudioPlayer के लिए ट्राइ और कैच का उपयोग करें

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 के भीतर "नाम" पर क्लिक करते हैं, तो आप देख पाएंगे (क्विकहीलप पैन में) जहां यह फ़ंक्शन ध्वनियों को खोज रहा है। यह आपके "सहायक फ़ाइलों" फ़ोल्डर में हो सकता है


4
सवाल आईओएस को लेकर है।
17

वास्तव में ... यह सिम्युलेटर में नहीं बना सका। कोई दस्तावेज़ में दिनांक उपलब्ध
फिलिप

4

नई स्विफ्ट 2.0 के अनुसार हमें कैच ट्राई कैच का इस्तेमाल करना चाहिए। कोड इस तरह दिखेगा:

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

यह स्विफ्ट 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 +1, वास्तव में मैं सोच रहा हूं और ऑपरेटर। यह ध्वनि और स्मृति के बीच संदर्भित किया जा सकता है।
एलिया

आपको आयात
ऑडियोटूलबॉक्स

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
स्विफ्ट 4 पर कोड ठीक काम करता है, लेकिन स्पष्ट रूप से उत्सर्जित ध्वनि मीडिया वॉल्यूम का पालन नहीं करती है
डेविड वर्गास

1

मैट गिब्सन के समाधान ने मेरे लिए काम किया, यहां स्विफ्ट 3 संस्करण है।

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

स्विफ्ट कोड उदाहरण :

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

1

आप इसे स्विफ्ट 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

स्विफ्ट 4 और आईओएस 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
नीनो फीलू

कृपया इस पोस्ट के प्रश्न को देखें। आप अपना जवाब पा सकते हैं! साभार @NinoFiliu
गुलशन बोरभूया

0

स्विफ्ट में ध्वनि बनाने के लिए इस फ़ंक्शन का उपयोग करें (आप इस फ़ंक्शन का उपयोग कर सकते हैं जहां आप ध्वनि बनाना चाहते हैं।)

पहले 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

स्विफ्ट 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] )
    }    

}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.