AVAudioPlayer 在模拟器上工作但在真实设备上不工作

2023-12-09

当我播放录制的音频时,出现此错误:

致命错误:在解包可选值时意外发现 nil

在这行代码上:

SoundPlayer = try AVAudioPlayer(contentsOfURL: getFileURL())

但它在除真实设备之外的模拟器上运行良好。

ViewController.Swift:

import UIKit
import AVFoundation

class ViewController: UIViewController, AVAudioPlayerDelegate, AVAudioRecorderDelegate {

    @IBOutlet var PlayBTN: UIButton!
    @IBOutlet var RecordBTN: UIButton!


    var soundRecorder : AVAudioRecorder!
    var SoundPlayer : AVAudioPlayer!

    var fileName = "audioFile.m4a"

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        setupRecorder()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    func setupRecorder(){

        let recordSettings = [AVSampleRateKey : NSNumber(float: Float(44100.0)),
            AVFormatIDKey : NSNumber(int: Int32(kAudioFormatMPEG4AAC)),
            AVNumberOfChannelsKey : NSNumber(int: 1),
            AVEncoderAudioQualityKey : NSNumber(int: Int32(AVAudioQuality.Max.rawValue))]

        do{
            try soundRecorder = AVAudioRecorder(URL: getFileURL(), settings: recordSettings)
                soundRecorder.delegate = self
                soundRecorder.prepareToRecord()
        }
        catch let error as NSError {
            error.description
        }

    }

    func getCacheDirectory() -> String {

        let paths = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true) 

        return paths[0]

    }

    func getFileURL() -> NSURL{
        let path  = (getCacheDirectory() as NSString).stringByAppendingPathComponent(fileName)

        let filePath = NSURL(fileURLWithPath: path)


        return filePath
    }


    @IBAction func Record(sender: UIButton) {

        if sender.titleLabel?.text == "Record"{

            soundRecorder.record()
            sender.setTitle("Stop", forState: .Normal)
            PlayBTN.enabled = false

        }
        else{

            soundRecorder.stop()
            sender.setTitle("Record", forState: .Normal)
            PlayBTN.enabled = false
        }

    }

    @IBAction func PlaySound(sender: UIButton) {

        if sender.titleLabel?.text == "Play" {

            RecordBTN.enabled = false
            sender.setTitle("Stop", forState: .Normal)

            preparePlayer()
            SoundPlayer.play()

        }
        else{

            SoundPlayer.stop()
            sender.setTitle("Play", forState: .Normal)

        }

    }

    func preparePlayer(){
        do{
            SoundPlayer = try AVAudioPlayer(contentsOfURL: getFileURL())
            SoundPlayer.delegate = self
            SoundPlayer.volume = 1.0
            SoundPlayer.prepareToPlay()
        }
        catch let error as NSError {
            error.description
        }
    }

    func audioRecorderDidFinishRecording(recorder: AVAudioRecorder, successfully flag: Bool) {
        PlayBTN.enabled = true
    }

    func audioPlayerDidFinishPlaying(player: AVAudioPlayer, successfully flag: Bool) {
        RecordBTN.enabled = true
        PlayBTN.setTitle("Play", forState: .Normal)
    }

    @IBAction func actDone(sender: AnyObject) {
        //viewRecorder.hidden = true

        let fm = NSFileManager.defaultManager()
        let documentsDirectory = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as String

        do {
            let items = try fm.contentsOfDirectoryAtPath(documentsDirectory)

            for item in items {
                print(item)
            }
        }
        catch let error as NSError {
            error.description
        }
    }
}

ViewController.Swift 的故事板文件:

enter image description here

附加信息:

  • Xcode版本:7.2.1
  • 设备:iPhone 5s
  • iOS版本:9.2.1

Note:我寻找过类似的解决方案,但没有一个对我有帮助。其中一些是由于较旧的 Swift 版本和已弃用的方法造成的。一些解决方案涉及从应用程序包中播放音频文件,一些解决方案使用 Web URL。所以,这种情况是不同的(真实设备与模拟器)

这是源代码的链接谷歌云端硬盘.


在真实设备上,它需要setCategory() for AVAudioSession.sharedInstance()

并且可以下载固定的项目here too.

func setupRecorder(){

        let audioSession = AVAudioSession.sharedInstance()
        do {
            try audioSession.setCategory(AVAudioSessionCategoryPlayAndRecord)
        } catch let error as NSError {
            print(error.description)
        }

        let recordSettings = [AVSampleRateKey : NSNumber(float: Float(44100.0)),
            AVFormatIDKey : NSNumber(int: Int32(kAudioFormatMPEG4AAC)),
            AVNumberOfChannelsKey : NSNumber(int: 1),
            AVEncoderAudioQualityKey : NSNumber(int: Int32(AVAudioQuality.Max.rawValue))]

        do{
            try soundRecorder = AVAudioRecorder(URL: getFileURL(), settings: recordSettings)
                soundRecorder.delegate = self
                soundRecorder.prepareToRecord()
        }
        catch let error as NSError {
            error.description
        }

    }

注意:音频会话是您的应用程序和 iOS 之间的中介,用于配置应用程序的音频行为。如果我们设置类别为AVAudioSessionCategoryPlayAndRecord,我们定义 iOS 音频行为以允许音频输入(录音)和输出(播放)。 参考自:音频会话编程指南

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

AVAudioPlayer 在模拟器上工作但在真实设备上不工作 的相关文章

  • iOS 5 UIView drawRect 覆盖在设备上不起作用

    我正在准备在 iOS 5 GM 上发布我的 iPhone 应用程序 并遇到了 UIView 的错误 当我在子类上重写 drawRect 方法时 模拟器会显示所需的结果 但当我尝试在实际设备上测试时 drawRect 重写根本没有任何效果 我
  • Flutter-iOS 当应用程序更新/重新编译时存储的图像丢失

    嗨 请原谅我的英语 也是 flutter iOS 的新手 我在 iOS 上有一个关于 flutter 的应用程序 用户可以从他们的相机和图库中拍摄照片和视频 我正在使用 image picker 包 这没有问题 然后我将其保存在在其应用程序
  • iOS FacebookSDK + 解析 SDK + GoogleMaps SDK

    我搜索了很多 然后我意识到 ObjC标记那个GoogleMapSDK需要 但不能很好地配合ParseSDK and FacebookSDK 所以我阅读了所有的 stackoverflow 答案并尝试解决我的问题 问题还没有解决 我执行的步骤
  • iOS 何时清理本地应用程序 ./tmp 目录?

    iOS什么时候清理本地应用程序 tmp目录 请注意 这不是一个骗局这个问题 https stackoverflow com questions 3593900 iphone storage in tmp directory 我问的是应用程序
  • 使用 JSONKit 解析 JSON 文件

    我正在构建一个音叉应用程序 货叉应允许最多 12 个预设节距 此外 我希望允许用户选择一个主题 每个主题都会加载一组预设 不必使用所有预设 我的配置文件看起来像这样 theme A3 comment An octave below conc
  • 与 parse-server 和 auth0 的自定义身份验证集成

    我想将 auth0 com 与开源解析服务器结合使用 我当前的方法是通过 iOS 的 Lock 库使用标准登录从 auth0 获取令牌 使用该令牌 我想在解析服务器上调用自定义身份验证方法 该方法检查令牌是否有效 如果有效则将登录用户 我的
  • iOS 上关键 ClientState 警告的默认访问速度缓慢

    在测试我的 iOS 应用程序时 我收到 对关键 ClientState 的默认访问速度慢 耗时 0 034635 秒 容差为 0 020000 警告 它似乎是间歇性发生的 我试图环顾四周看看它是关于什么的 但我并不完全确定 任何帮助表示赞赏
  • 在 macOS 上使用 Swift 3 从剪贴板读取

    我是 Swift 的初学者 我想弄清楚如何在 macOS Swift 3 上读取已复制到剪贴板的内容 我搜索了很多 但似乎找不到任何有效的东西 我从网上尝试过的一些事情 var pasteboardItems NSPasteboardIte
  • 在 Xcode 中查找未使用的文件

    我最近开始开发一个新应用程序 它基本上是我以前制作的应用程序的副本 但做了一些更改 为了制作这个新应用程序 我复制了旧应用程序并删除了一些不需要的内容 我想知道 有没有办法知道 Xcode 中正在使用哪些类文件 或者有什么关于如何查找未使用
  • Apple 由于崩溃而拒绝了我的应用程序,无法重现它

    我刚刚上传了一个应用程序到应用程序商店 它是为ios 7开发的 他们拒绝了该应用程序 因为我无法重现崩溃 他们向我发送了这份崩溃报告 Exception Type EXC BAD ACCESS SIGSEGV Exception Subty
  • 无法在 xcode 8 beta 6 上编译 AWS CustomIdentityProvider

    我在 iOS 应用程序中使用 Amazon Cognito 和 Facebook 登录 直到 beta 5 为止此代码从这个SO线程 https stackoverflow com questions 37597388 aws cognit
  • iOS 7 NS 单线程安全合并冲突

    重新排序两行后 在单线程应用程序上保存简单的数据时遇到问题 我已经成功地简化了编码以重现错误 并且希望其他人尝试这一点时得到第二个意见 这是一次健全性检查 因为我怀疑 iOS 7 引入的核心数据问题 而这在 iOS 6 中工作正常 首先 启
  • SDK 和 iOS 部署目标。

    我使用最新的 SDK 4 1 构建项目并设置 iOS 部署目标 3 0 如果我使用4 0 sdk的某些方法 我可以在真正的iPhone 3 0上运行我的项目吗 您只能在 OS 3 设备上运行您的项目 如果有条件地编码围绕您想要使用的 OS
  • “无法取消归档名为 UITableViewController 的元素”

    我一直在按照 构建你的第二个 iOS 应用程序 教程一步步进行 在教程承诺所有错误都会消失之后 我遇到了这个错误 但直到其他错误都出现后 该错误才出现 全部更正 我尝试编译它 错误 The document MainStoryboard i
  • UIScrollView 与 UITabBarController 切断

    我有一个 UIScrollView 我将其放置在视图中 界面生成器文档 xib m h 但是 UIScrollView 的下半部分被剪切 并且由于我有一个 UITabBarController 而没有显示其下半部分 我在 appdelega
  • iOS绘图3D图形库[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在搜索一个可以帮助我绘制 3D 图表的库 我想要类似的东西这一页 http www math uri edu bkaskosz fla
  • 具有隐式授权的 OAuth 应用程序中的客户端模拟

    来自 OAuth 草案 隐式section https datatracker ietf org doc html draft ietf oauth v2 31 section 1 3 2 在隐式授权流程期间发出访问令牌时 授权服务器不对客
  • TestFlight 安装的应用程序因 Swift 包管理器依赖项而崩溃

    我们已经迁移了一些 CocoaPod 依赖项 以便在 Xcode 11 中使用 Swift Package Manager 进行构建和链接 但是 每当我们将应用程序提交到 AppStore Connect 并使用 TestFlight 进行
  • iOS 目标 c 中的 AES/CBC/PKCS5Padding 结果与 Android 不同

    我在 Android 应用程序中使用 AES CBC PKCS5Padding 代码就像 private static String TRANSFORMATION AES CBC PKCS5Padding private static St
  • 从应用程序内发送电子邮件中的图像和文本

    如何从我的应用程序内通过电子邮件发送图像和文本 表格数据形式 请大家帮忙并提出建议 谢谢 void sendMailWithImage UIImage image if MFMailComposeViewController canSend

随机推荐

  • 为什么枚举类优于普通枚举?

    我听到一些人推荐使用 enumclasses在 C 中 因为它们类型安全 但这到底意味着什么呢 C 有两种enum enum classes Plain enums 以下是有关如何声明它们的几个示例 enum class Color red
  • as.POSIXct 无法识别日期格式 =“%Y-%W”

    library xts data lt data frame year week c 2016 46 2016 47 2016 48 satisfaction c 0 25 0 45 0 58 data xts data 1 order b
  • 点击页面跳转到顶部[重复]

    这个问题在这里已经有答案了 我在网站中间点击一下 代码如下 a href Edit Hemlock 的答案是一个很好的选择 但另一个答案是两者的组合 a href 这样做的好处是你明确地说 a 不应对 href 执行任何操作 并且 oncl
  • 带数据库查找的 URL 路由?

    我想构建一个 ASP NET MVC 站点 以便将特定 url 的控制器而不是 URL 存储在数据库中 原因是我正在构建一个 CMS 系统 用户应该能够更改模板 控制器 而不更改 URL 我还认为控制器的名称与最终用户无关 我想要干净的 U
  • Google App 脚本中的 API Post 请求不起作用

    我设法通过 Postman 执行 API POST 请求 但一旦针对 Google App Script 进行修改 它就不起作用了 我认为这可能与body格式 我无法复制new URLSearchParams GAS 中的对象 我相信我正在
  • 如何使用 FileSaver.js 在 Angularjs 中将以下内容保存为 PDF

    我无法使用 FileSaver js 将此内容保存为正确的 PDF 这是角度代码 http url root api root appointments generatePDF route Params id method GE T the
  • XML 架构模式错误

    我正在尝试编写 XML 模式 具体要求我验证一个字段 使其以字母开头 后跟字母数字字符 例如 Foo3x4 有效 3Foo 或 Foo3 无效 我是这样写的
  • 在多边形中生成规则间隔的点

    有没有办法使用 R 在多边形内生成规则间隔 例如 相距 500 米 的点 我一直在尝试使用 sp 包 但似乎无法定义一组彼此间隔一定距离的点 我的目标是生成点 然后将它们的纬度 经度坐标提取到新的数据框中 任何帮助将非常感激 谢谢 非常直接
  • 尝试将大量数据加载到我的应用程序时应用程序崩溃

    我正在尝试加载一个JSON40 000 多条记录存入我的Realm Database 这是我的功能 AFJSONRequestOperation operation AFJSONRequestOperation alloc init AFJ
  • 在 catch 块中等待

    我有以下代码 WebClient wc new WebClient string result try result await wc DownloadStringTaskAsync new Uri http badurl catch re
  • css半边框圆,上面有透明形状

    我需要一个从底部开始有半边框的圆圈 我想按百分比用颜色填充这个圆圈 我需要在上面放另一个圆圈 但另一个圆圈的中心有一个透明的形状 首先 我需要一个带有半边框的圆圈 然后在其上放另一个具有透明形状的圆圈 有没有更简单的方法 例如使用画布 Wh
  • 我可以在独立项目中使用 android.os.* 库吗?

    我正在尝试开发一个外部库 不确定这是否是正确的术语 来在 Android 项目中提供预打包的功能 在 Eclipse 中工作 我已将适当的 android jar 文件添加到构建路径中 并且在编辑和编译时一切都很顺利 但是 当我使用 And
  • 是否可以通过 nightwatch.js 设置元素的 Style 属性值?如果是的话怎么办?

    我正在使用 nightwatch js 我对这个自动化测试还很陌生 我想通过 nightwatch js 将值设置到元素的 style 属性中 所以我问 这可能吗 如果可能的话我们如何实现它 我可以访问样式属性值 并可以通过以下 night
  • 全局节点模块安装不正确。找不到命令

    我在安装全局节点模块时遇到问题 我在网上找到的所有内容都说解决方法只是添加 g 这不是问题 我认为这是链接问题或错误的目录问题 这是我所做的 npm install g express npm http GET https registry
  • 单行无限分离循环的语法

    我可以像这样无限循环地运行一些东西 while true do foo done 我可以像这样运行一些独立的东西 foo 但我不能像这样在无限循环中运行分离的东西 while true do foo done bash syntax err
  • 通过远程 java 独立应用程序使用 EJB 3.1 bean

    我一直在尝试使用 Java EE 6 创建一个基于应用程序服务器的应用程序 该应用程序从 GWT Web 应用程序接收作业对象 并且这些作业将从 Java 独立应用程序中提取 我一直认为 EJB 模型将为我提供一种简单的远程处理方法 因为我
  • 如何在 Spring-Batch 中使用 ItemReader 跳行?

    我有一个自定义项目阅读器 可以将文本文件中的行转换为我的实体 public class EntityItemReader extends AbstractItemStreamItemReader
  • RegEx 字符串,12 个符号(至少 1 个数字和至少 1 个字母)

    我在使用正则表达式时遇到问题 如何获取至少包含 1 个数字和 1 个字母的字符串的 12 个符号长部分 例子 这有 12 个符号长 F8ENL83I0E12也许还有更多文字 要在较长的文本中查找长度为 12 的字母数字单词 请使用 i Ca
  • 如何快速编写这段代码?

    我用 Objective c 编写了这段代码 NSRect textRect NSMakeRect 42 35 117 55 NSString textContent Hello World NSMutableParagraphStyle
  • AVAudioPlayer 在模拟器上工作但在真实设备上不工作

    当我播放录制的音频时 出现此错误 致命错误 在解包可选值时意外发现 nil 在这行代码上 SoundPlayer try AVAudioPlayer contentsOfURL getFileURL 但它在除真实设备之外的模拟器上运行良好