Tidak dapat memutar suara: aplikasi mogok

Saya mencoba memutar suara dengan segala cara: pertama saya mencoba dengan tindakan SpriteKit:

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

Saya juga mencoba membagi kode ini menjadi dua bagian: dalam metode init saya menginisialisasi tindakan, untuk dieksekusi nanti. Namun meskipun saya baru saja menginisialisasi SKAction, aplikasinya mogok:

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

Saya juga sudah mencoba dengan AVFoundation. Kode ini ada di dalam metode 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)
}

Saya harus menggunakan objek NSData karena gagal dengan URL. Cara ini gagal juga, tapi setidaknya ini memberi saya deskripsi kesalahan yang lebih bermakna:

Opsional("Operasi tidak dapat diselesaikan. (Kesalahan OSSstatus -39.)")


person Ramy Al Zuhouri    schedule 21.09.2015    source sumber
comment
Pastikan Anda telah menambahkan file suara ke bundel. Verifikasi juga di perangkat. Semoga Anda menelepon [explosionSoundPlayer play];   -  person abintom    schedule 21.09.2015
comment
@ abyt07 Ya, itu ada di dalam bundel, dan saya mendapatkan kesalahan yang sama pada perangkat/simulator.   -  person Ramy Al Zuhouri    schedule 21.09.2015


Jawaban (1)


Saya baru saja menguji AVAudioPlayer dan berfungsi untuk saya dalam dua cara (baik dengan NSData atau NSUrl). Periksa kode di bawah ini:

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

Anda dapat memutar suara seperti ini (misalnya dalam metode touchBegan):

//audioPlayer?.play()

 self.runAction(self.soundAction)

Coba salin & tempel kode ini (cukup ubah nama suara dan ekstensinya) untuk melihat apakah Anda masih mendapatkan kesalahan. Bagian NSData sama dengan contoh Anda.

Saya rasa Anda sudah mengetahuinya, namun tidak ada salahnya menyebutkan bagaimana Anda harus menambahkan file suara ke proyek Anda:

  • Seret suara ke proyek Anda
  • Di bagian Tujuan, pilih "Salin jika diperlukan"
  • Di bagian Folder yang Ditambahkan, pilih "Buat grup"
  • Di Tambahkan ke Target, pilih target Anda.

Jika masih tidak berhasil, saya akan memeriksa di bawah "Build Phases" -> "Copy Bundle Resources" untuk melihat apakah "explosion.mp3" ada. Jika tidak, gunakan tombol + (tambahkan item akan muncul saat mengarahkan kursor) dan tambahkan.

Petunjuk:

Perhatikan bahwa menggunakan file mp3 untuk suara pendek tidak disarankan karena mp3 dikompresi dan memerlukan decoding perangkat keras. Penguraian kode membutuhkan waktu CPU. Selain itu, hanya satu file mp3 yang dapat diputar menggunakan dekoder perangkat keras. Jika Anda memutar lebih dari satu mp3 sekaligus, mp3 tersebut akan diterjemahkan dengan perangkat lunak dan itu lambat. Dari dokumen:

Saat menggunakan decoding berbantuan perangkat keras, perangkat hanya dapat memutar satu contoh dari salah satu format yang didukung dalam satu waktu. Misalnya, jika Anda memutar suara MP3 stereo menggunakan codec perangkat keras, suara MP3 simultan kedua akan menggunakan decoding perangkat lunak. Demikian pula, Anda tidak dapat memutar suara AAC dan ALAC secara bersamaan menggunakan perangkat keras. Jika aplikasi iPod memutar suara AAC atau MP3 di latar belakang, maka aplikasi tersebut mengklaim codec perangkat kerasnya; aplikasi Anda kemudian memutar audio AAC, ALAC, dan MP3 menggunakan decoding perangkat lunak.

Pilihan yang lebih baik untuk memutar suara pendek adalah format .wav dan .caf.

person Whirlwind    schedule 22.09.2015
comment
Ini masih tidak berfungsi. Mungkin itu bug perpustakaan, saya akan mencoba memeriksanya. - person Ramy Al Zuhouri; 30.09.2015