Как получить продолжительность видео для AVAsset в Swift

Это может быть дублирующий вопрос, но я потратил много времени на решение. Я загружаю файл mp4 в документальный каталог. Я могу получить все имена файлов с помощью этой функции:

func listFilesFromDocumentsFolder() -> [String]? {
    let fileMngr = FileManager.default;
    let docs = fileMngr.urls(for: .documentDirectory, in: .userDomainMask)[0].path
    return try? fileMngr.contentsOfDirectory(atPath: docs)
}

И я хочу получить продолжительность всех этих файлов. Позвольте мне показать, что я пытаюсь:

var downs = listFilesFromDocumentsFolder()!
for i in 0...downs.count - 1 {
    if downs[i] == ".DS_Store" {
                continue
    }
    let fileManager = FileManager.default
    let urls = fileManager.urls(for: .documentDirectory, in: .userDomainMask)
    if let documentDirectory= urls.first as! NSURL as! NSURL { 
         let yourFinalVideoURL = documentDirectory.appendingPathComponent(downs[i])
         let asset = AVURLAsset(url: yourFinalVideoURL!) as AVURLAsset
         let totalSeconds = Int(CMTimeGetSeconds(asset.duration))
         let minutes = totalSeconds / 60
         let seconds = totalSeconds % 60
         let mediaTime = String(format:"%02i:%02i",minutes, seconds)
         print(yourFinalVideoURL)
         print(mediaTime)
}

вывод

Optional(file:///Users/utf8/Library/Developer/CoreSimulator/Devices/D4F341F1-38A2-498B-99F0-076BE9164A5C/data/Containers/Data/Application/718927F7-4E39-43A8-B760-2A468F82A10F/Documents/viki50102klr.mp4)
00:00

На мой взгляд, я поступил неправильно, когда пытался получить URL-адрес своего видеофайла. Но как это исправить. Я пробую много вещей. Даже я проверяю, существует ли файл или нет. Которые существуют, конечно.

Также я пытаюсь

AVAsset(url: URL(url: yourFinalVideoURL)!)

к сожалению не работает..


person Antiokhos    schedule 01.12.2017    source источник
comment
Что вы получите, если напечатаете totalSeconds вместо mediaTime?   -  person rmaddy    schedule 01.12.2017
comment
Не имеет отношения, но почему все эти действительно плохие кастинги с NSURL?   -  person rmaddy    schedule 01.12.2017
comment
Привет, Мэдди, это тоже 0 (ноль)...   -  person Antiokhos    schedule 01.12.2017
comment
Мой друг, я потратил слишком много времени на это и слишком много пробую. но ничего не получил. Это плохой кастинг, но я пробую и другие вещи. результат провал.   -  person Antiokhos    schedule 01.12.2017


Ответы (1)


Вы не должны передавать свой URL-адрес NSURL. Просто получите URL-адрес каталога ваших документов и добавьте к нему имя файла и расширение. Кроме того, вы можете получить свойство CMTime секунд, которое является двойным, и использовать метод String(format:) для правильного отображения времени в формате "h m s":

let documentDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
let videoURL = documentDirectory.appendingPathComponent(downs[i])    
let duration = AVURLAsset(url: videoURL).duration.seconds
    print(duration)
let time: String
if duration > 3600 {
    time = String(format:"%dh %dm %ds",
        Int(duration/3600),
        Int((duration/60).truncatingRemainder(dividingBy: 60)),
        Int(duration.truncatingRemainder(dividingBy: 60)))
} else {
    time = String(format:"%dm %ds",
        Int((duration/60).truncatingRemainder(dividingBy: 60)),
        Int(duration.truncatingRemainder(dividingBy: 60)))
}
print(time)
person Leo Dabus    schedule 01.12.2017
comment
Да, это так. Спасибо. Также спасибо за исправление плохого литья nsurl - person Antiokhos; 01.12.2017