Swift: AVPlayer - Как получить длину mp3 файла из URL?

Я пытаюсь создать мое первое приложение IOS в swift, и я застрял в вопросе: как получить длину (продолжительность) музыкального файла при потоковой передаче?

Я много исследовал, а также написал несколько строк для решения этой проблемы, но, похоже, мой код недостаточно хорош.

 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 и все еще участвую в улучшении своего мастерства.

Спасибо,

Ответ 1

Для быстрого:

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

Ответ 2

Я сделал этот stuf в iOS и отлично работал.

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

Ответ 3

Следующая функция работает с Swift 3.0 и возвращает двойное значение, содержащее продолжительность целевого файла.

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

Это займет параметр resource, состоящий из String для пути к файлу аудиофайла, а затем преобразует значение из Float64 в Double.

Ответ 4

Вы также можете получить продолжительность от 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 }