Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

iOS: get video duration and thumbnails without playing video

Tags:

ios

ios6

I need to get a (local) video's duration, and then get access to its individual frames as UIImages. So far I've been using MPMoviePlayerController for this.

First I register for MPMovieDurationAvailableNotification events, and then call prepareToPlay. When the event is received I note the video's duration, and then I request frames via requestThumbnailImagesAtTimes.

This works, however the video seems to start playing even if I have not added the it to the view in any way (I can hear the audio playing in the background).

Is there any way to get a video's duration and frames without actually playing the video?

like image 783
George Armhold Avatar asked Feb 07 '13 01:02

George Armhold


3 Answers

To get the duration:

NSURL *sourceMovieURL = [NSURL fileURLWithPath:somePath];
AVURLAsset *sourceAsset = [AVURLAsset URLAssetWithURL:sourceMovieURL options:nil];
CMTime duration = sourceAsset.duration;

To get a framegrab:

AVAssetImageGenerator* generator = [AVAssetImageGenerator assetImageGeneratorWithAsset:destinationAsset];

//Get the 1st frame 3 seconds in
int frameTimeStart = 3;
int frameLocation = 1;

//Snatch a frame
CGImageRef frameRef = [generator copyCGImageAtTime:CMTimeMake(frameTimeStart,frameLocation) actualTime:nil error:nil];
like image 173
Shizam Avatar answered Nov 19 '22 21:11

Shizam


You can get in swift like this

func getMediaDuration(url: NSURL!) -> Float64{
    let asset : AVURLAsset = AVURLAsset(URL: url) as AVURLAsset
    let duration : CMTime = asset.duration
    return CMTimeGetSeconds(duration)
}
like image 33
Dharmbir Singh Avatar answered Nov 19 '22 21:11

Dharmbir Singh


Calling setShouldAutoPlay:NO does the trick with MPMoviePlayerController:

 moviePlayerController = [[MPMoviePlayerController alloc] initWithContentURL: movieURL];
[moviePlayerController setShouldAutoplay:NO];   
[moviePlayerController prepareToPlay];

Edit: I'm getting downvoted without explanation, but I'll stand by this answer. If you need to use MPMoviePlayerController then this will prevent autoplay of the media, yet still allow you to get duration and thumbnails as per my original question.

like image 6
George Armhold Avatar answered Nov 19 '22 21:11

George Armhold