Как я могу воспроизвести звук на iOS? - PullRequest
0 голосов
/ 03 февраля 2020

Я построил генератор случайных чисел, я хочу, чтобы он воспроизводил звук при нажатии кнопки. XCode не дает мне никаких ошибок, и когда я моделирую свое приложение, он генерирует числа без проблем, но нет звука. У меня звук в папке со звуком.

Вот мой код.

import UIKit
import AVFoundation


class ViewController: UIViewController {

    var player: AVAudioPlayer!

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    @IBOutlet weak var operations: UIImageView!
    @IBOutlet weak var bottomRightNumber: UIImageView!
    @IBOutlet weak var bottomMiddleNumber: UIImageView!
    @IBOutlet weak var bottomLeftNumber: UIImageView!
    @IBOutlet weak var topRightNumber: UIImageView!
    @IBOutlet weak var topMiddleNumber: UIImageView!
    @IBOutlet weak var topLeftNumber: UIImageView!

    @IBAction func buttonPressed(_ sender: UIButton) {

        let numberArray = [#imageLiteral(resourceName: "RN1"), #imageLiteral(resourceName: "RN2"), #imageLiteral(resourceName: "RN3"), #imageLiteral(resourceName: "RN4"),#imageLiteral(resourceName: "RN5"), #imageLiteral(resourceName: "RN6"), #imageLiteral(resourceName: "RN7"), #imageLiteral(resourceName: "RN8"), #imageLiteral(resourceName: "RN9"), #imageLiteral(resourceName: "RN0")]

        bottomRightNumber.image = numberArray.randomElement()
        bottomLeftNumber.image = numberArray.randomElement()
        bottomMiddleNumber.image = numberArray.randomElement()
        topRightNumber.image = numberArray.randomElement()
        topMiddleNumber.image = numberArray.randomElement()
        topLeftNumber.image = numberArray.randomElement()

        let operationArray = [#imageLiteral(resourceName: "-"), #imageLiteral(resourceName: "+")]

        operations.image = operationArray.randomElement()

            func playSound() {
                guard let url = Bundle.main.url(forResource: "A", withExtension: "wav") else { return }

             do { /* 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)
                player.play()

                }
            }
        }
}

Ответы [ 4 ]

0 голосов
/ 11 марта 2020

вы можете сделать 2 вещи: 1. Вынуть функцию playSound () из действия buttonPressed и вызвать функцию playSound () - потому что я вижу, что вы не вызывали функцию для воспроизведения звука. 2. Вы можете просто извлечь аудиокод из функции playSound (), если в конечном итоге собираетесь использовать его там сам.

0 голосов
/ 03 февраля 2020

Если вы хотите воспроизводить звуки в приложении iOS, прекратите то, что вы делаете. Отбросьте руководство по встроенным аудио-сервисам swift и используйте фреймворк.

AudioKit - невероятно мощный фреймворк, созданный некоторыми очень компетентными аудиопрограммистами. Эта библиотека имеет приятный API, хорошо документирована и очень мощная. У них есть множество примеров приложений, включая примеры кода, которые помогут вам начать работу. Если вы просто хотите воспроизвести звук, вы будете охвачены. Если вы хотите построить гранулярный синтезатор, вас тоже покроют.

Особенно, если вы новичок в программировании, обычно кто-то делает тяжелую работу за вас. Не изобретай велосипед!

0 голосов
/ 03 февраля 2020

Похоже, вы только что скопировали и вставили чужой код. Но вы вставили в какой-то другой код, поэтому проблема в том, что ваш код, воспроизводящий звук, оказался заключенным в объявление вложенной функции внутри вашего func buttonPressed кода:

func playSound() {
    guard let url = Bundle.main.url(forResource: "A", withExtension: "wav") else { return }
    do { 
        player = try! AVAudioPlayer(contentsOf: url, fileTypeHint: AVFileType.wav.rawValue)
        player.play() // this is where sound _would_ play
    }
}

Ничто никогда не вызывает эту функцию, поэтому она никогда не запускается.

Просто удалите те две строки, которые переносят код, и теперь код может выполняться как часть того, что делает buttonPressed. Я бы также предложил удалить бессмысленную конструкцию do, так что в итоге вы получите следующее:

    guard let url = Bundle.main.url(forResource: "A", withExtension: "wav") else { return }
    player = try! AVAudioPlayer(contentsOf: url, fileTypeHint: AVFileType.wav.rawValue)
    player.play() // this is where sound _would_ play

Ваш звук все еще может не воспроизводиться, или вы можете создать sh, но, по крайней мере, теперь код действительно будет работать!


Сказав все это, позвольте мне немного изменить код, чтобы продемонстрировать лучшие практики:

    guard let url = Bundle.main.url(forResource: "A", withExtension: "wav") else {
        print("the URL was not valid") // tell yourself what went wrong
        return
    }
    do {
        player = try AVAudioPlayer(contentsOf: url, fileTypeHint: AVFileType.wav.rawValue)
        player.play()
    } catch { print(error) } // tell yourself what went wrong

В этом версия, я положил конструкцию do обратно, но на этот раз она действительно делает что-то полезное.

0 голосов
/ 03 февраля 2020

Вот класс сэмплов для воспроизведения звуков,

import Foundation
import AudioToolbox
import AVKit

class SoundManager {

    static var objPlayer: AVAudioPlayer?
    class func playAppLaunchSound() {

        registerAndPlaySoundForFile(fileName: "AppLaunchSound", fileExtension: "mp3")
    }

    class func playEnterButtonSound() {

        registerAndPlaySoundForFile(fileName: "EnterButtonSound", fileExtension: "mp3")
    }

    private class func registerAndPlaySoundForFile(fileName: String, fileExtension: String, withVibration: Bool = true) {

        let bundle = Bundle.main
        guard let url = bundle.url(forResource: fileName, withExtension: fileExtension) else {
            return
        }
        do {
            try AVAudioSession.sharedInstance().setCategory(AVAudioSession.Category.ambient)
            try AVAudioSession.sharedInstance().setActive(true)
                        objPlayer = try AVAudioPlayer(contentsOf: url, fileTypeHint: AVFileType.mp3.rawValue)
            guard let aPlayer = objPlayer else { return }
            aPlayer.play()

        } catch let error {
            print(error.localizedDescription)
        }
    }
}

registerAndPlaySoundForFile - основной метод воспроизведения звука! Вы можете использовать его как SoundManager.playEnterButtonSound(). Вы можете создать несколько методов в этом классе следующим образом.

...