获取比特率 os 音频项目 swift
Get bitrate os audio item swift
我需要获取音频项(远程)比特率 - 320、128 等。找到答案 - ,但它无法正常工作。我可以得到项目的大小,但我的比特率看起来很奇怪——比如 154、540.34 等。
请帮忙!
AVPlayer 需要 AVPlayerItem,在您的情况下是 MP3 文件。 AVFoundation 有一个 class AVPlayerItemAccessLogEvent 可以为您提供 AverageAudioBitrate。因此,您必须将 AVPlayerItem 传递给以下函数:
func getBitRate(playerItem : AVPlayerItem) -> Double{
//var event : AVPlayerItemAccessLogEvent;
var avgBitrate : Double = 0.0;
for event in (playerItem.accessLog()?.events)!{
if event.averageAudioBitrate>=0.0{
avgBitrate = event.averageAudioBitrate;
}
}
return avgBitrate;
}
由于苹果公开了API,我想这可能会解决你的问题。
我找到了解决方案:
1. 对于本地文件:
func getSongBitrate(audioURL: URL, duration: Int, completition: @escaping (Int) -> ()) {
do {
let attr = try FileManager.default.attributesOfItem(atPath: audioURL.path)
if var fileSize = attr[FileAttributeKey.size] as? UInt64 {
let dict = attr as NSDictionary
fileSize = dict.fileSize()
let kbit = fileSize/128//calculate bytes to kbit
let kbps = ceil(round(Double(kbit)/Double(duration))/16)*16
completition(Int(kbps))
}
} catch {
print("Error: \(error)")
completition(Int(0))
}
}
对于 URL 远程文件:
func getBitrate(audioURL: URL, duration: Int, completition: @escaping (Int) -> ()) {
DispatchQueue.global().async {
let request1: NSMutableURLRequest = NSMutableURLRequest(url: audioURL)
request1.httpMethod = "HEAD"
var response : URLResponse?
print("GO TO RESPONSE")
do {
try NSURLConnection.sendSynchronousRequest(request1 as URLRequest, returning: &response)
if let httpResponse = response as? HTTPURLResponse {
let size = httpResponse.expectedContentLength
let kbit = size/128;//calculate bytes to kbit
let kbps = ceil(round(Double(kbit)/Double(duration))/16)*16
// print("kbps === \(kbps)")
if self.songQuality == 0 {
self.songQuality = Int(kbps)
}
////
DispatchQueue.main.async {
completition(Int(kbps))
}
////
}
} catch (let e) {
print(e)
DispatchQueue.main.async {
completition(Int(0))
}
}
}
}
我需要获取音频项(远程)比特率 - 320、128 等。找到答案 -
AVPlayer 需要 AVPlayerItem,在您的情况下是 MP3 文件。 AVFoundation 有一个 class AVPlayerItemAccessLogEvent 可以为您提供 AverageAudioBitrate。因此,您必须将 AVPlayerItem 传递给以下函数:
func getBitRate(playerItem : AVPlayerItem) -> Double{
//var event : AVPlayerItemAccessLogEvent;
var avgBitrate : Double = 0.0;
for event in (playerItem.accessLog()?.events)!{
if event.averageAudioBitrate>=0.0{
avgBitrate = event.averageAudioBitrate;
}
}
return avgBitrate;
}
由于苹果公开了API,我想这可能会解决你的问题。
我找到了解决方案: 1. 对于本地文件:
func getSongBitrate(audioURL: URL, duration: Int, completition: @escaping (Int) -> ()) {
do {
let attr = try FileManager.default.attributesOfItem(atPath: audioURL.path)
if var fileSize = attr[FileAttributeKey.size] as? UInt64 {
let dict = attr as NSDictionary
fileSize = dict.fileSize()
let kbit = fileSize/128//calculate bytes to kbit
let kbps = ceil(round(Double(kbit)/Double(duration))/16)*16
completition(Int(kbps))
}
} catch {
print("Error: \(error)")
completition(Int(0))
}
}
对于 URL 远程文件:
func getBitrate(audioURL: URL, duration: Int, completition: @escaping (Int) -> ()) { DispatchQueue.global().async { let request1: NSMutableURLRequest = NSMutableURLRequest(url: audioURL) request1.httpMethod = "HEAD" var response : URLResponse? print("GO TO RESPONSE") do { try NSURLConnection.sendSynchronousRequest(request1 as URLRequest, returning: &response) if let httpResponse = response as? HTTPURLResponse { let size = httpResponse.expectedContentLength let kbit = size/128;//calculate bytes to kbit let kbps = ceil(round(Double(kbit)/Double(duration))/16)*16 // print("kbps === \(kbps)") if self.songQuality == 0 { self.songQuality = Int(kbps) } //// DispatchQueue.main.async { completition(Int(kbps)) } //// } } catch (let e) { print(e) DispatchQueue.main.async { completition(Int(0)) } } } }