2015-07-01 8 views
11

Jestem w trakcie budowy mojej pierwszej aplikacji IOS w szybkim tempie i utknąłem w pytaniu: Jak uzyskać długość (czas trwania) pliku muzycznego podczas przesyłania strumieniowego?Swift: AVPlayer - Jak uzyskać długość pliku mp3 z adresu URL?

Zrobiłem wiele badań, a także napisałem kilka kodów do rozwiązania tego problemu, ale wydaje mi się, że mój kod nie jest wystarczająco dobry.

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 

Każdy, kto tu kiedykolwiek zatrzymany z tego problemu, możesz dać mi jakiś sugeruje na to naprawić? Jestem bardzo nowy w Swift i wciąż uczę się doskonalić swoje umiejętności.

Dzięki,

Odpowiedz

3

Zrobiłem to wszystko w iOS i działa idealnie.

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

Dzięki Chetan, spróbuję to załatwić Swiftowi :) –

15

Dla SWIFT:

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

Witam, jeśli jest wolne połączenie internetowe to zatrzymuje się tam cała aplikacja, a jeśli nie ma połączenia z Internetem, to zwraca 0,0. Czy jest jakiś sposób, aby zrobić to w bloku? i czy jest dostępne powiadomienie, gdy zasób jest dostępny? – souvickcse

2

Poniższa funkcja współpracuje z Swift 3.0 i powróci podwójna wartość zawierającą czas trwania pliku docelowego.

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

To zajmie parametr resource, składający się z String dla filePath pliku audio, a następnie przekonwertować wartość z Float64 do Double.

+0

daje mi nierozwiązany identyfikator do zestawu AVURLA – reggie