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 и все още се уча да подобрявам уменията си.

Благодаря,


person Dai Bui    schedule 01.07.2015    source източник


Отговори (4)


За суифт:

let asset = AVURLAsset(URL: NSURL(fileURLWithPath: pathString), options: nil)
let audioDuration = asset.duration
let audioDurationSeconds = CMTimeGetSeconds(audioDuration)
person Jay    schedule 24.10.2015
comment
Здравейте, ако има бавна интернет връзка, цялото приложение спира там, а ако няма интернет връзка, връща 0.0. И така, има ли някакъв начин да го направя в блок? и има ли някакво известие, изстреляно от него, когато ресурсът е наличен? - person souvickcse; 06.09.2017

Следната функция работи със 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.

person CodeBender    schedule 04.02.2017

Направих тези неща в iOS и работят перфектно.

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

Има няколко начина за решаване на това. Това беше мое.

    let item = AVPlayerItem(url: url)
    let duration = Double(item.asset.duration.value) / Double(item.asset.duration.timescale)

Това ще върне продължителността на вашия актив в секунди

person Waylan Sands    schedule 24.04.2020