2014-09-15 8 views
1

한 번 동영상을 재생 한 후 왜 검은 화면이 깜박 거리는 지 알아 내려고합니다. 로드 상태가 MPMovieLoadStatePlayable 일 때 검은 색 화면이없고 비디오가 부드럽게 재생된다는 것을 알았습니다. 그러나 비디오가 한 번 재생되면로드 상태는 MPMovieLoadStateUnknown이됩니다. 로드 상태를 알 수 없을 때 검정색 화면이 깜박이고, 아마도 prepareToPlay를 먼저 호출해야하기 때문일 것입니다.동영상을 한 번 재생 한 후 IOS 무비 플레이어가 알려지지 않은로드 상태입니다. MPMoviePlayerController

- (void)didTapVideoPlayButtonAction:(UIButton *)sender{ 
    [self.playButton setHidden:YES]; 
    [self.moviePlayer prepareToPlay]; 
    [self.moviePlayer requestThumbnailImagesAtTimes:@[ @0.1f, @1.0f ] timeOption:MPMovieTimeOptionExact]; 
    [self.moviePlayer play]; 
} 

-(void)movieFinishedCallBack{ 
    [[NSNotificationCenter defaultCenter] removeObserver:self 
               name:MPMoviePlayerPlaybackDidFinishNotification 
               object:self.moviePlayer]; 

} 

-(void)loadStateDidChange:(NSNotification *)notification{ 

    //NSLog(@"loadStateDidChange: %@",notification); 

    if (self.moviePlayer.loadState == MPMovieLoadStatePlayable) { 
     NSLog(@"loadState... MPMovieLoadStatePlayable"); 
    } 

    if (self.moviePlayer.loadState == MPMovieLoadStatePlaythroughOK) { 
     NSLog(@"loadState... MPMovieLoadStatePlaythroughOK"); 
    } 

    if (self.moviePlayer.loadState == MPMovieLoadStateStalled) { 
     NSLog(@"loadState... MPMovieLoadStateStalled"); 
    } 

    if (self.moviePlayer.loadState == MPMovieLoadStateUnknown) { 
     NSLog(@"loadState... MPMovieLoadStateUnknown"); 
     //[self.moviePlayer prepareToPlay]; 
    } 
} 

-(void)moviePlayerStateChange:(NSNotification *)notification{ 

    //NSLog(@"moviePlayerStateChange: %@",notification); 

    if (self.moviePlayer.playbackState == MPMoviePlaybackStatePlaying){ 
     [self.imageView addSubview:self.moviePlayer.view]; 
    } 

    if (self.moviePlayer.playbackState == MPMoviePlaybackStateStopped){ 
     NSLog(@"moviePlayer... Stopped"); 
     [self.playButton setHidden:NO]; 
     //[self.moviePlayer.view removeFromSuperview]; 
     [self.moviePlayer prepareToPlay]; 
    } 

    if (self.moviePlayer.playbackState == MPMoviePlaybackStatePaused){ 
     NSLog(@"moviePlayer... Paused"); 
     [self.moviePlayer stop]; 
    } 

    f (self.moviePlayer.playbackState == MPMoviePlaybackStateInterrupted){ 
     NSLog(@"moviePlayer... Interrupted"); 
     [self.moviePlayer stop]; 
    } 

    if (self.moviePlayer.playbackState == MPMoviePlaybackStateSeekingForward){ 
     NSLog(@"moviePlayer... Forward"); 
    } 

    if (self.moviePlayer.playbackState == MPMoviePlaybackStateSeekingBackward){ 
     NSLog(@"moviePlayer... Backward"); 
    } 
} 

내가 솔루션이 될 것이라고 생각, 문장 내에서 prepareToPlay 전화 : 여기

- (void)setVideo:(PFObject *)aVideo { 
    video = aVideo; 

    if(self.moviePlayer) { 
     self.moviePlayer = nil; 
    } 

    // Get the profile image 
    PFUser *user = [self.video objectForKey:kFTPostUserKey]; 
    PFFile *profilePictureSmall = [user objectForKey:kFTUserProfilePicSmallKey]; 
    NSString *authorName = [user objectForKey:kFTUserDisplayNameKey]; 

    // Get the video file 
    PFFile *videoFile = [video objectForKey:kFTPostVideoKey]; 
    NSURL *url = [NSURL URLWithString:videoFile.url]; 
    self.moviePlayer = [[MPMoviePlayerController alloc] init]; 
    [self.moviePlayer.view setFrame:CGRectMake(0.0f,0.0f,320.0f,320.0f)]; 
    [self.moviePlayer setControlStyle:MPMovieControlStyleNone]; 
    [self.moviePlayer setScalingMode:MPMovieScalingModeAspectFill]; 
    [self.moviePlayer setMovieSourceType:MPMovieSourceTypeFile]; 
    [self.moviePlayer setContentURL:url]; 
    [self.moviePlayer requestThumbnailImagesAtTimes:@[ @0.1f, @1.0f ] timeOption:MPMovieTimeOptionExact]; 
    [self.moviePlayer setShouldAutoplay:NO]; 
    [self.moviePlayer.view setBackgroundColor:[UIColor clearColor]]; 

    [[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(movieFinishedCallBack) 
              name:MPMoviePlayerPlaybackDidFinishNotification 
              object:self.moviePlayer]; 

    [[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(moviePlayerStateChange:) 
              name:MPMoviePlayerPlaybackStateDidChangeNotification 
              object:self.moviePlayer]; 

    [[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(loadStateDidChange:) 
              name:MPMoviePlayerLoadStateDidChangeNotification 
              object:self.moviePlayer]; 

} 

이 기능은 다음과 같습니다 다음

내가 내 동영상을 설정하고있다 방법 if (self.moviePlayer.loadState == MPMovieLoadStateUnknown)

나는 이것을 시도했지만 게임을 준비하지 못했습니다. 어떤 생각/조언/도움이 필요합니까?

+0

이 코드는 잘못되었습니다. 'self.moviePlayer.loadState == // ...'이는로드 상태가 어떻게되는지를 결정하는 방법이 아닙니다. ! 로드 상태는 비트 마스크입니다. 특정 마스크에 대해 bitwise-and를 사용해야하고 0 또는 0이 아닌지 확인해야합니다. – matt

+0

실제 문제에 관해서는,'MPMovieLoadStateUnknown'은 대개 파일이 URL에서 발견되지 않는다는 것을 의미합니다. 콘텐츠 URL을 결정하는 방법에 대해 더 많이 보여줄 수 있습니까? – matt

+0

나는이 함수를 추가했다.비디오가 포함 된 PFObject를 전달하고 PFFile * videoFile = [video objectForKey : kFTPostVideoKey]와 같은 비디오 파일을 설정합니다. – SuperKevin

답변

2

비디오는 한 번 재생할 수 있지만 나중에 다시 재생할 수 없다는 사실은 MPMoviePlayerController의 내장 기능이 아닙니다. MPMoviePlayerController를 사용한 적이 한 번도 없었습니다. 그래서 다른 것을 찾아야합니다. 그는 보통 MPLoadStateUnknown의 원인이 잘못된 값 (그것의 contentURL을 변경하는 등, 귀하의 MPMoviePlayerController의 상태를 난파하도록 일이 될 수 두 가지가 마음에 와서 :.

  • 나는 방법을 알 MPMoviePlayerController를 구성하는 일반적인 방법은 없으며 실제로 속성의 설정자입니다 (video). 이 문제는 항상 때마다 코드 video = //...라고 말합니다.이 방법은 전체 동영상 플레이어를 분해하고 새 플레이어를 만드는 것을 의미합니다. 이제 어딘가 다른 코드가 video = nil 또는 다른 나쁜 값이라고 가정합니다. 그러면 영화 플레이어보기가 검게 변하고 더 이상 재생되지 않을 것입니다. 나는이 방법을 중점적으로 살펴봄으로써 그러한 일이 일어나고 있는지 알아볼 것을 제안한다. 그리고 더 나은 아키텍처를 설정하십시오. 설정자는 속성 만 설정하면됩니다. 영화 플레이어의 구성은 한 번만 발생해야하며 자체적 인 방법으로 이루어져야합니다.

  • 실수로 MPMoviePlayerController 이상이 생성되는 것을주의하십시오. "하나만있을 수 있습니다." - 또 다른 MPMoviePlayerController가 나타나고 prepareToPlay을 호출하면 다른 모든 MPMoviePlayerController는 사용할 수 없게됩니다. 이 문제의 직접적인 소스 아니지만

(마지막으로, 부하 상태를 비트 마스크이기 때문에, 잘못 부하 상태를 결정합니다. 당신은 평등을 사용하고 있지만, 쉽게 실패 할 수 있습니다 논리를 사용하여 마스크를 비교해야합니다.

+0

검은 화면의 원인에 대해 절대적으로 맞았고 여러 MPMoviePlayers를 만들지 않도록 디자인을 다시 아키텍처로 변경하려고합니다. 감사! – SuperKevin

+0

환상적! 다행 이네, 너를 올바른 방향으로 가리킬 수 있었어. – matt