Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to get the duration of an audio file in iOS?

NSDictionary* fileAttributes =      [[NSFileManager defaultManager] attributesOfItemAtPath:filename                                                       error:nil] 

From the file attribute keys, you can get the date, size, etc. But how do you get the duration?

like image 395
Namratha Avatar asked Mar 07 '11 11:03

Namratha


People also ask

How do I find the length of an audio file?

To determine the file size of an audio file, we have to multiply the bit rate of the audio by its duration in seconds.


2 Answers

In the 'File Attribute Keys' of the NSFileManager class reference you can see that there is no key to use that will return the duration of a song. All the information that the NSFileManager instance gets about a file is to do with the properties of the actual file itself within the operating system, such as its file-size. The NSFileManager doesn't actually interpret the file.

In order to get the duration of the file, you need to use a class that knows how to interpret the file. The AVFoundation framework provides the exact class you need, AVAsset. You can instantiate an instance of this abstract class using the concrete subclass AVURLAsset, and then provide it an NSURL which points to the audio file you wish to get the duration. You can then get the duration from the AVAsset instance by querying its duration property.

For example:

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

Note that AVFoundation is designed as a heavily asynchronous framework in order to improve performance and the overall user experience. Even performing simple tasks such as querying a media file's duration can potentially take a long period of time and can cause your application to hang. You should use the AVAsynchronousKeyValueLoading protocol to asynchronously load the duration of the song, and then update your UI in a completion handler block. You should take a look at the 'Block Programming Guide' as well as the WWDC2010 video titled, 'Discovering AV Foundation', which is available free at https://developer.apple.com/videos/wwdc/2010.

like image 107
James Bedford Avatar answered Sep 21 '22 01:09

James Bedford


For anyone still looking for this. Based on the answer, the code for Swift 4 (including the async loading of values taken from Apple's documentation):

let audioAsset = AVURLAsset.init(url: yourURL, options: nil)  audioAsset.loadValuesAsynchronously(forKeys: ["duration"]) {     var error: NSError? = nil     let status = audioAsset.statusOfValue(forKey: "duration", error: &error)     switch status {     case .loaded: // Sucessfully loaded. Continue processing.         let duration = audioAsset.duration         let durationInSeconds = CMTimeGetSeconds(duration)         print(Int(durationInSeconds))         break                   case .failed: break // Handle error     case .cancelled: break // Terminate processing     default: break // Handle all other cases     } } 
like image 33
nCr78 Avatar answered Sep 21 '22 01:09

nCr78