iPhone :How to get duration of video selected from library?

前端 未结 6 1262
一整个雨季
一整个雨季 2020-12-23 12:14

I am using UIImagePickerController to choose video file from library. And user can upload the video.

Also I am using videoMaximumDuration p

相关标签:
6条回答
  • 2020-12-23 12:53

    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];
    }
    
    0 讨论(0)
  • 2020-12-23 12:59

    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.

    0 讨论(0)
  • 2020-12-23 13:01

    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)
    
    0 讨论(0)
  • 2020-12-23 13:02

    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);
    }
    
    0 讨论(0)
  • 2020-12-23 13:10

    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);
    }
    
    0 讨论(0)
  • 2020-12-23 13:11

    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
    
    0 讨论(0)
提交回复
热议问题