2010-08-08 9 views
1

저는 동영상을 iPhone으로 스트리밍하고 있으며 MPMoviePlayerController가 처음부터 사물을 처리하는 방식을 좋아하지 않습니다. 특정 영화를 선택하기 위해 행을 클릭하면 앱이 재생 될 때까지 앱이 그냥 앉아있는 것을 보았습니다. 그래서 나는 UIImageView에서 로딩 이미지와 훌륭한 스피너를 사용하여 사용자에게 정보를 제공합니다.동영상 재생을 시작하기 전에 취소하기

나는 그들이 기다릴 때 지쳐 버리면 영화 재생을 취소 할 수있는 옵션이 있어야한다고 생각한다. 그래서 배경 이미지가있는 취소 버튼이 있습니다.

UIButton *cancel; 
    UIImage *cancelImage = [UIImage imageNamed:@"cancel.png"]; 
    cancel = [UIButton buttonWithType:UIButtonTypeCustom]; 
    cancel.frame = CGRectMake(0,0, cancelImage.size.width, cancelImage.size.height); 
    cancel.center = CGPointMake(35, 20); 
    [cancel setImage:cancelImage forState:UIControlStateNormal]; 
    [cancel addTarget:self action:@selector(cancelMovie) forControlEvents:UIControlEventTouchUpInside]; 
    [moviePreviewView addSubview:cancel]; 

그러나 cancelMovie 메서드에 무엇을 넣을지 잘 모르겠습니다. 나는 moviePlayBackDidFinish 콜백 메소드에서 가지고있는 것을 복제하려고 시도했지만 다소 화려하게 충돌합니다.

는 또한 시도 :

-(void)cancelMovie { 
[theMovie.view removeFromSuperview]; 
[theMovie release]; 
} 

하지만 그 중 하나가 좋은 아무것도하지 않습니다. 직접 moviePlayBackDidFinish를 호출 할 수 있다고 생각했지만 직접 알림 메서드를 호출 할 수 있다고는 생각하지 않습니다.

의견이 있으십니까?

답변

2

나는 내 자신의 질문에 대답하는 것을 싫어하지만,이 질문에는 단지 7 가지의 의견이 있었기 때문에 내가 생각하는 것만 큼 중요하지 않을 수있다. 아마 밤중에 게시해서는 안됩니다 ... 할 때 아무도 그들을 볼 수 없습니다.

어쨌든,이 문제에 대한 좋은 해결책을 찾지 못했습니다 ... 단지 해킹입니다.

cancel 메서드에서 나는 moviePlayer에 previewImage에서 사용한 것과 동일한 사진 인 1 초의 다른 동영상을로드하라고했습니다. 그 '영화'가 끝나면 MPMoviePlayerPlaybackDidFinishNotification을 호출하고 정리하여 사용자가 있던 곳으로 되돌립니다.

-(void)cancelMovie 
{ 
cancelURL = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"cancel" ofType:@"m4v"]]; 

[theMovie setContentURL:cancelURL]; 

[theMovie setControlStyle:MPMovieControlStyleFullscreen]; 
[theMovie setFullscreen:YES]; 

// for some reason ... this is neccessary 
[theMovie prepareToPlay]; 

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

// Register for the PlayBackDidFinish (movie is finished) 
[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(moviePlayBackDidFinish:) 
              name:MPMoviePlayerPlaybackDidFinishNotification 
              object:theMovie];  
} 

좋지 않지만 작동합니다.

0

@ 마이클 솔루션이 작동합니다. 취소 비디오를 재생할 필요가 없다는 개선이있을 수 있습니다. 대신 직접 MPMoviePlayerPlaybackDidFinishNotification으로 직접 전화 할 수 있습니다.

[self moviePlayBackDidFinish:nil]; 

먼저 마이클의 생각을 구현했지만 결국 다음 비디오를 재생하지 않고 성공했습니다.

0
-(void)cancelMovie 
{ 
    if (_mediaPlayer){ 
     [_mediaPlayer stop]; 
     _mediaPlayer.initialPlaybackTime = -1.0; 
     _mediaPlayer.contentURL = nil; 
     [_mediaPlayer prepareToPlay]; 
    } 
} 
관련 문제