草庐IT

ios - AVAudioPlayer 在播放时不会停止

coder 2024-01-29 原文

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

我在按下“播放”按钮之前测试了“停止”按钮,没有问题(打印了消息)。但是,在按下“播放”后,当 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")
}

最佳答案

您遇到的问题是此处的这一行:

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。与 Objective-C 一样,Swift 中的变量应以小写字母开头(也称为 lowerCamelCase)。

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

有关ios - AVAudioPlayer 在播放时不会停止的更多相关文章

  1. ruby - Highline 询问方法不会使用同一行 - 2

    设置:狂欢ruby1.9.2高线(1.6.13)描述:我已经相当习惯在其他一些项目中使用highline,但已经有几个月没有使用它了。现在,在Ruby1.9.2上全新安装时,它似乎不允许在同一行回答提示。所以以前我会看到类似的东西:require"highline/import"ask"Whatisyourfavoritecolor?"并得到:Whatisyourfavoritecolor?|现在我看到类似的东西:Whatisyourfavoritecolor?|竖线(|)符号是我的终端光标。知道为什么会发生这种变化吗? 最佳答案

  2. ruby-on-rails - 项目升级后 Pow 不会更改 ruby​​ 版本 - 2

    我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby​​版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby​​版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘

  3. ruby - 如何验证 IO.copy_stream 是否成功 - 2

    这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

  4. Ruby 文件 IO 定界符? - 2

    我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的

  5. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

    1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

  6. ruby - 为什么不能使用类IO的实例方法noecho? - 2

    print"Enteryourpassword:"pass=STDIN.noecho(&:gets)puts"Yourpasswordis#{pass}!"输出:Enteryourpassword:input.rb:2:in`':undefinedmethod`noecho'for#>(NoMethodError) 最佳答案 一开始require'io/console'后来的Ruby1.9.3 关于ruby-为什么不能使用类IO的实例方法noecho?,我们在StackOverflow上

  7. ruby-on-rails - 使用 javascript 更改数据方法不会更改 ajax 调用用户的什么方法? - 2

    我遇到了一个非常奇怪的问题,我很难解决。在我看来,我有一个与data-remote="true"和data-method="delete"的链接。当我单击该链接时,我可以看到对我的Rails服务器的DELETE请求。返回的JS代码会更改此链接的属性,其中包括href和data-method。再次单击此链接后,我的服务器收到了对新href的请求,但使用的是旧的data-method,即使我已将其从DELETE到POST(它仍然发送一个DELETE请求)。但是,如果我刷新页面,HTML与"new"HTML相同(随返回的JS发生变化),但它实际上发送了正确的请求类型。这就是这个问题令我困惑的

  8. ruby-on-rails - prawnto 显示新页面时不会中断的表格 - 2

    我有可变数量的表格和可变数量的行,我想让它们一个接一个地显示,但如果表格不适合当前页面,请将其放在下一页,然后继续。我已将表格放入事务中,以便我可以回滚然后打印它(如果高度适合当前页面),但我如何获得表格高度?我现在有这段代码pdf.transactiondopdf.table@data,:font_size=>12,:border_style=>:grid,:horizontal_padding=>10,:vertical_padding=>3,:border_width=>2,:position=>:left,:row_colors=>["FFFFFF","DDDDDD"]pdf.

  9. ruby - 使用 Ruby Daemons gem 检测停止 - 2

    我正在使用rubydaemongem。想知道如何向停止操作添加一些额外的步骤?希望我能检测到停止被调用,并向其添加一些额外的代码。任何人都知道我如何才能做到这一点? 最佳答案 查看守护程序gem代码,它似乎没有用于此目的的明显扩展点。但是,我想知道(在守护进程中)您是否可以捕获守护进程在发生“停止”时发送的KILL/TERM信号...?trap("TERM")do#executeyourextracodehereend或者你可以安装一个at_exit钩子(Hook):-at_exitdo#executeyourextracodehe

  10. ruby - 如何以编程方式将 mp3 转换为 itunes 可播放的 aac/m4a 文件? - 2

    我一直在寻找一种以编程方式或通过命令行将mp3转换为aac的方法,但没有成功。理想情况下,我有一段代码可以从我的Rails应用程序中调用,将mp3转换为aac。我安装了ffmpeg和libfaac,并能够使用以下命令创建aac文件:ffmpeg-itest.mp3-acodeclibfaac-ab163840dest.aac当我将输出文件的名称更改为dest.m4a时,它无法在iTunes中播放。谢谢! 最佳答案 FFmpeg提供AAC编码功能(如果您已编译它们)。如果您使用的是Windows,则可以从here获取完整的二进制文件。

随机推荐