• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

ios - AVAudioPlayer 在播放时不会停止

[复制链接]
菜鸟教程小白 发表于 2022-12-11 18:36:04 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我正在开发一款通过逐句播放声音文件来播放旁白的应用。 使用下面的代码,它按预期播放。但是,添加“停止”按钮停止播放后,我发现“停止”按钮并没有停止声音。

我在按下“播放”按钮之前测试了“停止”按钮,没有问题(消息已打印)。但是,在按下“播放”后,当 NarrationPlayer 正在播放时,“停止”按钮不起作用(没有打印任何消息)。

知道有什么问题吗?

import UIKit
import AVFoundation

class ViewController: UIViewController,AVAudioPlayerDelegate {

var NarrationPlayer:AVAudioPlayer = AVAudioPlayer()
var soundlist: [String] = []
var counter = 0
}

func playSound(_ soundfile: String) {

    let NarPath = Bundle.main.path(forResource: soundfile, ofType:"mp3")!
    let NarUrl = URL(fileURLWithPath: NarPath)

    do {
        NarrationPlayer = try AVAudioPlayer(contentsOf: NarUrl)
        NarrationPlayer.delegate = self
    } catch{
        print(error)
    }

    NarrationPlayer.play()

}

@IBAction func play(_ sender: Any) {

soundlist.append("a")
soundlist.append("b")
soundlist.append("c")

playSound("first")

    while counter < soundlist.count{

        if NarrationPlayer.isPlaying == true{

        }
        else{
            playSound(soundlist[counter])
            counter += 1
        }
    }
}

@IBAction func StopPlay(_ sender: Any) {
    print("stop button worked")
}



Best Answer-推荐答案


您遇到的问题是这里的这一行:

while counter < soundlist.count{

占用了主线程,阻止了对“停止播放”按钮的任何点击。

您已经设置了一个委托(delegate)方法,您可以在这里做的一件非常方便的事情是增加您的计数器并在每次声音文件完成时播放您的下一个声音文件。

类似这样的:

func playSound(_ soundfile: String) {

        let NarPath = Bundle.main.path(forResource: soundfile, ofType:"mp3")!
        let NarUrl = URL(fileURLWithPath: NarPath)

        do {
            NarrationPlayer = try AVAudioPlayer(contentsOf: NarUrl)
            NarrationPlayer.delegate = self
        } catch{
            print(error)
        }

        NarrationPlayer.play()

}

func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool)
{
    playSound(self.soundlist[counter])
    counter += 1
}

@IBAction func play(_ sender: Any) {

    playSound("first")

    soundlist.append("a")
    soundlist.append("b")
    soundlist.append("c")
}

最后一条建议:

将名称 NarrationPlayer 更改为 narrationPlayer。 Swift 中的变量,与 Objective-C 中一样,应该以小写字母开头(也称为 lowerCamelCase)。

关于ios - AVAudioPlayer 在播放时不会停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45993011/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap