Swift kullanarak ses nasıl çalınır?


149

Swift kullanarak ses çalmak istiyorum.

Kodum Swift 1.0'da çalıştı, ancak şimdi Swift 2 veya daha yeni sürümlerde artık çalışmıyor.

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'a bir göz atın . Bu cevapta daha fazla ayrıntı .
Adam

Sadece sistemden bir ses istiyorsanız bkz . İOS Uygulamasında mevcut sistem seslerini kullanma
Honey

Yanıtlar:


294

En iyisi AVFoundation'ı kullanmak isteyebilirsiniz . Görsel-işitsel medya ile çalışmak için gerekli tüm unsurları sağlar.

Güncelleme: Bazılarınız tarafından yorumlarda önerildiği gibi Swift 2 , Swift 3 ve Swift 4 ile uyumludur .


Hızlı 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)
    }
}

Hızlı 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 uyumlu)

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

Ayarınızın adını ve uzantıyı değiştirdiğinizden emin olun . Dosyanın doğru bir şekilde içe aktarılması gerekir ( Project Build Phases> Copy Bundle Resources). Daha assets.xcassetsfazla kolaylık sağlamak için yerleştirmek isteyebilirsiniz .

Kısa ses dosyaları için .wav, en iyi kalite ve düşük cpu etkisi olduğu için sıkıştırılmamış ses formatları için gitmek isteyebilirsiniz . Daha yüksek disk alanı tüketimi kısa ses dosyaları için çok önemli olmamalıdır. Uzun dosyalardır, aşağıdaki gibi bir sıkıştırılmış biçimi için gitmek isteyebilirsiniz .mp3. Vb pp edin uyumlu ses formatları arasında CoreAudio.


Eğlence-gerçek: Çalma seslerini daha da kolaylaştıran düzgün küçük kütüphaneler var. :)
Örneğin: SwiftySound


Üzgünüz, ancak bu kod artık hızlı 2.0 çalışmıyor "Hata atabilir, ancak 'deneyin' ile işaretlenmez ve hata ele
alınmaz

2
Değiştir bgMusic = AVAudioPlayer(contentsOfURL: bgMusicURL, fileTypeHint: nil)iledo { bgMusic = try AVAudioPlayer(contentsOfURL: bgMusicURL, fileTypeHint: nil) } catch _ { return \\ if it doesn't exist, don't play it}
saagarjha

11
Bu işe almak için AVAudioPlayer nesnesini bir örnek değişken yapmak zorunda kaldı. Yerel bir değişken olarak hiçbir şey oynamaz, hata olmaz. Delegeler de aranmazdı.
Kaleb

2
Neden burada bir gardiyan kullanıyorsunuz? player = try AVAudioPlayer(contentsOf: url) guard let player = player else { return }bana fazladan iş gibi geliyor, neden sadece değil let player = try AVAudioPlayer(contentsOf: url)?
xandermonkey

2
Bir koruma ifadesi kullanmak, nil değeri nedeniyle kilitlenmenizi oldukça güvenli hale getirir.
Aashish

43

For Swift 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)")
    }
}

Yerel varlıklar için en iyi uygulama, onu içine koymaktır assets.xcassetsve dosyayı şu şekilde yüklersiniz :

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

Bu kod benim için iOS 10.2.1, xCode 8.2.1'de çalıştı. Benim için, iki "AVAudioSession deneyin" satırı, gerçek bir cihazda gerçekten duyulup duyulmadığı sesler arasındaki farkı yarattı. Onlarsız, ses yok.
pvanallen

Bu bana bir ton yardımcı oldu, doyine de blokta neler olduğunu anlamakta sorun yaşıyorum . açıkçası player!.play()kendini açıklayıcıdır. Peki setCategoryve setActiveyöntemlerinin amacı nedir?
Shan Robertson

2
Eğer sağlarsanız AVAudioSessionCategoryPlaybackiçin setCategory, bu ses her zaman telefon kilit ekranında veya sessiz modda olsa bile oynanır sağlayacaktır. setActivesisteme uygulamanızın ses çalmaya hazır olduğunu söylemek gibidir
Adi Nugroho

@AdiNugroho sorumla ilgili yardımcı olabileceğini düşünüyorsun: stackoverflow.com/questions/44201592/… ?
JamesG

İOS 11'de bu konuda çok sorun yaşıyorum. Eskiden işe yaradı ama şimdi birdenbire çalışmıyor. Herhangi bir fikir?
nickdnk

15

iOS 12 - Xcode 10 beta 6 - Swift 4.2

Yalnızca 1 IBAction kullanın ve tüm düğmeleri bu 1 eyleme yönlendirin.

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
Herkesin "iOS 11 ve Swift 4 - Komple iOS Uygulama Geliştirme Eğitim
Kampı

12

Kod herhangi bir hata oluşturmaz, ancak ses duymazsanız - oynatıcıyı örnek olarak oluşturun:

   static var player: AVAudioPlayer!

Benim için bu değişikliği yaptığımda ilk çözüm işe yaradı :)


Benim için çalışıyor. Bunu neden statik olarak ayarlamak zorunda olduğunuzu bilen var mı?
kuzdu

3
Statik olması gerektiğini düşünmüyorum (artık?), Ama belki de oluşturulduktan sonra kapsamın dışına çıkmasına izin verirseniz, play () öğesini çağırsanız bile, oynatılmayacak mı? Sınıfımın bir örnek değişkeni haline getirdim ve işe yarıyor.
biomiker

3
@kuzdu Bunun nedeni player, dış kapsamı yerleştirmemenizdir . Aksi takdirde, playeryerelleştirilir ve bu nedenle artık var olmadığı için herhangi bir ses çalamaz.
George_E

Benim için çalıştı - olmadanstatic
Todd

5

Swift 4, 4.2 ve 5

URL'den ve projenizden ses çalın (Yerel Dosya)

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

Hızlı 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

İlk olarak bu kütüphaneleri içe aktarın

import AVFoundation

import AudioToolbox    

delegeyi böyle ayarla

   AVAudioPlayerDelegate

bu güzel kodu düğme eylemine veya bir şey eylemine yaz:

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 projemde çalışıyor ve test edildi


2
AudioToolboxBu yere ithal etmeye gerek yok .
ixany

1

Swift 4 ve iOS 12 ile test edildi:

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

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

Aşağıdaki hatayı alıyorum: The operation couldn’t be completed. (OSStatus error 1954115647.). Her yere baktım ve bir çözüm bulamıyorum. Bu konuda bir soru gönderebilir.
George_E

1

Oyun stili:

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

Kodda herhangi bir yerde

sfx.explosion()
sfx.cheer()

1

Bu, Swift'te bir ses dosyası bulmak ve oynatmak için temel koddur.

Ses dosyanızı Xcode'unuza ekleyin ve aşağıdaki kodu ekleyin.

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

hızlı 4 son sürümünde çalışır. ButtonTag, arayüzünüzdeki bir düğmenin üzerindeki bir etiket olacaktır. Notlar Main.storyboard'a paralel bir klasörde bulunur. Her nota not1, not2 vb. Olarak adlandırılır.


0

AVFoundation'ı içe aktar

AudioToolbox'ı içe aktar

herkese açık final sınıfı 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)
    }
}

}

// Bu işlevi çağırmak için

MP3Player.shared.playLocalFile (adı: "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()
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.