2012-06-29 4 views
6

To moja klasa, że ​​udało mój film:UWAGA: w normalnych warunkach, _fillInQueueWithExtraSpace: ignoreExistingItems: nie powinien być ponownie wprowadzony

#import "video.h" 
#import <MediaPlayer/MediaPlayer.h> 

@interface video() 
{ 
    MPMoviePlayerController* videoView; 
} 
@end 

@implementation video 

static video *sharedSingleton = nil; 

+ (video *)sharedSingleton 
{ 
    @synchronized([video class]) 
    { 
     if (!sharedSingleton) 
      sharedSingleton = [[super allocWithZone:NULL] init]; 
     return sharedSingleton; 
    } 
    return nil; 
} 

- (id)init 
{ 
    self = [super init]; 

    CGRect dimVideo = CGRectMake(0, 0, 472, 400); 
    NSURL* videoPath = [[NSBundle mainBundle] URLForResource: @"videoName" withExtension: @"mp4"]; 

    self->videoView = [[MPMoviePlayerController alloc] initWithContentURL:videoPath]; 
    [self->videoView.view setFrame:dimVideo]; 
    [self->videoView prepareToPlay]; 

    return self; 
} 

- (void)addVideoOn:(UIView*)view{ 
    [view addSubview:self->videoView.view]; 
    [self->videoView play]; 
} 

- (void)removeVideo{ 
    [self->videoView stop]; 
    [self->videoView.view removeFromSuperview]; 
} 

@end 

Ale czasami mam ten błąd podczas odtwarzania wideo: UWAGA: pod normalne warunki, _fillInQueueWithExtraSpace: ignoreExistingItems: nie należy ponownie wprowadzać.

Gdzie jest problem? Z góry dziękuję

Zauważyłem jedną rzecz: wideo zawiesza się, gdy mijasz czas między zatrzymaniem i grą. Naprawiłem błąd, pozostawiając wideo wstrzymane, nie zatrzymane.

+0

to konwencjonalny wykorzystać swoje nazwy klas : "Wideo" zamiast "wideo" – nielsbot

+0

również spowoduje awarię, jeśli 'self == zero' z jakiegokolwiek powodu w' -init' – nielsbot

+0

dokumentacja dla 'MPMoviePlayerController' mówi" ramka gracza musi pasować do rodzica ", co nie ma miejsca w przypadku Twój kod. Najpierw spróbuję to naprawić. – nielsbot

Odpowiedz

0

Oto jak będzie wyglądać struktura kodu

@interface Video : NSObject 
@property (nonatomic, strong, readonly) MPMoviePlayerController * videoView ; 
@end 

@implementation Video 
@synthesize videoView = _videoView ; 

+(Video *)sharedSingleton 
{ 
    static Video * __sharedSingleton ; 
    static dispatch_once_t once ; 
    dispatch_once(&once, ^{ 
     __sharedSingleton = [ [ [ self class ] alloc ] init ] ; 
    } 
    return __sharedSingleton ; 
} 

-(void)dealloc 
{ 
    [ _videoView stop ] ; 
    [ _videoView.view removeFromSuperview ] ; 
} 

-(void)ensureMoviePlayer 
{ 
    if (!_videoView) 
    { 
     NSURL* url = [[NSBundle mainBundle] URLForResource:@"videoName" withExtension:@"mp4"]; 
     _videoView = [[MPMoviePlayerController alloc] initWithContentURL:url]; 
    } 
} 

- (void)addVideoOn:(UIView*)view 
{ 
    [ self ensureMoviePlayer ] ; 
    self.videoView.view.frame = view.bounds ; // per documentation 
    [view addSubview:self.videoView.view]; 
    [self.videoView play]; 
} 

- (void)removeVideo 
{ 
    [self.videoView stop]; 
    [ self.videoView.view removeFromSuperview ] ; 
} 

@end 

Jeśli próbujesz odtwarzać wideo w pewnej wielkości w widoku macierzystego, spojrzeć na AVPlayer + AVPlayerLayer

Powiązane problemy