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

Я пытаюсь создать свое первое приложение для 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 и все еще учусь улучшать свои навыки.

Спасибо,


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.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