ios - Fresh SpeakHere 示例应用程序在模拟器/Xcode 中录制音频时出错

标签 ios xcode audio-recording

我无法使用 SpeakHere 录制音频来自苹果的示例应用程序。当我从 Xcode 中在模拟器中运行应用程序时,它正常启动,但是当我按下记录按钮时,出现错误“Thread 1: EXC_BREAKPOINT (code=EXC_I386_BPT, subcode=0x0)”:screenshot after problem occurred

在上述错误发生之前,关于应用程序启动时缺少 Root View Controller 的日志消息已经存在,它可能与我的问题无关。

我已经从链接网站下载了 SpeakHere 示例项目(请参阅此问题的顶部),在 Xcode 中打开新下载并直接启动应用程序。我没有修改任何设置,也没有修改任何代码行。我也在 google 和 stackoverflow 上搜索了这个问题,但没有找到解决方案,虽然这个问题一定很普遍。

我使用 Xcode 版本 4.5.2 (4G2008a) 和 2009 年底的 MacBook Pro 以及 Mac OS X 10.8。

我也有一个 friend 在他的电脑上试过这个,他也遇到了同样的问题。他有相同的操作系统,他的 XCode 版本也是 4.5.2。

我现在会尝试较旧的 Xcode 版本,但现在我不想下载几 GB 的数据以在我的连接上进行试错。

感谢任何帮助,包括诸如“适用于我的 Xcode 版本……”之类的报告。谢谢!

最佳答案

问题的发生是因为在方法AQRecorder::StartRecord(CFStringRef inRecordFile)中,函数CFURLCreateWithString()失败并返回一个指向nil的指针。这未被检测到,稍后代码在该 nil 指针上调用 CFRelease(),这会导致 EXC_BREAKPOINT。

CFURLCreateWithString() 方法的目的基本上是将 url 字符串作为输入并返回指向 CFURL 对象的指针作为输出。这里的问题是输入不是 url 字符串。相反,它只是本地文件系统上的一个路径,没有 file:/ 之类的前缀。因此,此方法失败。

解决方案是删除对方法 CFURLCreateWithString() 的无效调用,而是调用一个相关的方法,即 CFURLCreateWithFileSystemPath(),它准备接受本地文件系统路径并将其转换为 CFURL:

在方法AQRecorder::StartRecord(CFStringRef inRecordFile)中,替换或注释掉该行

url = CFURLCreateWithString(kCFAllocatorDefault, (CFStringRef)recordFile, NULL);

并插入

url = CFURLCreateWithFileSystemPath(kCFAllocatorDefault, (CFStringRef)recordFile, kCFURLPOSIXPathStyle, false);

在原地。

关于ios - Fresh SpeakHere 示例应用程序在模拟器/Xcode 中录制音频时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13627193/

相关文章:

ios - 嵌套 dispatch_async(dispatch_get_main_queue()^{}) 的目的是什么?

ios - 将应用发送到后台时执行NSLog

objective-c - 从公共(public) header 引用私有(private) header

c# - 我正在使用nAudio库从MIC录音,如何增加MIC的增益?

ios - 如何跟踪歌曲在 AVPlayer 中播放完毕的时间?

ios - Sprite Kit 和 Swift,随着时间的推移增加节点的速度?

java - 在Android应用程序中删除SD卡中的文件以进行语音转换器

java - Android AudioRecord Artifact

xcode - 无法在macOS 10.14 Mojave下加载Info.plist错误Xcode 10

xcode - 如何比较2个Xcode目标