I am using UIImagePickerController
to choose video file from library. And user can upload the video.
Also I am using videoMaximumDuration
property while user wants to capture video and upload it.
I want to know that How can I get the duration of selected video file ? so that I can restrict the user to upload video that has duration more then 20 seconds.
I am able to get some basic info about selected video by this code :
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
selectedVideoUrl = [info objectForKey:UIImagePickerControllerMediaURL];
NSError *error;
NSDictionary * properties = [[NSFileManager defaultManager] attributesOfItemAtPath:selectedVideoUrl.path error:&error];
NSNumber * size = [properties objectForKey: NSFileSize];
NSLog(@"Vide info :- %@",properties);
}
But there is nothing about duration of selected video.
Thanks...
Got the solution : I use AVPlayerItem
class and AVFoundation
and CoreMedia
framework.
#import <AVFoundation/AVFoundation.h>
#import <AVFoundation/AVAsset.h>
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
selectedVideoUrl = [info objectForKey:UIImagePickerControllerMediaURL];
AVPlayerItem *playerItem = [AVPlayerItem playerItemWithURL:selectedVideoUrl];
CMTime duration = playerItem.duration;
float seconds = CMTimeGetSeconds(duration);
NSLog(@"duration: %.2f", seconds);
}
The other answer to this question using AVPlayerItem didn't work for me, but this did using AVURLAsset:
#import <AVFoundation/AVFoundation.h>
-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
NSURL *videoURL=[info objectForKey:@"UIImagePickerControllerMediaURL"];
AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:videoURL options:nil];
NSTimeInterval durationInSeconds = 0.0;
if (asset)
durationInSeconds = CMTimeGetSeconds(asset.duration);
}
Swift 4
regardless of using didFinishPickingMediaWithInfo
or didFinishRecordingToOutputFileAtURL
you can:
// needed only for didFinishPickingMediaWithInfo
let outputFileURL = info[UIImagePickerControllerMediaURL] as! URL
// get the asset
let asset = AVURLAsset(url: outputFileURL)
// get the time in seconds
let durationInSeconds = asset.duration.seconds
In the event that you use AVFoundation
and AssetLibrary frameworks, you can enumerate all assets, apply filter for just videos, and get the duration of each videos with the method - (id)valueForProperty:(NSString *)property
. Pass in ALAssetPropertyDuration
for property. Code below prints out the following on the console.
video clip number 0 is 66.80833333333334 seconds
video clip number 1 is 190.06 seconds
video clip number 2 is 13.74 seconds
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
if (!assetItems) {
assetItems = [[NSMutableArray alloc] init];
} else {
[assetItems removeAllObjects];
}
if (!assetLibrary) {
assetLibrary = [[ALAssetsLibrary alloc] init];
}
ALAssetsLibraryGroupsEnumerationResultsBlock listBlock = ^(ALAssetsGroup *group, BOOL *stop) {
if (group) {
[group setAssetsFilter:[ALAssetsFilter allVideos]];
[group enumerateAssetsUsingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop) {
if (result) {
[assetItems addObject:result];
NSString *duration = [result valueForProperty:ALAssetPropertyDuration];
NSLog(@"video clip number %d is %@ seconds\n",index, duration);
}
}];
}
};
ALAssetsLibraryAccessFailureBlock failBlock = ^(NSError *error) { // error handler block
NSString *errorTitle = [error localizedDescription];
NSString *errorMessage = [error localizedRecoverySuggestion];
NSLog(@"%@...\n %@\n",errorTitle,errorMessage);
};
[assetLibrary enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:listBlock failureBlock:failBlock];
}
Swift 3.0 and Swift 4
let outputFileURL = info[UIImagePickerControllerMediaURL] as! URL
// get the asset
let asset = AVURLAsset.init(url: outputFileURL) // AVURLAsset.init(url: outputFileURL as URL) in swift 3
// get the time in seconds
let durationInSeconds = asset.duration.seconds
print("==== Duration is ",durationInSeconds)
Yes, You can use the property "duration" defined by MPMediaPlayerController. Plese try it out and check the output. U can refer the here duration property
Try to use the MPMediaPlayerController to play the video and then use the property "duration". U will be able to clearly get the details about the duration of the video.