|
@@ -293,11 +293,39 @@ extension TSBusinessAudioPlayer{
|
|
|
|
|
|
// 4. 获取音频时长
|
|
// 4. 获取音频时长
|
|
let duration: Double? = {
|
|
let duration: Double? = {
|
|
- let asset = AVURLAsset(url: url)
|
|
|
|
- let seconds = Double(CMTimeGetSeconds(asset.duration))
|
|
|
|
- return seconds.isNaN ? nil : seconds
|
|
|
|
|
|
+
|
|
|
|
+ return getAudioDurationWithAudioFile(url: url)
|
|
|
|
+// let asset = AVURLAsset(url: url)
|
|
|
|
+// let seconds = Double(CMTimeGetSeconds(asset.duration))
|
|
|
|
+// return seconds.isNaN ? nil : seconds
|
|
}()
|
|
}()
|
|
|
|
|
|
return AudioFileInfo(sizeInBytes: fileSize, durationInSeconds: duration)
|
|
return AudioFileInfo(sizeInBytes: fileSize, durationInSeconds: duration)
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ /// 同步获取音频时长(可能阻塞线程!)
|
|
|
|
+ /// 使用 AudioFile 同步获取音频时长
|
|
|
|
+ static func getAudioDurationWithAudioFile(url: URL) -> TimeInterval? {
|
|
|
|
+ var audioFile: AudioFileID?
|
|
|
|
+ let status = AudioFileOpenURL(url as CFURL, .readPermission, 0, &audioFile)
|
|
|
|
+
|
|
|
|
+ guard status == noErr, let file = audioFile else {
|
|
|
|
+ print("⚠️ 打开音频文件失败: \(status)")
|
|
|
|
+ return nil
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 获取音频时长(单位:秒)
|
|
|
|
+ var duration: Float64 = 0
|
|
|
|
+ var propertySize = UInt32(MemoryLayout.size(ofValue: duration))
|
|
|
|
+ let durationStatus = AudioFileGetProperty(
|
|
|
|
+ file,
|
|
|
|
+ kAudioFilePropertyEstimatedDuration,
|
|
|
|
+ &propertySize,
|
|
|
|
+ &duration
|
|
|
|
+ )
|
|
|
|
+
|
|
|
|
+ AudioFileClose(file)
|
|
|
|
+
|
|
|
|
+ return durationStatus == noErr ? duration : nil
|
|
|
|
+ }
|
|
}
|
|
}
|