2014-09-25 113 views
0

我已经尝试了下面的代码。结果它有一些时间获得图像,而不是每次调用这种方法。 有没有解决办法。如何获得视频url的缩略图ios

-(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; 
} 
+0

实际上我已经通过视频网址http://example.com/mp.avi – 2014-09-25 14:13:37

回答

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从视频图像获取。