- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
目前,我在音频线程上遇到了一个EXC_BAD_ACCESS
错误,我正在尝试推断出了什么问题。
当将 .wav
文件数据从 Data
转换为 AVAudioPCMBuffer
时,是否需要先剥离 RIFF header ?
import AVFoundation
public class Player : NSObject {
let engine = AVAudioEngine()
public override init() {
super.init()
do {
let _ = engine.mainMixerNode
try engine.start()
} catch {
print("Player error: \(error)")
}
}
@objc public func play(_ data: Data) {
let format = AVAudioFormat(commonFormat: .pcmFormatInt16, sampleRate: 48000, channels: 2, interleaved: true)!
let buffer = data.toPCMBuffer(format: format)!
let player = AVAudioPlayerNode()
engine.attach(player)
engine.connect(player, to: engine.mainMixerNode, format: nil)
player.scheduleBuffer(buffer, at: nil, completionCallbackType: .dataPlayedBack) {
callbackType in
// Nothing in here.
}
player.play()
}
}
这是 toPCMBuffer
扩展:
// Taken from: https://stackoverflow.com/a/52731480/2228559
extension Data {
func toPCMBuffer(format: AVAudioFormat) -> AVAudioPCMBuffer? {
let streamDesc = format.streamDescription.pointee
let frameCapacity = UInt32(count) / streamDesc.mBytesPerFrame
guard let buffer = AVAudioPCMBuffer(pcmFormat: format, frameCapacity: frameCapacity) else { return nil }
buffer.frameLength = buffer.frameCapacity
let audioBuffer = buffer.audioBufferList.pointee.mBuffers
withUnsafeBytes { addr in
audioBuffer.mData?.copyMemory(from: addr, byteCount: Int(audioBuffer.mDataByteSize))
}
return buffer
}
}
注意:我不能使用 AVAudioFile
,因为 .wav
文件数据是通过网络加载的。
最佳答案
IDK,但如果我播放交错的 AVAudioPCMBuffer
,我的 mac 会崩溃,如果音频不是 float 据,则会出现乱码,因此您可以转换为非交错的 float 据:
@objc public func play(_ data: Data) {
let sampleRate: Double = 48000
let interleavedFormat = AVAudioFormat(commonFormat: .pcmFormatInt16, sampleRate: sampleRate, channels: 2, interleaved: true)!
let interleavedBuffer = data.toPCMBuffer(format: interleavedFormat)!
let nonInterleavedFormat = AVAudioFormat(commonFormat: .pcmFormatFloat32, sampleRate: sampleRate, channels: 2, interleaved: false)!
let nonInterleavedBuffer = AVAudioPCMBuffer(pcmFormat: nonInterleavedFormat, frameCapacity: interleavedBuffer.frameCapacity)!
nonInterleavedBuffer.frameLength = interleavedBuffer.frameLength
let converter = AVAudioConverter(from: interleavedFormat, to: nonInterleavedFormat)!
try! converter.convert(to: nonInterleavedBuffer, from: interleavedBuffer)
let player = AVAudioPlayerNode()
engine.attach(player)
engine.connect(player, to: engine.mainMixerNode, format: nil)
player.scheduleBuffer(nonInterleavedBuffer, at: nil, completionCallbackType: .dataPlayedBack) {
callbackType in
// Nothing in here.
}
player.play()
}
extension Data {
func toPCMBuffer(format: AVAudioFormat) -> AVAudioPCMBuffer? {
assert(format.isInterleaved)
let streamDesc = format.streamDescription.pointee
let frameCapacity = UInt32(count) / streamDesc.mBytesPerFrame
guard let buffer = AVAudioPCMBuffer(pcmFormat: format, frameCapacity: frameCapacity) else { return nil }
buffer.frameLength = buffer.frameCapacity
let b = UnsafeMutableBufferPointer(start: buffer.int16ChannelData![0], count: buffer.stride * Int(frameCapacity))
let bytesCopied = self.copyBytes(to: b)
assert(bytesCopied == count)
return buffer
}
}
关于objective-c - 使用 AVAudioEngine 播放 WAV 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55306996/
我正在尝试动态修改附加到 AVAudioEngine 的节点图,但该图在每次重新连接后输出静音。 在下面的示例中,我想将 player 动态连接到 engine.mainMixerNode,但是每当我
我正在尝试使用 AVAudioEngine 播放 AVAudioFile。代码大部分取自苹果开发者在线视频,但没有回放。花了一些时间浏览论坛,但似乎没有任何线索。 我有两种方法。第一个调用标准的打开文
我的应用程序动态添加和删除为 mainMixerNode 提供数据的节点。发生这种情况时,我会听到咔哒声或爆裂声,因为音量并未减弱。 建立连接时如何实现平滑过渡?我是否需要在 AudioUnit 中自
我正在尝试查找有关如何使用 AVAudioEngine 的详细文档。有谁知道我在哪里可以找到它? 我找到了这个,但与文档丰富的 UI 内容相比,它似乎非常简陋。 https://developer.a
这里是第一个 stackoverflow 问题,所以请多多包涵!在为 MacOS 设计更大的音频程序的过程中,我试图创建一个测试应用程序,它可以简单地从任何系统音频输入中获取音频并将其发送到任何输出。
我正在用 Swift 编写一个 iOS 应用程序,该应用程序正在录制用户的声音,然后可以使用一些语音效果进行播放,但问题是使用内置 iPhone 麦克风时播放非常安静。带耳机就没问题。 录制代码: l
我正在使用 AVAudioEngine 进行测量。我从界面中播放刺激声音,并使用 micTap 记录返回的信号。 我现在正在研究支持多种不同格式的不同音频接口(interface)。我通过混合器转换
我成功地将 AVAudioPlayer 节点附加到我的 AVAudioEngine。但是,我需要稍后检查这些节点是否已附加到它(因此我不会重新添加它们)。 引擎上是否有任何特定属性可供我检查以查看其是
简单的问题。如何使用 AVAudioEngine 播放多声道音频文件(> 2 声道),以便我可以听到默认 2 声道输出(耳机/扬声器)上的所有声道。以下代码(去除了用于呈现的错误检查)播放文件的前两个
我正在创建一个基本的音板应用程序。我有两个开关。一种在激活时将使音频变慢且音调更低,另一种则使其变得更快和更高。我有一个 if else if if 语句,它查看这些开关,然后相应地播放音频,但是当我
我正在开发一键通功能,发送者可以将字节数组形式的音频发送到服务器,接收者可以通过套接字连接实时收听它。 当我尝试使用 AVAudioEngine 在接收端播放视频时,它不起作用。 let bu
我正在尝试制作音频处理应用程序。有没有办法使用 AVAudioEngine 将音频效果应用于音频文件? 最佳答案 是的,你当然可以,你可以使用: AVAudioPlayerNode AVAudioUn
我正在尝试设置一个 AudioQueue 以从 iPhone 上的麦克风传输音频。 我创建我的音频引擎: var audioEngine = AVAudioEngine() 还有我的音频队列:
我正在使用一个 AVAudioEngine 对象,它附有许多 AVAudioPlayerNodes。音频一切正常,除了它会停止 iPhone 在后台播放的任何音频(即来自 iTunes 或其他音乐应用
我正在设置一个 AVAudioEngine 实现以从麦克风获取音频并将其流式传输到 websocket 连接。首先,我已经点击了麦克风输入和一个中间混音器,该混音器将麦克风的音频从 44khz 下采样
在我下面的代码中,我创建了两个声音,sound1 和 sound2。每个声音都包含多个样本,允许同时播放相同的声音。问题是,如果我创建看似超过 6 到 8 个 AVAudioPlayerNode,每个
我已经设置了我的音频引擎并连接了几个节点,以便制作如下所示的音频图: // //AVAudioPlayerNode --> AVAudioMixerNode --> AVAudioUnitVarisp
我正在使用 AVAudioPlayerNode 播放歌曲,我正在尝试使用 UISlider 来控制它的时间,但我无法弄清楚如何使用 AVAUdioEngine. 最佳答案 经过反复试验,我想我终于弄明
我在对从麦克风获取的音频进行下采样时遇到问题。我正在使用 AVAudioEngine 通过以下代码从麦克风中采集样本: assert(self.engine.inputNode != nil) let
我正在尝试运行来自 their website here 的 Apple SpeakToMe:将语音识别与 AVAudioEngine 结合使用示例.我的问题是,当您停止 AVAudioEngine
我是一名优秀的程序员,十分优秀!