【问题标题】:Get bitrate os audio item swift快速获取比特率操作系统音频项目
【发布时间】:2017-04-29 08:12:11
【问题描述】:

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

【问题讨论】:

  • 它的外观有什么奇怪的地方?
  • 比特率都是128或者320,所以不可能是540.34。这很奇怪
  • 您有可以分享的示例文件吗?

标签: ios swift avfoundation media-player


【解决方案1】:

我找到了解决方案: 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))
                }
            }
        }
    }
    

【讨论】:

    【解决方案2】:

    AVPlayer 需要 AVPlayerItem,在您的情况下是 MP3 文件。 AVFoundation 有一个类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,我认为这可能会解决您的问题。

    【讨论】:

    • 我列表中每个项目的 AccessLog 都是 nil。
    • 播放完成后传递您的 AVPlayerItem。
    • 不幸的是,这只有在播放事件完成后传递 AVPlayerItem 时才有效。一旦我解决了问题,我会更新我的答案。
    猜你喜欢
    • 1970-01-01
    • 2014-10-09
    • 2012-07-20
    • 2021-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多