Get the accurate duration of a video

Mr. James picture Mr. James · May 30, 2017 · Viewed 12.4k times · Source

I'm making a player and I want to list all files and in front of all files I want to present the duration of the video.

The only problem is that I'm not getting the right video duration, sometimes it return a duration completely wrong.

I've tried the below solution:

let asset = AVAsset(url: "video.mp4")

let duration = asset.duration.seconds

So that it, the time sometimes give a value sometimes another. if someone know a possible solution I'm glad to heard.

I have update the code using one possible solution but it didn't work well,

let asset = AVAsset(url: url)

let duration = asset.duration

let durationTime = CMTimeGetSeconds(duration)

let minutes = Double(durationTime / 60)

I've tried with a video of 11:47 minutes of duration and it returns me = 11:78, how could a video have 11 minutes and 78 seconds?

So I think the problem is with the video, and I picked another video of 1:16 minutes and again the returned value is 1:26 (10 seconds wrong)

Answer

David S. picture David S. · May 30, 2017

This works for me:

import AVFoundation
import CoreMedia

...

    if let url = Bundle.main.url(forResource: "small", withExtension: "mp4") {
        let asset = AVAsset(url: url)

        let duration = asset.duration
        let durationTime = CMTimeGetSeconds(duration)

        print(durationTime)
    }

For the video here it prints "5.568" which is correct.

Edit from comments:

A video that returns 707 seconds when divided by 60 sec/min is 11.78. This is 11.78 minutes, or 11 minutes and 0.78min * 60sec/min = 47sec, total is 11 min 47 sec