ไม่สามารถเล่นเสียงได้: แอปพลิเคชันขัดข้อง

ฉันพยายามเล่นเสียงในทุกด้าน ก่อนอื่นฉันลองด้วยการกระทำของ SpriteKit:

sprite.runAction(SKAction.playSoundFileNamed("explosion.mp3", waitForCompletion: false))

ฉันยังพยายามแยกโค้ดนี้ออกเป็นสองส่วน: ในวิธี init ฉันเริ่มต้นการดำเนินการเพื่อดำเนินการในภายหลัง แม้ว่าฉันจะเพิ่งเริ่มต้น SKAction แอปก็ขัดข้อง:

self.soundAction = SKAction.playSoundFileNamed("explosion.mp3", waitForCompletion: true)

ฉันได้ลองใช้ AVFoundation แล้ว รหัสนี้อยู่ในวิธีการ init:

let explosionURL = NSBundle.mainBundle().URLForResource("explosion", withExtension: "mp3")
var error:NSError?
let data = NSData(contentsOfURL: explosionURL!)
explosionSoundPlayer = AVAudioPlayer(data: data, fileTypeHint: AVFileTypeMPEGLayer3, error: &error)
if explosionSoundPlayer != nil {
    explosionSoundPlayer?.prepareToPlay()
} else {
    println(error?.localizedDescription)
}

ฉันต้องใช้วัตถุ NSData เพราะมันล้มเหลวด้วย URL วิธีนี้ก็ล้มเหลวเช่นกัน แต่อย่างน้อยก็ให้คำอธิบายข้อผิดพลาดที่มีความหมายมากขึ้นแก่ฉัน:

ทางเลือก ("การดำเนินการไม่เสร็จสมบูรณ์ (ข้อผิดพลาด OSStatus -39.)")


person Ramy Al Zuhouri    schedule 21.09.2015    source แหล่งที่มา
comment
ตรวจสอบให้แน่ใจว่าคุณได้เพิ่มไฟล์เสียงลงในบันเดิลแล้ว ตรวจสอบในอุปกรณ์ด้วย หวังว่าคุณจะโทรมา [explosionSoundPlayer play];   -  person abintom    schedule 21.09.2015
comment
@ abyt07 ใช่ มันอยู่ในบันเดิล และฉันได้รับข้อผิดพลาดเดียวกันบนอุปกรณ์/เครื่องจำลอง   -  person Ramy Al Zuhouri    schedule 21.09.2015


คำตอบ (1)


ฉันเพิ่งทดสอบ AVAudioPlayer และใช้งานได้ทั้งสองวิธี (ไม่ว่าจะด้วย NSData หรือ NSUrl) ตรวจสอบรหัสด้านล่าง:

class GameScene: SKScene {

    var audioPlayer : AVAudioPlayer?

    var soundAction = SKAction.playSoundFileNamed("sound.wav", waitForCompletion: true)

    override func didMoveToView(view:SKView) {


        let explosionURL = NSBundle.mainBundle().URLForResource("music", withExtension: "mp3")
        var error:NSError?
        let data = NSData(contentsOfURL: explosionURL!)
        audioPlayer = AVAudioPlayer(data: data, fileTypeHint: AVFileTypeMPEGLayer3, error: &error)
        if audioPlayer != nil {
            audioPlayer?.prepareToPlay()
        } else {
            println(error?.localizedDescription)
        }

        /*
        var soundUrl = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("music", ofType: "mp3")!)
        println(soundUrl)

        var error:NSError?
        audioPlayer = AVAudioPlayer(contentsOfURL: soundUrl, error: &error)
        audioPlayer?.prepareToPlay()
       */
    }
}

คุณสามารถเล่นเสียงเช่นนี้ได้ (เช่น ในวิธี touchesBegan):

//audioPlayer?.play()

 self.runAction(self.soundAction)

ลองคัดลอกและวางโค้ดนี้ (เพียงเปลี่ยนชื่อเสียงและนามสกุล) เพื่อดูว่าคุณยังได้รับข้อผิดพลาดอยู่หรือไม่ ส่วน NSData นั้นเหมือนกับจากตัวอย่างของคุณ

ฉันเดาว่าคุณรู้อยู่แล้ว แต่ก็ไม่เจ็บที่จะพูดถึงวิธีที่คุณควรเพิ่มไฟล์เสียงในโครงการของคุณ:

  • ลากเสียงไปที่โปรเจ็กต์ของคุณ
  • ในส่วนปลายทาง เลือก "คัดลอกหากจำเป็น"
  • ในส่วนโฟลเดอร์ที่เพิ่ม เลือก "สร้างกลุ่ม"
  • ใน เพิ่มไปยังเป้าหมาย ให้เลือกเป้าหมายของคุณ

หากยังไม่ได้ผล ฉันจะตรวจสอบภายใต้ "ขั้นตอนการสร้าง" -> "คัดลอกทรัพยากรบันเดิล" เพื่อดูว่ามี "explosion.mp3" อยู่หรือไม่ หากไม่เป็นเช่นนั้น ให้ใช้ปุ่ม + (เพิ่มรายการจะปรากฏขึ้นเมื่อโฮเวอร์) และเพิ่มเข้าไป

คำแนะนำ:

โปรดทราบว่าไม่แนะนำให้ใช้ไฟล์ MP3 สำหรับเสียงสั้น เนื่องจาก MP3 ถูกบีบอัดและจำเป็นต้องถอดรหัสด้วยฮาร์ดแวร์ การถอดรหัสต้องใช้เวลาซีพียู นอกจากนี้ สามารถเล่นไฟล์ MP3 ได้เพียงไฟล์เดียวโดยใช้ตัวถอดรหัสฮาร์ดแวร์ หากคุณเล่น mp3 มากกว่าครั้งละหนึ่งไฟล์ ไฟล์เหล่านั้นจะถูกถอดรหัสด้วยซอฟต์แวร์ซึ่งช้า จากเอกสาร:

เมื่อใช้การถอดรหัสแบบใช้ฮาร์ดแวร์ช่วย อุปกรณ์สามารถเล่นได้เพียงอินสแตนซ์เดียวจากหนึ่งในรูปแบบที่รองรับในแต่ละครั้ง ตัวอย่างเช่น หากคุณกำลังเล่นเสียง MP3 สเตอริโอโดยใช้ตัวแปลงสัญญาณฮาร์ดแวร์ เสียง MP3 ที่สองพร้อมกันจะใช้การถอดรหัสซอฟต์แวร์ ในทำนองเดียวกัน คุณไม่สามารถเล่นเสียง AAC และเสียง ALAC โดยใช้ฮาร์ดแวร์พร้อมกันได้ หากแอปพลิเคชัน iPod กำลังเล่นเสียง AAC หรือ MP3 ในพื้นหลัง แสดงว่าแอปพลิเคชันดังกล่าวอ้างสิทธิ์ในตัวแปลงสัญญาณฮาร์ดแวร์ จากนั้นแอปพลิเคชันของคุณจะเล่นเสียง AAC, ALAC และ MP3 โดยใช้การถอดรหัสซอฟต์แวร์

ตัวเลือกที่ดีกว่าสำหรับการเล่นเสียงสั้นคือรูปแบบ .wav และ .caf

person Whirlwind    schedule 22.09.2015
comment
มันยังใช้งานไม่ได้ อาจจะเป็นข้อผิดพลาดของห้องสมุด ฉันจะลองตรวจสอบดู - person Ramy Al Zuhouri; 30.09.2015