2012-04-18 5 views
2

인터넷에서 mp4 파일을 실행할 테스트 응용 프로그램을 만들고 있습니다. 코드입니다 : 내가 콘솔MPMoviePlayerViewController가 mp4 파일을 재생할 수 없습니다.

2012-04-18 22:45:11.309 VideoPlayer[891:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'An AVPlayerItem can occupy only one position in a player's queue at a time.' 
*** First throw call stack: 
(0x1df1052 0x1333d0a 0x27cfb31 0x27cbb2a 0x27e45cc 0x103b73 0xd4e6a 0x2ff2445 0x2ff44f0 0x1d28833 0x1d27db4 0x1d27ccb 0x16d8879 0x16d893e 0x24ea9b 0x1d12 0x1c85) 
terminate called throwing an exception(gdb) 

에이 예외를 얻었다 후

-(IBAction)playRemoteVideo 
{ 

    NSString *mp4File = @"http://archive.org/download/Pbtestfilemp4videotestmp4/video_test_512kb.mp4"; 

    MPMoviePlayerViewController *playerController = [[MPMoviePlayerViewController alloc] initWithContentURL:[NSURL URLWithString:mp4File]]; 
    [self presentMoviePlayerViewControllerAnimated:playerController]; 
    playerController.moviePlayer.movieSourceType=MPMovieSourceTypeStreaming; 

    [playerController.moviePlayer play]; 
    [playerController release]; 
    playerController=nil; 
} 

나는 응용 프로그램을 실행하고 플레이어가 잠시 동안 비디오를로드하려고 비디오를 재생하지만 내가 같은 실행하면 예를 들어, m3u8 파일이있는 코드;

http://devimages.apple.com/iphone/samples/bipbop/gear1/prog_index.m3u8 

동영상을 실행할 수는 있지만 mp4 파일은 작동하지 않습니다.

이 예외가 발생한 이유와 내 코드의 문제점에 대해 알고 계십니까?

나는 아이폰 시뮬레이터에서 응용 프로그램을 실행하고 나는 엑스 코드 4.2 안부 Tugrul 지금처럼 동영상 플레이어의 컨트롤 스타일을

답변

4

를 설정해야합니다.

[self.mPlayer.moviePlayer setControlStyle:MPMovieControlStyleDefault]; 

또한, 로컬 파일 속성 세트를 MPMovieSourceTypeStreaming되지는 MPMovieSourceTypeFile 있습니다.

+0

안녕하세요. 지금 사용해 주셔서 감사합니다. – tguclu

+0

수락대로 표시해야합니다. – CodaFi

+0

나는이 접근법을 사용할 여유가 없다. 통제는 관례 일 필요가있다 - 그것은 절대적이다. 이 트릭에 의지하지 않고이 버그를 고칠 수있는 방법이 있습니까? 분명히 그것은 프레임 워크 문제이지만 전혀 다른 방법이 없습니까? 죄송합니다. 나는 단호하게 소리를 지르지 만,이 문제에 대한 해결책을 찾기 위해 모든 노력을 완전히 좌절 시켰습니다. –

0

"AVPlayerItem이 플레이어의 대기열에서 한 번에 하나의 위치 만 차지할 수 있습니다."라는 로그가 매우 유용하기 때문에 이러한 상황이 발생할 수있는 또 하나의 시나리오가 있습니다. 기본적으로 동시에 두 개의 비디오를 재생하려고 할 때 또는 동시에 두 개의 비디오/MPMoviePlayerController 객체와 상호 작용할 때도 마찬가지입니다.

내 앱에서는 두 개의 MPMoviePlayerController를 사용하여 서로 다른 비디오간에 무한히 이동하고 교체하는 사용자를위한 환상을 만들기 위해 계속해서 서로 바꿔 놓습니다.

이것은 지금까지 문제가 없었지만 최근에는 동영상이 일시 중지되었다가 다시 시작되는 결과를 가져올 일부 이벤트에 대한 알림을 추가했습니다. 그러나 두 선수 객체가 동시에 알림을 듣고 있다는 것을 알지 못했기 때문에 "일시 중지"또는 "재생"중 하나를 동시에 트리거하려고했습니다. 이로 인해 프레임 워크에서 여러 동영상을 동시에 재생하려고한다는 생각을하게되어이 예외가 발생했습니다.

지금해야 할 일은 오직 한 플레이어 개체가 주어진 시점에서 알림을 듣고 있는지 확인해야한다는 것입니다. 내 응용 프로그램 로직을 조금만 수정하면됩니다.

이상한 오류가 발생하는 경우 문제가있는 프레임 워크, 악의적 인 운영 체제가 당신의 삶을 지옥에 떨어 뜨리거나 신의 행동을 할 필요가 없습니다. 그것은 순수하고 좋은 구식 나쁜 코드 일 수 있습니다. :)

0

나는이 오류를 알고있다. 이 코드를 여기에서보십시오.

MPMoviePlayerController *player = [[MPMoviePlayerController alloc] initWithContentURL: url]; 
    self.movieController = player; 
    self.movieController.fullscreen = YES; 
    self.movieController.controlStyle = MPMovieControlStyleDefault; 

    // Register to receive a notification when the movie has finished playing. 
    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(moviePlayBackDidFinish:) 
               name:MPMoviePlayerPlaybackDidFinishNotification 
               object:self.movieController]; 
    // Register to receive a notification when the movie has finished playing. 
    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(moviePlayBackDidFinish:) 
               name:MPMoviePlayerDidExitFullscreenNotification 
               object:self.movieController]; 
    [self.movieController prepareToPlay]; 
    [self.movieController.view setFrame: self.view.bounds]; // player's frame must match parent's 
    [self.view addSubview: self.movieController.view]; 

    // ... 
    [self.movieController play];