ios - 将 ExtAudioFile 放入浮点缓冲区会产生零

标签 ios swift file core-audio

我在 Swift 3 中有这段代码,大多数时候我的输出是 0.0 零,我很少看到 e^-50 的非常小的数字

fileURL是一个recording.caf,里面有声音。

有人知道吗?

func readBuff(_ fileURL:CFURL) {
   var fileRef:ExtAudioFileRef? = nil


let openStatus = ExtAudioFileOpenURL(fileURL , &fileRef)
guard openStatus == noErr else {
    print("Failed to open audio file '\(fileURL)' with error \(openStatus)")
    return
}

var audioFormat2 = AudioStreamBasicDescription()
audioFormat2.mSampleRate = 44100;   // GIVE YOUR SAMPLING RATE
audioFormat2.mFormatID = kAudioFormatLinearPCM;
audioFormat2.mFormatFlags = kLinearPCMFormatFlagIsFloat;
audioFormat2.mBitsPerChannel = UInt32(MemoryLayout<Float32>.size) * 8
audioFormat2.mChannelsPerFrame = 1; // Mono
audioFormat2.mBytesPerFrame = audioFormat2.mChannelsPerFrame * UInt32(MemoryLayout<Float32>.size);  // == sizeof(Float32)
audioFormat2.mFramesPerPacket = 1;
audioFormat2.mBytesPerPacket = audioFormat2.mFramesPerPacket * audioFormat2.mBytesPerFrame; // = sizeof(Float32)

//apply audioFormat2 to the extended audio file
ExtAudioFileSetProperty(fileRef!, kExtAudioFileProperty_ClientDataFormat,UInt32(MemoryLayout<AudioStreamBasicDescription>.size),&audioFormat2)

let numSamples = 1024 //How many samples to read in at a startTime
let sizePerPacket:UInt32 = audioFormat2.mBytesPerPacket // sizeof(Float32) = 32 byts
let packetsPerBuffer:UInt32 = UInt32(numSamples)
let outputBufferSize:UInt32 = packetsPerBuffer * sizePerPacket //4096

//so the 1 value of outputbuffer is a the memory location where we have reserved space 
let outputbuffer = UnsafeMutablePointer<UInt8>.allocate(capacity: MemoryLayout<UInt8>.size * Int(outputBufferSize))


var convertedData = AudioBufferList()
convertedData.mNumberBuffers = 1 //set this for Mono
convertedData.mBuffers.mNumberChannels = audioFormat2.mChannelsPerFrame // also = 1
convertedData.mBuffers.mDataByteSize = outputBufferSize
convertedData.mBuffers.mData = UnsafeMutableRawPointer(outputbuffer)

var frameCount:UInt32 = UInt32(numSamples)
while (frameCount > 0) {
Utility.check(ExtAudioFileRead(fileRef!,
                               &frameCount,
                               &convertedData),
              operation: "Couldn't read from input file")

if frameCount == 0 {
    Swift.print("done reading from file")
    return
}

var arrayFloats:[Float] = []
let ptr = convertedData.mBuffers.mData?.assumingMemoryBound(to: Float.self)

var j = 0
var floatDataArray:[Double] = [882000]// SPECIFY YOUR DATA LIMIT MINE WAS 882000 , SHOULD BE EQUAL TO OR MORE THAN DATA LIMIT

if(frameCount > 0){
   var audioBuffer:AudioBuffer = convertedData.mBuffers

    let floatArr = UnsafeBufferPointer(start: audioBuffer.mData?.assumingMemoryBound(to: Float.self), count: 882000)

    for i in 0...1024{
        //floatDataArray[j] = Double(floatArr[i]) //put your data into float array
       // print("\(floatDataArray[j])")
        floatDataArray.append(Double(floatArr[i]))


        print(Float((ptr?[i])!))


        j += 1
    }
   // print(floatDataArray)
}
}

我正在阅读来自

guard let fileURL = CFURLCreateWithFileSystemPath(kCFAllocatorDefault, "./output.caf" as CFString!, .cfurlposixPathStyle, false) else {

    // unable to create file
    exit(-1)
}

录制后的步骤:

Swift.print("Recording, press <return> to stop:\n")

// wait for a key to be pressed
getchar()

// end recording
Swift.print("* recording done *\n")
recorder.running = false

// stop the Queue
Utility.check(AudioQueueStop(queue!, true),
              operation: "AudioQueueStop failed")

// a codec may update its magic cookie at the end of an encoding session
// so reapply it to the file now
Utility.applyEncoderCookie(fromQueue: queue!, toFile: recorder.recordFile!)

// cleanup
    AudioQueueDispose(queue!, true)
    AudioFileClose(recorder.recordFile!)
    readBuff(fileURL)

最佳答案

您正在设置您的 ExtAudioFile 及其客户端格式,但您实际上并没有从中读取(使用 ExtAudioFileRead),所以您的“输出”实际上是未初始化,在您的情况下,非常小。

关于ios - 将 ExtAudioFile 放入浮点缓冲区会产生零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39760765/

相关文章:

ios - 标准 UIBarButtonItem 溢出菜单图标

ios - 滚动我的应用程序时如何在 IOS 中禁用触摸事件 (Cordova)

ios - 当单元格包含特定项目时,如何找到自定义单元格的索引路径?

java - 找不到指定的java文件

java - 如何使用 java FIle i/o 替换、删除或更新文件中的行

ios - Swift注解点击按钮

ios - 实现文件看不到协议(protocol)委托(delegate)

swift - 如何在swift中同步循环

iOS 如何合并两个 NSArrays 并快速删除基于唯一 ID 的重复项?

Python - 反转整个文件