【发布时间】:2017-06-25 04:40:29
【问题描述】:
我只想获取音频文件中的标记列表。我认为这将是一个简单的普通任务,不会太难。但是,我几乎找不到任何示例代码或文档,所以我最终得到了这个:
private func getMarkers(_ url: CFURL) -> AudioFileMarkerList {
var file: AudioFileID?
var size: UInt32 = 0
var markers = AudioFileMarkerList()
AudioFileOpenURL(url, .readPermission, kAudioFileWAVEType, &file)
AudioFileGetPropertyInfo(file!, kAudioFilePropertyMarkerList, &size, nil)
AudioFileGetProperty(file!, kAudioFilePropertyMarkerList, &size, &markers)
return markers
}
很遗憾,这不起作用:error: memory read failed for 0x0。
我就是想不通问题所在。我检查了 url 和大小(它们都是有效的),但它总是无法检索标记。对此的任何帮助都会很棒!
编辑: 这种工作,但所有数据完全错误,我无法理解单个音频文件如何具有多个 AudioFileMarkerLists 标记:
private func getMarkers(_ url: CFURL) -> [AudioFileMarkerList] {
var file: AudioFileID?
var size: UInt32 = 0
AudioFileOpenURL(url, .readPermission, kAudioFileWAVEType, &file)
AudioFileGetPropertyInfo(file!, kAudioFilePropertyMarkerList, &size, nil)
let length = NumBytesToNumAudioFileMarkers(Int(size))
var markers = [AudioFileMarkerList](repeating: AudioFileMarkerList(), count: length)
AudioFileGetProperty(file!, kAudioFilePropertyMarkerList, &size, &markers)
return markers
}
编辑 2:根据我目前看到的大多数答案,这应该可行,但它返回一个空数组:
private func getMarkers(_ url: CFURL) -> [AudioFileMarkerList] {
var file: AudioFileID?
var size: UInt32 = 0
AudioFileOpenURL(url, .readPermission, kAudioFileWAVEType, &file)
AudioFileGetPropertyInfo(file!, kAudioFilePropertyMarkerList, &size, nil)
let length = NumBytesToNumAudioFileMarkers(Int(size))
var markers = [AudioFileMarkerList]()
markers.reserveCapacity(length)
AudioFileGetProperty(file!, kAudioFilePropertyMarkerList, &size, &markers)
return markers
}
编辑 3: 对于任何想要快速尝试并找到问题的人,我从 Ryan 的代码中删除了一堆错误检查和有用的东西:
private func getMarkers(_ url: CFURL) -> [AudioFileMarker]? {
var file: AudioFileID?
var size: UInt32 = 0
var markers: [AudioFileMarker] = []
AudioFileOpenURL(url, .readPermission, kAudioFileWAVEType, &file)
AudioFileGetPropertyInfo(file!, kAudioFilePropertyMarkerList, &size, nil)
let length = NumBytesToNumAudioFileMarkers(Int(size))
let data = UnsafeMutablePointer<AudioFileMarkerList>.allocate(capacity: length)
AudioFileGetProperty(file!, kAudioFilePropertyMarkerList, &size, data)
markers.append(data.pointee.mMarkers)
data.deallocate(capacity: length)
return markers
}
我只希望 Apple 首先测试 AudioFileMarkerList。
编辑 4: 感谢 Rhythmic Fistman 和 Ryan Francesconi 解决!最终结果:
private func getMarkers(_ url: CFURL) -> [AudioFileMarker]? {
var file: AudioFileID?
var size: UInt32 = 0
var markerList: [AudioFileMarker] = []
AudioFileOpenURL(url, .readPermission, kAudioFileWAVEType, &file)
AudioFileGetPropertyInfo(file!, kAudioFilePropertyMarkerList, &size, nil)
let length = NumBytesToNumAudioFileMarkers(Int(size))
let data = UnsafeMutablePointer<AudioFileMarkerList>.allocate(capacity: length)
AudioFileGetProperty(file!, kAudioFilePropertyMarkerList, &size, data)
let markers = UnsafeBufferPointer<AudioFileMarker>(start: &data.pointee.mMarkers, count: length)
for marker in markers {
markerList.append(marker)
}
data.deallocate(capacity: length)
return markerList
}
【问题讨论】:
-
为什么“重复”?
-
据我了解,您用新的 AudioFileMarkerList 实例的长度实例填充数组,然后返回它们。这是你想要的吗?
-
@3000 我真正想要的是获取音频文件中所有标记的列表,但对我来说,看起来我正在为每个标记创建一个标记列表(这甚至是什么AudioFileMarkerList 是?)。主要问题是所有数据都不正确。我尝试在带有标记的音频文件上使用此功能,并且大多数名称为空,并且所有时间都完全关闭。该文件没有损坏,但我使用 AudioFileMarkerList 的方式有问题。我完全不明白它是如何工作的
标签: ios swift audiotoolbox