I need to get a (local) video's duration, and then get access to its individual frames as UIImage
s. 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?
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];
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)
}
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With