स्विफ्ट का उपयोग करके ध्वनि कैसे खेलें?


148

मैं स्विफ्ट का उपयोग करके एक ध्वनि खेलना चाहूंगा।

मेरे कोड ने स्विफ्ट 1.0 में काम किया लेकिन अब यह स्विफ्ट 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 पर एक नज़र डालेंइस उत्तर में अधिक जानकारी ।
एडम

यदि आप सिस्टम से सिर्फ एक साउंड चाहते हैं तो देखें: iOS ऐप में मौजूदा सिस्टम साउंड्स का उपयोग करना
हनी

जवाबों:


291

अधिमानतः आप उपयोग करना चाह सकते हैं AVFoundation । यह दृश्य-श्रव्य मीडिया के साथ काम करने के लिए सभी आवश्यक चीजें प्रदान करता है।

अद्यतन: स्विफ्ट 2 , स्विफ्ट 3 और के साथ संगत स्विफ्ट 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उनके पास सबसे अच्छी गुणवत्ता और कम सीपीयू प्रभाव है। उच्च डिस्क-स्थान की खपत कम ध्वनि फ़ाइलों के लिए एक बड़ी बात नहीं होनी चाहिए। जितनी लंबी फाइलें हैं, आप एक संपीड़ित प्रारूप जैसे .mp3पीपीपी आदि के लिए जाना चाहते हैं । संगत ऑडियो प्रारूपों की जांच करें की CoreAudio


मौज-मस्ती: साफ सुथरी छोटी लाइब्रेरियां हैं जो बजाने की आवाज़ को और भी आसान बनाती हैं। :)
उदाहरण के लिए: स्विफ्टसाउंड


क्षमा करें, लेकिन यह कोड अब तेजी से 2.0 में काम नहीं करता है, यह एक त्रुटि का संकेत देता है "कॉल फेंक सकते हैं, लेकिन यह 'कोशिश' के साथ चिह्नित नहीं है और त्रुटि को संभाला नहीं है"
मिशेल कंसो

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}
सागरजी

11
मुझे यह काम करने के लिए AVAudioPlayer ऑब्जेक्ट को एक उदाहरण चर बनाना पड़ा। एक स्थानीय चर के रूप में यह कुछ भी नहीं खेलेंगे, कोई त्रुटि नहीं। प्रतिनिधियों को भी नहीं बुलाया जाएगा।
कालेब

2
आप यहां एक गार्ड का उपयोग क्यों करते हैं? player = try AVAudioPlayer(contentsOf: url) guard let player = player else { return }मेरे लिए अतिरिक्त काम की तरह लगता है, बस क्यों नहीं let player = try AVAudioPlayer(contentsOf: url)?
xandermonkey

2
एक गार्ड स्टेटमेंट का उपयोग करना आपको शून्य मान के कारण दुर्घटनाग्रस्त होने से बहुत सुरक्षित बनाता है।
आशीष

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 पर काम किया। मेरे लिए, दो "एवीएडियोसिशन की कोशिश करो" लाइनों ने वास्तव में वास्तविक डिवाइस पर सुनाई देने वाली ध्वनियों के बीच अंतर किया या नहीं। उनके बिना, कोई आवाज नहीं।
पावनलेन २ '’१:58 को

इससे मुझे एक टन में मदद मिली, मुझे यह समझने में थोड़ी परेशानी हो रही है कि doब्लॉक में क्या होता है । स्पष्ट रूप player!.play()से आत्म व्याख्यात्मक है। लेकिन तरीकों setCategoryऔर setActiveतरीकों का उद्देश्य क्या है ?
शान रॉबर्टसन

2
यदि आप प्रदान करते AVAudioSessionCategoryPlaybackहैं setCategory, तो यह सुनिश्चित करेगा कि ऑडियो हमेशा खेला जाए भले ही फोन लॉक स्क्रीन में या साइलेंट मोड में हो। setActiveसिस्टम को यह बताने जैसा है कि आपका ऐप ऑडियो प्ले करने के लिए तैयार है
Adi Nugroho

@AdiNugroho क्या आपको लगता है कि आप मेरे सवाल में मदद कर सकते हैं: stackoverflow.com/questions/44201592/ ... ?
जेम्सजी

मुझे iOS 11 पर इससे बहुत परेशानी हो रही है। यह काम करता था लेकिन अब यह अचानक नहीं होता। कोई विचार?
निकडन

15

iOS 12 - Xcode 10 बीटा 6 - स्विफ्ट 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!")
    }
}

5
यह मज़ेदार है कि आप यह मान रहे हैं कि हर कोई "iOS 11 और स्विफ्ट 4 - कम्प्लीट आईओएस ऐप डेवलपमेंट
बूटकैंप

12

यदि कोड कोई त्रुटि उत्पन्न नहीं करता है, लेकिन आप ध्वनि नहीं सुनते हैं - उदाहरण के लिए खिलाड़ी बनाएं:

   static var player: AVAudioPlayer!

मेरे लिए पहला समाधान तब काम किया जब मैंने यह बदलाव किया :)


मेरे लिये कार्य करता है। क्या किसी को पता है कि आपको इसे स्थिर करने की आवश्यकता क्यों है?
कुज्डू

3
मुझे नहीं लगता कि इसे स्टैटिक होना चाहिए (अब?), लेकिन ऐसा लगता है कि यदि आपने इसे बनाने के बाद इसे स्कोप से बाहर जाने दिया, भले ही आपने प्ले () कहा हो, यह नहीं चलेगा? मैंने इसे अपनी कक्षा का एक उदाहरण चर बनाया है और यह काम करता है।
बायोमाइकर

3
@kuzdu यह आपके playerबाहर के दायरे में नहीं रखने के कारण है । अन्यथा, playerहतोत्साहित हो जाता है और इसलिए कोई ध्वनि नहीं चला सकता क्योंकि यह अब मौजूद नहीं है।
जॉर्ज_ई

मेरे लिए काम किया - बिनाstatic
टोड

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

स्विफ्ट 4 और आईओएस 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.)। मैंने हर जगह देखा है, और कोई समाधान नहीं ढूंढ सकता। इसके बारे में एक प्रश्न पोस्ट कर सकते हैं।
जॉर्ज_ई

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

स्विफ्ट में ऑडियो फ़ाइल खोजने और चलाने के लिए यह मूल कोड है।

अपनी ऑडियो फ़ाइल को अपने 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!")
    }
}

स्विफ्ट 4 नवीनतम संस्करण में काम करता है। ButtonTag आपके इंटरफ़ेस पर एक बटन पर एक टैग होगा। नोट्स Main.storyboard के समानांतर एक फ़ोल्डर में हैं। प्रत्येक नोट को नोट 1, नोट 2 इत्यादि के रूप में नामित किया गया है, बटनटैग नंबर 1, 2, आदि पर क्लिक किए गए बटन से दे रहा है जिसे पैराम के रूप में पारित किया गया है।


0

आयात AVFoundation

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

सार्वजनिक अंतिम वर्ग 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.saring.playLocalFile (नाम: "जंगलबुक")


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