簡體   English   中英

獲取音頻隊列緩沖區的<AudioTimeStamp>

[英]Obtain a <AudioTimeStamp> for Audio Queue Buffer

我正在嘗試在Swift中創建一個連續的FIFO錄音機。 我在嘗試創建audioQueueCallback時遇到並發出問題。

來自文檔AudioTimeStamp有這個init方法:

AudioTimeStamp(mSampleTime: Float64, mHostTime: UInt64, mRateScalar: Float64, mWordClockTime: UInt64, mSMPTETime: SMPTETime, mFlags: AudioTimeStampFlags, mReserved: UInt32)

我不知道如何使用它。

在我看來,設備應該有一個可靠的內部時鍾,以便能夠管理audioQueues但我無法找到它的任何文檔。

這是我嘗試創建BufferQueue:

ypealias WYNDRInputQueueCallback = ((Data) -> Void)

class WYNDRInputQueue {

  class WYNDRInputQueueUserData {
    let callback: WYNDRInputQueueCallback
    let bufferStub: NSData

    init(callback: @escaping WYNDRInputQueueCallback, bufferStub: NSData){
      self.callback = callback
      self.bufferStub = bufferStub
    }
  }


  private var audioQueueRef: AudioQueueRef?
  private let userData: WYNDRInputQueueUserData



  public init(asbd: inout AudioStreamBasicDescription, callback: @escaping WYNDRInputQueueCallback, buffersCount: UInt32 = 3, bufferSize: UInt32 = 9600) throws {

    self.userData = WYNDRInputQueueUserData(callback: callback, bufferStub: NSMutableData(length: Int(bufferSize))!)

    let userDataUnsafe = UnsafeMutableRawPointer(Unmanaged.passRetained(self.userData).toOpaque())

    let input = AudioQueueNewInput(&asbd,
                                   audioQueueInputCallback,
                                   userDataUnsafe,
                                   .none,
                                   .none,
                                   0,
                                   &audioQueueRef)

    if input != noErr {
      throw InputQueueError.genericError(input)
    }

    assert(audioQueueRef != nil )

    for _ in 0..<buffersCount {
      var bufferRef: AudioQueueBufferRef?

      let bufferInput = AudioQueueAllocateBuffer(audioQueueRef!, bufferSize, &bufferRef)

      if bufferInput != noErr {
        throw InputQueueError.genericError(bufferInput)
      }

      assert(bufferRef != nil)

這是我使用audioTimeStamp的地方:

      audioQueueInputCallback(userDataUnsafe, audioQueueRef!, bufferRef!, <#T##UnsafePointer<AudioTimeStamp>#>, 0, nil)
    }
  }

  private let audioQueueInputCallback: AudioQueueInputCallback = { (inUserData, inAQ, inBuffer, inStartTime, inNumberPacketDescriptions, inPacketDescs) in

    let userData = Unmanaged<WYNDRInputQueueUserData>.fromOpaque(inUserData!).takeUnretainedValue()

    let dataSize = Int(inBuffer.pointee.mAudioDataByteSize)

    let inputData = Data(bytes: inBuffer.pointee.mAudioData, count: dataSize)

    userData.callback(inputData)

    AudioQueueEnqueueBuffer(inAQ, inBuffer, 0, nil)
  }

這里的任何建議將不勝感激!

我不確定時間戳將如何使用或者誰將使用它,但如果有疑問,為什么不使用您記錄的樣本數作為時間戳?

var timestamp = AudioTimeStamp()

timestamp.mSampleTime = numberOfSamplesRecorded
timestamp.mFlags = .sampleHostTimeValid

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM