将 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的主要内容,如果未能解决你的问题,请参考以下文章

将原始 PCM 流通过管道传输到 libsndfile

将 pcm/wav 音频从 22khz 下采样到 8khz

如何将wav音频文件格式为pcm转化为ima adpcm格式

使用 add + shift 将 pcm16 转换为 pcm14

如何将 FFMPEG AV_CODEC_ID_PCM_S16BE 音频数据馈送到 AudioQueue

PCM原始数据到用户空间