获取比特率 os 音频项目 swift

Get bitrate os audio item swift

我需要获取音频项(远程)比特率 - 320、128 等。找到答案 - ,但它无法正常工作。我可以得到项目的大小,但我的比特率看起来很奇怪——比如 154、540.34 等。 请帮忙!

AVPlayer 需要 AVPlayerItem,在您的情况下是 MP3 文件。 AVFoundation 有一个 class AVPlayerItemAccessLogEvent 可以为您提供 A​​verageAudioBitrate。因此,您必须将 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))
    }
}
  1. 对于 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))
                }
            }
        }
    }