Swift:AVPlayer - 如何从URL获取mp3文件的长度?

问题描述 投票:15回答:4

我正在使用swift构建我的第一个IOS应用程序,我遇到了问题:如何在流式传输时获取音乐文件的长度(持续时间)?

我做了很多研究,并编写了一些代码来解决这个问题,但似乎我的代码还不够好。

 func prepareAudio() {
    audioLength = CMTimeGetSeconds(self.player.currentItem.asset.duration) 
    playerProgressSlider.maximumValue = CFloat(CMTimeGetSeconds(player.currentItem.duration))
    playerProgressSlider.minimumValue = 0.0
    playerProgressSlider.value = 0.0
    showTotalSurahLength()
} // i prepare for get the duration and apply to UISlider here

func showTotalSurahLength(){
    calculateSurahLength()
    totalLengthOfAudioLabel.text = totalLengthOfAudio
} // get the right total length of audio file


func calculateSurahLength(){
    var hour_ = abs(Int(audioLength/3600))
    var minute_ = abs(Int((audioLength/60) % 60))
    var second_ = abs(Int(audioLength % 60))

    var hour = hour_ > 9 ? "\(hour_)" : "0\(hour_)"
    var minute = minute_ > 9 ? "\(minute_)" : "0\(minute_)"
    var second = second_ > 9 ? "\(second_)" : "0\(second_)"
    totalLengthOfAudio = "\(hour):\(minute):\(second)"
} // I calculate the time and cover it

在这里遇到过这个问题的任何人,你能给我一些建议吗?我是斯威夫特的新手,仍然学会提高我的技能。

谢谢,

swift avplayer
4个回答
21
投票

对于swift:

let asset = AVURLAsset(URL: NSURL(fileURLWithPath: pathString), options: nil)
let audioDuration = asset.duration
let audioDurationSeconds = CMTimeGetSeconds(audioDuration)

5
投票

我已经在iOS中制作了这些东西并且工作得很好。

AVURLAsset* audioAsset = [AVURLAsset URLAssetWithURL:audioUrl options:nil];
CMTime audioDuration = audioAsset.duration;
float audioDurationSeconds = CMTimeGetSeconds(audioDuration);

5
投票

以下函数适用于Swift 3.0,并将返回包含目标文件持续时间的Double值。

func duration(for resource: String) -> Double {
    let asset = AVURLAsset(url: URL(fileURLWithPath: resource))
    return Double(CMTimeGetSeconds(asset.duration))
}

这将采用resource参数,包含String作为音频文件的文件路径,然后将值从Float64转换为Double


1
投票

你也可以从AVPlayerItem获得持续时间

let item = AVPlayerItem(url: URL(string: "myURL.com")!)

let player = AVPlayer(playerItem: item)
let duration = player.currentItem?.duration.seconds

我通常使用以下方法检查:

guard let duration = player.currentItem?.duration.seconds else { return }
© www.soinside.com 2019 - 2024. All rights reserved.