簡體   English   中英

轉換Swift UnsafePointer <AudioStreamBasicDescription> 到字典?

[英]Converting a Swift UnsafePointer<AudioStreamBasicDescription> to a Dictionary?

我想知道如何從UnsafePointer<AudioStreamBasicDescription>創建[String:AnyObject]的字典

我想我不明白如何在Swift使用UnsafePointer<T> 這就是我的出發地AVAudioFile類具有fileFormat屬性,該屬性具有AVAudioFormat類型。 AVAudioFormat具有streamDescription屬性,該屬性返回UnsafePointer<AudioStreamBasicDescription>作為只讀屬性。

我想看看此結構中的值是什么,並將其轉換為Dictionary似乎是合理的目標。 實際上, AVAudioFormat類上似乎已經存在執行此操作的“設置”屬性,但我有興趣了解“正確的方法”以訪問自己存儲在UnsafePointer的值。

從文檔“ Discussion: Returns the AudioStreamBasicDescription (ASBD) struct, for use with lower-level audio APIs https://developer.apple.com/library/prerelease/ios/documentation/AVFoundation/Reference/AVAudioFormat_Class/index.html

檢查結構是否不為零后,有沒有辦法進行不安全的轉換? 我會在這里使用unsafeBitCast嗎? 我很猶豫地跳入這個話題,因為我已經知道這是“極其危險的” ...

我意識到我可以通過以下方式訪問基礎內存:

let audioFileURL:NSURL = NSBundle.mainBundle().URLForResource("FILENAME", with Extension: "mp3")
var file:AVAudioFile?
do {
  file = try AVAudioFile(forReading: audioFileURL)
  guard let file = file else {
    fatalError("file must not be nil")
  }
}catch {
  print(error)
}

let format = file.processingFormat
let asbd:AudioStreamBasicDescription = format.streamDescription.memory

那很危險嗎,在創建asbd常量后我是否需要出於某種原因進行釋放?

我嘗試按照http://sitepoint.com/using-legacy-c-apis-swift上的帖子進行操作,但我只是聽不懂...在此處尋找最佳做法的任何指導。

更新:

做更多的研究,似乎有可能使用基於本文的反射來創建字典: http : //freecake.angelodipaolo.org/simple-reflection-in-swift/

這是我到目前為止的內容:

let asbdMirror = reflect(asbd)
var asbdDict = [String: Any]()
for i in 0..<asbdMirror.count {
  let (propertyName, childMirror) = asbdMirror[i]
  asbdDict[propertyName] = childMirror.value
} 

任何理由這是一個壞主意嗎?

您可以正確執行所有操作,可以使用asbd.mSampleRate等訪問描述中的所有值。 將其轉換為字典是沒有意義的,因為那不是它,沒有值的鍵。

除非您自己分配一個指針(使用mallocalloc ),否則在使用此類指針時也不必釋放任何東西。

暫無
暫無

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

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