Mr. James
Mr. James

Reputation: 486

Get the accurate duration of a video

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)

Upvotes: 33

Views: 23543

Answers (2)

Praveen kumar
Praveen kumar

Reputation: 31

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

        let duration = asset.duration
        let durationTime = CMTimeGetSeconds(duration)
        let minutes = durationTime/60
        let seconds = durationTime%60
        let videoDuration = "\(minutes):\(seconds)"
        print(videoDuration)
    }

Upvotes: 3

David S.
David S.

Reputation: 6705

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

Upvotes: 53

Related Questions