【问题标题】:ExtAudioFile into a float buffer produces zeros将 ExtAudioFile 放入浮点缓冲区会产生零
【发布时间】:2016-09-29 03:07:15
【问题描述】:

我在 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)

【问题讨论】:

    标签: ios swift file core-audio


    【解决方案1】:

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

    【讨论】:

    • 谢谢!使用 let status = ExtAudioFileRead(fileRef!, &frameCount, &convertedData) 我得到“无法从音频文件中读取数据,错误 -66567”
    • 您能否将该代码添加到您的问题中并说出您正在读取哪种音频文件?
    • 好的,我能够读取诸如“-0.0029776811134070158、-0.0027382420375943184、-0.0023274924606084824、-0.0018719543004408479”之类的值,为什么有些是负数和正数?
    • 它们看起来像是合理的值
    猜你喜欢
    • 1970-01-01
    • 2013-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-11
    • 2014-12-28
    • 2016-04-17
    相关资源
    最近更新 更多