2012-06-29 7 views
6
werden

Das ist meine Klasse, die mein Video verwaltet:ACHTUNG: unter normalen Bedingungen, _fillInQueueWithExtraSpace: ignoreExistingItems: sollte nicht erneut eingegeben

#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 

Aber manchmal bekomme ich diesen Fehler, wenn das Video abspielen: ACHTUNG: unter normale Bedingungen, _fillInQueueWithExtraSpace: ignoreExistingItems: sollte nicht erneut eingegeben werden.

Wo ist das Problem? Vielen Dank im Voraus

Ich bemerkte eine Sache: Video friert ein, wenn Sie die Zeit zwischen dem Stopp und spielen übergeben. Ich habe den Fehler behoben und das Video pausiert, nicht gestoppt.

+0

ist es üblich, Ihre Klassennamen zu nutzen : "Video" statt "Video" – nielsbot

+0

auch das wird abstürzen, wenn 'self == nil' aus welchem ​​Grund auch immer in' -init' – nielsbot

+0

die Dokumentation für 'MPMoviePlayerController' sagt" der Rahmen des Spielers muss mit dem der Eltern übereinstimmen ", was nicht der Fall ist dein Code. Ich würde versuchen, das zuerst zu beheben. – nielsbot

Antwort

0

Hier ist, wie ich Ihren Code

@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 

strukturieren würde Wenn Sie versuchen, Videos mit einer bestimmten Größe innerhalb einer übergeordneten Ansicht zu spielen, schauen AVPlayer + AVPlayerLayer