Rameswar Prasad
Rameswar Prasad

Reputation: 1331

AVURLAsset returns duration as 0

I am trying to get the duration of the audio files for trimming them, I am using the below code,

audioAsset = [AVURLAsset assetWithURL:itemURL];

CMTime assetTime = [audioAsset duration];
Float64 duration = CMTimeGetSeconds(assetTime);

when I provide itemURL of any audio file of media library, I get the proper duration, and then I am able to trim the audio file. Then I save the trimmed audio file in document directory. But when I try to trim the already trimmed file the same code returns me 0 as duration. However I am able to play the trimmed file and get the duration using AVAudioPlayer, but what is the problem with AVURLAsset I am not able to figure out.

Can anyone help? I have already tried almost all the answers of such question in stackoverflow.

Upvotes: 13

Views: 7074

Answers (6)

Haiyuan
Haiyuan

Reputation: 103

for my case, the filename's extension have to be recognized, like ".mp3". if not, it will return 0.

... let asset = AVURLAsset(url: URL(fileURLWithPath: filefullname), options: nil) ... asset.duration ...

Upvotes: 1

Hiren Panchal
Hiren Panchal

Reputation: 3023

For Swift 3.0 and above

import AVFoundation

  let asset = AVAsset(url: URL(fileURLWithPath: ("Your File Path here")!))
  let totalSeconds = Int(CMTimeGetSeconds(asset.duration))
  let minutes = totalSeconds / 60
  let seconds = totalSeconds % 60
  let mediaDuration = String(format:"%02i:%02i",minutes, seconds)

Upvotes: 1

Cale
Cale

Reputation: 371

I think AVURLAsset needs to know the type extension of your file to compute its duration. You're probably storing your file as {fileName} and not as {fileName}.{extension}.

If you run the following code with yourFileName without extension you get *** Could not find format reader for URL, and return value 0.

import AVFoundation

let fileName = *yourFileName*
let url = NSURL(fileURLWithPath: fileName)
let asset = AVURLAsset(URL: url, options: nil)
println(asset.duration.value.description)

Upvotes: 2

Mr.G
Mr.G

Reputation: 1275

Probably you have used

  NSURL *itemPathURL = [NSURL URLWithString:outPath];

instead of

NSURL *itemPathURL = [NSURL fileURLWithPath:outPath];

Upvotes: 23

Hiren Varu
Hiren Varu

Reputation: 1477

Try this....

AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:Yoururl options:nil];
CMTime time = asset.duration;
double durationInSeconds = CMTimeGetSeconds(time);
int minutes = floor(durationInSeconds/60);
int seconds = round(durationInSeconds - (minutes * 60));
NSString * duration = [NSString stringWithFormat:@"%i:%i",minutes,seconds];
NSLog(@"Duration : %@", duration);

Upvotes: -3

Bhoomi Jagani
Bhoomi Jagani

Reputation: 2423

Try like following.....

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,     NSUserDomainMask,   YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *getAudioPath = [documentsDirectory stringByAppendingPathComponent:@"song.mp3"];
NSURL *finalUrl=[[NSURL alloc]initFileURLWithPath:getAudioPath];
NSLog(@"finalUrl===%@",finalUrl);
AVURLAsset *asset = [AVURLAsset assetWithURL: finalUrl];
duration = CMTimeGetSeconds(asset.duration);
NSLog(@"duration==%f",duration);

Upvotes: 0

Related Questions