如何获取视频网址的缩略图

时间:2014-09-25 14:12:01

标签: objective-c thumbnails

我试过下面的代码。结果它获取图像一段时间,而不是每次调用此方法。 有什么解决方案。

-(UIImage *)thumbnailFromVideoAtURL:(NSString *)urlstr
{
   NSURL *url = [NSURL URLWithString:urlstr];

   AVAsset *asset = [AVAsset assetWithURL:url];

//  Get thumbnail at the very start of the video
CMTime thumbnailTime = [asset duration];
thumbnailTime.value = 0;

//  Get image from the video at the given time
AVAssetImageGenerator *imageGenerator = [[AVAssetImageGenerator alloc] initWithAsset:asset];

CGImageRef imageRef = [imageGenerator copyCGImageAtTime:thumbnailTime actualTime:NULL error:NULL];
UIImage *thumbnail = [UIImage imageWithCGImage:imageRef];
CGImageRelease(imageRef);

return thumbnail;
}

1 个答案:

答案 0 :(得分:0)

<强> CustomMoviePlayerVC.h

@interface CustomMoviePlayerVC : UIViewController {
    @public
    MPMoviePlayerController *mp;
    NSURL *movieURL;
}

@property (weak, nonatomic) UIView *playBtn;

- (id)initWithPath:(NSString *)moviePath tag:(int)tag;

- (void)startPlayer;
- (void)pausePlayer;
- (void)stopPlayer;
- (BOOL)isFullScreen;
- (UIImage *)getVideoThumbnail;
- (MPMoviePlaybackState)getVideoPlaybackState;
- (MPMovieLoadState)getVideoLoadState;
- (void)enterFullScreenAnimated:(BOOL)animated;
- (void)exitFullScreenAnimated:(BOOL)animated;


- (void)prepare;

@end

<强> CustomMoviePlayerVC.m

#import "CustomMoviePlayerVC.h"

@interface CustomMoviePlayerVC ()

@end

@implementation CustomMoviePlayerVC

- (BOOL)isFullScreen
{
    return mp.isFullscreen;
}

- (void)dealloc
{
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

- (id)initWithPath:(NSString *)moviePath tag:(int)tag
{
    // Initialize and create movie URL
    if (self = [super init]) {
        movieURL = [NSURL URLWithString:moviePath];
        mp =  [[MPMoviePlayerController alloc] initWithContentURL:movieURL];

        // Set movie player layout
        if(tag == 1) {
            [mp setControlStyle:MPMovieControlStyleNone];
        }
        [mp setShouldAutoplay:NO];
        [mp setFullscreen:NO];

        // May help to reduce latency
        [mp prepareToPlay];

        // Register that the load state changed (movie is ready)
        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(moviePlayerLoadStateChanged:)
                                                     name:MPMoviePlayerLoadStateDidChangeNotification
                                                   object:nil];

        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector: @selector(MoviePlayerThumbnailImageRequestDidFinish:)
                                              name: MPMoviePlayerThumbnailImageRequestDidFinishNotification
                                                   object: nil];


        // registering for playback state change notification
        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(moviePlaybackStateDidChange:)
                                                     name:MPMoviePlayerPlaybackStateDidChangeNotification
                                                   object:nil];

        // registering for playback finish notification
        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(moviePlaybackDidFinish:)
                                                     name:MPMoviePlayerPlaybackDidFinishNotification
                                                   object:nil];

        // registering for playback finish notification
        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(moviePlaybackWillEnterFullscreen:)
                                                     name:MPMoviePlayerWillEnterFullscreenNotification
                                                   object:nil];

        // registering for playback finish notification
        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(moviePlaybackDidExitFullscreen:)
                                                     name:MPMoviePlayerDidExitFullscreenNotification
                                                   object:nil];

    }
    return self;
}

- (void)MoviePlayerThumbnailImageRequestDidFinish:(NSNotification*)not
{

}

- (void)enterFullScreenAnimated:(BOOL)animated
{
    [mp setFullscreen:YES animated:animated];
}

- (void)exitFullScreenAnimated:(BOOL)animated
{
    [mp setFullscreen:NO animated:animated];
}

- (void)moviePlayerLoadStateChanged:(NSNotification *)notification
{
    [mp setControlStyle:MPMovieControlStyleEmbedded];
    // Unless state is unknown, start playback
    if ([mp loadState] != MPMovieLoadStateUnknown) {
        // Set frame of movie player
        [[mp view] setFrame:self.view.frame];

        // Add movie player as subview
        [[self view] addSubview:[mp view]];
    }
}

- (void)moviePlaybackDidFinish:(NSNotification *)notification
{
    [self exitFullScreenAnimated:YES];
    if (mp.currentPlaybackTime <= 0.1) {
        dispatch_async(dispatch_get_main_queue(), ^{
            [mp stop];
            [mp play];
            [mp pause];
        });
    }
}

- (void)moviePlaybackStateDidChange:(NSNotification *)notification
{
    switch ([self getVideoPlaybackState]) {
        case MPMoviePlaybackStatePlaying:
            [self.playBtn setHidden:YES];
            [self.playBtn setUserInteractionEnabled:NO];
            break;
        case MPMoviePlaybackStatePaused:
            [self.playBtn setHidden:NO];
            [self.playBtn setUserInteractionEnabled:YES];
            break;
        case MPMoviePlaybackStateStopped:
            [self.playBtn setHidden:NO];
            [self.playBtn setUserInteractionEnabled:YES];            
            break;            
        default:
            break;
    }
}

- (void)moviePlaybackWillEnterFullscreen:(NSNotification *)notification
{
}

- (void)moviePlaybackDidExitFullscreen:(NSNotification *)notification
{
}

- (void)startPlayer
{
    [self.playBtn setHidden:YES];
    [self.playBtn setUserInteractionEnabled:NO];
    if (mp.loadState != MPMovieLoadStateUnknown) {
        [mp play];
    }
}

- (void)pausePlayer
{
    [self.playBtn setHidden:NO];
    [self.playBtn setUserInteractionEnabled:YES];
    if (mp.loadState != MPMovieLoadStateUnknown) {
        [mp pause];
    }
}

- (void)stopPlayer
{
    [self.playBtn setHidden:NO];
    [self.playBtn setUserInteractionEnabled:YES];
    if (mp.loadState != MPMovieLoadStateUnknown) {
        [mp stop];
    }
}


- (UIImage *)getVideoThumbnail
{
    if (mp && mp.loadState != MPMovieLoadStateUnknown) {
        return [mp thumbnailImageAtTime:0.3 timeOption:MPMovieTimeOptionExact];
    }

    return nil;
}

- (MPMoviePlaybackState)getVideoPlaybackState
{
    return mp.playbackState;
}

- (MPMovieLoadState)getVideoLoadState
{
    return mp.loadState;
}

- (void)prepare
{
    [mp prepareToPlay];
}

@end 

使用getVideoThumbnail从视频中获取图片。