【问题标题】:AVAudioPlayer not playing sound when tap gesture recognizer pressed按下手势识别器时,AVAudioPlayer 不播放声音
【发布时间】:2017-07-30 00:26:19
【问题描述】:

我正在创建一个抽认卡应用。现在,我可以在每个图像中左右滑动。每个图像都有一个与之关联的声音文件。单击图像时,应播放与其关联的声音文件。截至目前,我可以在图像中滑动,但是当我点击图像时没有声音播放。代码如下。

import UIKit

class SecondViewController: UIViewController , UIGestureRecognizerDelegate  {



var imageIndex: Int = 0
@IBAction func home(_ sender: Any) {
    performSegue(withIdentifier: "home", sender: self)
}

@IBOutlet weak var imgPhoto: UIImageView!


let itemList:[Card] = [
    Card(image: UIImage(named: "alligator")!, soundUrl: "Alligator.m4a"),
    Card(image: UIImage(named: "apple")!, soundUrl: "Apple.m4a"),
    Card(image: UIImage(named: "ball")!, soundUrl: "Ball.m4a")
]



override func viewDidLoad() {
    super.viewDidLoad()


    let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(imageTapped(tapGestureRecognizer:)))
    imgPhoto.isUserInteractionEnabled = true
    imgPhoto.addGestureRecognizer(tapGestureRecognizer)

    imgPhoto.image = (itemList[0] ).image

    // Do any additional setup after loading the view.
    imgPhoto.isUserInteractionEnabled = true

    let leftSwipe = UISwipeGestureRecognizer(target: self, action: #selector(Swiped(gesture:)))
    leftSwipe.cancelsTouchesInView = false

    let rightSwipe = UISwipeGestureRecognizer(target: self, action: #selector(Swiped(gesture:)))
    rightSwipe.cancelsTouchesInView = false

    leftSwipe.direction = .left
    rightSwipe.direction = .right


    view.addGestureRecognizer(leftSwipe)
    view.addGestureRecognizer(rightSwipe)

}

   @IBAction func imageTapped(tapGestureRecognizer: UITapGestureRecognizer)
{
    print("hhh")
    itemList[imageIndex].playSound()
    // Your action
}

func Swiped(gesture: UIGestureRecognizer) {

    if let swipeGesture = gesture as? UISwipeGestureRecognizer {

        switch swipeGesture.direction {

        case UISwipeGestureRecognizerDirection.right :
            print("User swiped right")

            // decrease index first

            imageIndex -= 1

            // check if index is in range

            if imageIndex < 0 {

                imageIndex = itemList.count - 1

            }

            imgPhoto.image = itemList[imageIndex].image

        case UISwipeGestureRecognizerDirection.left:
            print("User swiped Left")
            // increase index first

            imageIndex += 1

            // check if index is in range

            if imageIndex > itemList.count - 1 {

                imageIndex = 0

            }



            imgPhoto.image = itemList[imageIndex].image
        default:


            break //stops the code/codes nothing.
        }
    }
}
}

然后我有另一个类,它具有 AVAudioPlayer 代码并列出了每个“卡”的定义(代码如下)。

import Foundation; import UIKit; import AVFoundation

var player: AVAudioPlayer?

class Card: NSObject
{
var image: UIImage
var soundUrl: String


init(image: UIImage, soundUrl: String) {
    self.image = image
    self.soundUrl = soundUrl
}
func playSound()
{
    guard let url = Bundle.main.url(forResource: self.soundUrl, withExtension: "m4a") else { return }
    do
    {
        try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
        try AVAudioSession.sharedInstance().setActive(true)

        player = try AVAudioPlayer(contentsOf: url)
        guard let player = player else { return }
        player.prepareToPlay()
        player.play()
    print("play")
    } catch let error {
        print(error.localizedDescription)
    }
}
}

代码编译没有错误,但没有声音播放。当我点击屏幕时,程序确实打印了一行,但我没有从播放声音功能打印任何行,这一定意味着该部分代码没有被执行。我已经放了var player:AVAudioPlayer?按照建议在课外,但仍然没有运气。我已经添加了 AVAudioPlayer 框架,所以这也不是问题。

【问题讨论】:

  • 我发布您的答案,确保您提供了正确的扩展名,并且您的卡构造函数不需要它

标签: ios swift avfoundation avaudioplayer uitapgesturerecognizer


【解决方案1】:

我认为问题出在您的扩展名中,您在此处提供了错误的扩展名

 guard let url = Bundle.main.url(forResource: self.soundUrl, withExtension: "m4a")

这里也不需要扩展

Card(image: UIImage(named: "alligator")!, soundUrl: "Alligator"),
    Card(image: UIImage(named: "apple")!, soundUrl: "Apple"),
    Card(image: UIImage(named: "ball")!, soundUrl: "Ball")

使用您的文件扩展名更改扩展名.mp4

【讨论】:

  • 你好,我试过了,但还是没有运气:(我不认为它是在调用播放声音函数
  • 将日志放在播放功能的第一行(在保护语句之前)我相信它会打印日志
  • 你是对的,它确实打印了这一行。我不确定问题可能是什么
  • 我敢肯定...您的文件扩展名是什么以及它的实际位置
  • 我发了截图
【解决方案2】:

您必须将文件扩展名删除为:

let itemList:[Card] = [
    Card(image: UIImage(named: "alligator")!, soundUrl: "Alligator"),
    Card(image: UIImage(named: "apple")!, soundUrl: "Apple"),
    Card(image: UIImage(named: "ball")!, soundUrl: "Ball")
]

因为您在 func playSound() 函数中添加扩展名

guard let url = Bundle.main.url(forResource: self.soundUrl, withExtension: "m4a") else { return }

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

    do {
        try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
        try AVAudioSession.sharedInstance().setActive(true)

        player = try AVAudioPlayer(contentsOf: url)
        guard let player = player else { return }
        player.prepareToPlay()
        player.play()
    } catch let error {
        print(error.localizedDescription)
    }
}

所以它为你的文件名添加了双扩展名,而你的包中没有。

注意:确保您的文件名和扩展名与您的捆绑文件名相同。 该文件需要正确导入(项目构建阶段 > 复制捆绑资源)。

【讨论】:

  • 我这样做了,但它仍然不播放声音。您还有其他想法吗?
  • 请检查文件是否需要正确导入(项目构建阶段>复制捆绑资源)。
  • 我在问题中添加了两个屏幕截图供您查看
  • 请删除应用就绪声音文件夹并再次添加为(项目构建阶段>复制捆绑资源)
  • 检查更新答案,所以添加的文件夹颜色为黄色。
【解决方案3】:

我认为这个问题是由于两个事件同时运行的 NSDefaultRunLoopMode 引起的。当我以毫秒为单位更新标签时,我遇到了这个 NSDefaultRunLoopMode 的问题。打开键盘时,它只是在那段时间没有更新。然后为了解决这个问题,我在 NSRunLoopCommonModes 中运行该计时器。我不确定它是否适用于您的情况,但仍然分享它是否可以帮助您..

【讨论】:

    猜你喜欢
    • 2015-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多