将 pcm 加载到 AVAudioPCMBuffer
Posted
技术标签:
【中文标题】将 pcm 加载到 AVAudioPCMBuffer【英文标题】:load a pcm into a AVAudioPCMBuffer 【发布时间】:2016-12-13 23:36:02 【问题描述】:我有这个代码:
func loadSoundfont(_ pitch : String)
let path: String = Bundle.main.path(forResource: "\(self.id)/\(pitch)", ofType: "f32")!
let url = URL(fileURLWithPath: path)
do
let file = try AVAudioFile(forReading: url, commonFormat: AVAudioCommonFormat.pcmFormatFloat32, interleaved: true)
let format = file.processingFormat
let capacity = AVAudioFrameCount(file.length)
self.buffer = AVAudioPCMBuffer(pcmFormat: format, frameCapacity: capacity)
try file.read(into: self.buffer!)
catch let error as NSError
print("ERROR HERE", error.localizedDescription)
我收到以下错误:1954115647
,即:kAudioFileUnsupportedFileTypeError
我的 A4.f32 文件包含一个 PCM 浮点数 32。我在这里缺少什么吗?我的文件中没有标题,是否会导致此问题?
【问题讨论】:
您的音频文件是原始 float32 数据?我认为AVFoundation
不会为您加载。要么自己加载它,要么在上面放一个标题。
@RhythmicFistman 也许你可以在这里帮助我:***.com/questions/55306996/…
【参考方案1】:
多亏了cmets中的节奏拳手,我自己去装了,就这样:
func loadSoundfont(_ pitch : String)
let path: String = Bundle.main.path(forResource: "\(self.id)/\(pitch)", ofType: "f32")!
let url = URL(fileURLWithPath: path)
do
let data = try Data(contentsOf: url)
let format = AVAudioFormat(commonFormat: .pcmFormatFloat32, sampleRate: 44100, channels: 2, interleaved: true)
self.buffer = AVAudioPCMBuffer(pcmFormat: format, frameCapacity: AVAudioFrameCount(data.count))
self.buffer!.floatChannelData!.pointee.withMemoryRebound(to: UInt8.self, capacity: data.count)
let stream = OutputStream(toBuffer: $0, capacity: data.count)
stream.open()
_ = data.withUnsafeBytes
stream.write($0, maxLength: data.count)
stream.close()
catch let error as NSError
print("ERROR HERE", error.localizedDescription)
【讨论】:
以上是关于将 pcm 加载到 AVAudioPCMBuffer的主要内容,如果未能解决你的问题,请参考以下文章
如何将wav音频文件格式为pcm转化为ima adpcm格式
使用 add + shift 将 pcm16 转换为 pcm14