Hızlı bir ses yaratma ve çalma


104

Öyleyse yapmak istediğim, bir düğmeye bastığımda çalacak bir ses yaratmak ve çalmak, bunu Objective-C'de nasıl yapacağımı biliyorum ama Swift'de nasıl yapılacağını bilen var mı?

Objective-C için şöyle olurdu:

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

Ve sonra oynamak için yapardım:

AudioServicesPlaySystemSound(Explosion);

Bunu nasıl yapabileceğimi bilen var mı?


2
Bu sorunun kökü, C işlevlerinin hızlı bir şekilde nasıl çağrılacağıdır. Bunu da merak ediyorum.
67cherries

bu satır ses url'sini oluşturabilir: var url :NSURL = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("mysoundname", ofType: "wav"))
Connor

@connor Teşekkürler işe yarıyor ama AudioServicesCreateSystemSoundID
Jacob Banks

Bunun hakkında emin değilim. Object-c api'yi sadece Swift'den arayabildim.
Connor

Yanıtlar:


84

İşte FlappySwift'e eklediğim ve çalışan bir kod parçası:

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

}

Görünüşe göre audioPlayer'ı kullanmadan hemen önce ilan edebilirdiniz, ancak bu benim için simülatörde işe yaramadı. Ben de senin yaptığın gibi en tepede ilan etmeliydim.
Adam Loving

Eğer doğru kullanmadan önce audioplayer bildirebilirsiniz Loving @Adam, ancak (iyi cevap aksine) Eğer Dahası bunu beyan aynı işlevde play () çağırmak emin olun, ben ilan edeceğini coinSoundve audioPlayerbirlikte letyerine varsen istemiyorsun çünkü bu nesneleri daha sonra değiştirin.
fat32

3
Swift 2'de bu şekilde çalıştırmayı unutmayın, do { (player object) } catch _ { }yoksa bir hata alırsınız! :)
ParisNakitaKejser

1
Ama dikkat! Oynatıcıdaki arka plan müziğini duraklatacaktır. Kısa sesi çalmak için aşağıdaki cevabı kullanmalıyız
Nikita Pronchik

Olumsuz oy - bu bir sistem sesi değil, farklı bir api kullanıyor
William Entriken

119

Bu, diğer bazı yanıtlara benzer, ancak belki biraz daha "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);
}

Bunun, sorudaki kodun etkisini yeniden üreten önemsiz bir örnek olduğunu unutmayın. Emin olmalısınız import AudioToolbox, ayrıca bu tür bir kod için genel model, uygulamanız başladığında seslerinizi yüklemek, onları bir SystemSoundIDyerde örnek değişkenlerine kaydetmek , uygulamanızın tamamında kullanmak ve AudioServicesDisposeSystemSoundIDişiniz bittiğinde aramak olacaktır . onlarla.


1
Ayrıca, AudioToolbox
Brody Robertson'u

Daha AudioServicesDisposeSystemSoundID(mySound)sonra hafızayı boşaltmak için aramanız gerekiyor mu? hemen yaparsanız, ses temelde çalmaz (anında temizlenir), ben de yaptım dispatch_afterve 10 saniye sonra temizledim.
owenfi

@owenfi Cevabımdaki kod parçası, sorudaki kod parçasının Swift karşılığıdır. AudioServices için genel model, uygulamanız çalıştırıldığında seslerinizi yüklemek, bunları uygulama genelinde kullanmak ve uygulama kapandığında bunları atmaktır, ancak her uygulama farklı olacaktır.
Matt Gibson

@ozgur Neden Xcode'un eski bir sürümünü kullanıyorsunuz? "Çalışmama" nın ne anlama geldiğini bilmemiz gerekecek ve belirli sorunlarınız varsa yeni bir soru sormanız muhtemelen daha iyi olacaktır.
Matt Gibson

aslında wav dosyasını oynatmanın tek yolu budur. AVPlayer çalışmıyor gibi görünüyor.
Haitao

18

Kullanışlı Swift uzantısı:

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

Ardından, uygulamanızın herhangi bir yerinden (unutmayın import AudioToolbox),

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

"sound.mp3" çalmak için


Bunu bir SpriteKit oyununda yürüttüğümde, ses çalınmadan önce her zaman gecikme olur. İçine koysam bile DispatchQueue.global(qos: .userInitiated).async {}.
Jon Kantner

NSBundleile değiştirildi Bundle, Bundle.main.url(forResource: fileName, withExtension: fileExtension)bunun yerine kullanın
diachedelic

14

Bu, SystemSoundIDadlı bir dosyadan bir oluşturur 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
}

Kodu derlemeye çalıştınız mı? "Dışa çıkarma türü 'Yönetilmeyen <CFURL>!' Dönüştürülemiyor hatası alıyorum. "CFString" yazmak için "bu satırdan" let soundURL = CFBundleCopyResourceURL (CFBundleGetMainBundle (), "Cha-Ching", "aiff", nil) "
bpolat


2
Sağlanan Obj-C örneğinin AudioToolBox Framework
eharo2

@JochenBedersdorfer, Core Foundation nesnelerinin otomatik olarak bellek tarafından yönetilmesi nedeniyle muhtemelen bir hata alıyorsunuz.
XCool

8

Bir sınıf ve AudioToolbox ile:

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

Kullanım:

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

2
Bu cevabı seviyorum. Ayrıca sistem sesi olduğu için, AVAudioPlayer'ın xcode 8 için konsola attığı sistem mesajını alamıyorum.
TPot

lütfen yardım et ben de aynı şeyi yapıyorum, ses çalıyor ama ses seviyesi çok düşük. duyamıyorum
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()
    }
}

Modern Swift'de AVAudioPlayer (contentOf: soundURL)
kutulu

5

Bu kod benim için çalışıyor. AVAudioPlayer için Try and Catch'i kullanın

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'in bir sistem sesidir, ancak XCode içinde "adlandırılmış" seçeneğine tıklarsanız, bu işlevin sesleri aradığı yeri (QuickHelp bölmesinde) görüntüleyebilirsiniz. "Destekleyici dosyalar" klasörünüzde olabilir


4
Soru iOS ile ilgili.
rmaddy

Nitekim ... Simülatörde yapılamadı. Şu ana kadar belge mevcut değil
philippe

4

Yeni Swift 2.0'a göre do try catch kullanmalıyız. Kod şöyle görünecektir:

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

bu Swift 4 ile çalışıyor:

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

2
Lütfen kodunuzu açıklayın. Yalnızca kod yanıtları açıklamalardan daha az değerlidir.
Vincent

@Vincent +1, aslında merak ediyorum ve operatörü. Buna ses ve hafıza arasında başvurulabilir.
elia

AudioToolbox'ı içe aktarmanız ve ardından yukarıdaki kodu eklemeniz gerekir
Mohammad Aboelnasr

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

Bu soruya daha güncel bir yaklaşım görelim:

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
Kod Swift 4 cezası çalışır, ancak görünüşe yayılan ses medya hacmini takip etmez
David Vargas

1

Matt Gibson'ın çözümü benim için çalıştı, işte hızlı 3 versiyonu.

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

1

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

veya

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

çalışır 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 kodu örneği :

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

Lütfen bu kodun neden yararlı olduğuna dair daha fazla ayrıntı ekleyin.
Berendschot

1

Bunu Swift 5.2'de deneyebilirsiniz:

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

}


Sadece kod göndermeyin - ne işe yaradığını açıklayın! stackoverflow.com/help/how-to-answer
Nino Filiu

lütfen bu yazının sorusuna bakın. Cevabınızı bulabilirsiniz! teşekkür ederim @NinoFiliu
Gulsan Borbhuiya

0

Swift'de ses çıkarmak için Bu İşlevi kullanın (Bu işlevi ses yapmak istediğiniz yerde kullanabilirsiniz.)

İlk olarak SpriteKit ve AVFoundation Framework'ü ekleyin.

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

Bu kod benim için çalışıyor:

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

For Swift 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 işte böyle yapıyorum.

{

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

Sadece import AVFoundation, ses çaları ( var audioPlayer : AVAudioPlayer!) seçip sesi çalamaz mısınız? ( 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] )
    }    

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