본문

MoviePlayer예제로 살펴보는 아이폰 Media Player Framework #3 : 동영상 재생

마찬가지로 소개 페이지에 있던 화면을 보면 동영상 재생을 위해 Play Movie라는 버튼이 있음을 알 수 있다. 지난번에 적지 않았던게 적었던게, Local 동영상을 재생하는 Play Movie버튼과 원격 동영상을 재생하는 버튼의 이벤트 처리기가 다르다는 것이다. Local 동영상 재생기는 MyMovieViewController.m의 60번째 줄에 playMovieButtonPressed: 이벤트 핸들러가있고, 원격 동영상 재생기는 MyStreamingMovieViewController.m의 58번째 줄에 동일한 이름을 갖는 핸들러가 있다.

로컬 동영상은 이 메소드 내의 66번째 줄인 [appDelegate initAndPlayMovie:[self localMovieURL]];을 통하여 localMovieURL: 메소드에서 얻은 동영상 주소를 통하여 initAndPlayMovie를 실행시키며, 원격 동영상은 playMovieButtonPressed: 이벤트 핸들러에서 직접 주소를 initAndPlayMovie로 넘겨 동영상을 재생시킨다. 그럼 주소는 어떻게 얻는지 확인해보자.



[그림 1] Settings.bundle의 내용, 그리고 파일구조


1. 동영상의 주소얻기(로컬 / 원격)
MyMovieViewController.m : 84
// 현재 어플리케이션의 위치정보를 담고있는 NSBundle을 받아온다
NSBundle
*bundle = [NSBundle mainBundle]
// 객체가 생성이 안될 경우도 있므로 체크, 그리고 번들되지 않은 애플리케이션을 사용하더라도 (올바르지 않은) NSBundle가 불러와질 수 있다.
if (bundle) 
{
    // 기본 폴더에서 Movie.m4v에 대한 위치정보를 설정한다. 
    NSString *moviePath = [bundle pathForResource:@"Movie" ofType:@"m4v"];
    if (moviePath)
    {
        // 만약 위의 경로를 받아오는데 문제가 없다면 이 경로를 filURL으로 변경하여 받아온다.
        self.movieURL = [NSURL fileURLWithPath:moviePath];
    }
}
 
MyStreamingMovieViewController.m : 63
// movieURLTextField의 값을 받아와 NSURL 형태로 저장한다..
NSURL *movieURL = [NSURL URLWithString:self.movieURLTextField.text];
if (movieURL)
{
    // 위에서 경로를 받아오는데 성공하면 URL형식에 적합한지 확인한다.

    if ([movieURL scheme])  
    {
        // 어픞리케이션의 델리게이트를 불러온 후 그 델리게이트의 initAndPlayMovie를 얻어온 주소를 인자로 하여 호출한다
        MoviePlayerAppDelegate *appDelegate = (MoviePlayerAppDelegate *)[[UIApplication sharedApplication] delegate];
        [appDelegate initAndPlayMovie:movieURL];
    }
}
 

동영상의 주소를 얻었으면 바로 위 코드에서 봤듯이 initAndPlayMovie: 에 movieURL을 인자로 하여 호출해 주어 동영상을 재생한다. 하지만 문제가 있는게 이 코드가 오래된 iOS를 기반으로 하기 떄문에 현재 바뀐 SDK에서 지원을 해주지 못한다는 점이다. 우선 소스코드 흐름상 이를 인용하여 계속 진행 해 본 후 새로운 버전의 iOS에 맞춘 소스코드를 한번 더 올릴것이다. 우선 아래


2. 동영상 재생(before iOS 3.2)
MoviePlayerAppDelegate.m : 95
// MPMoviePlayerController를 movieURL으로 초기화 한다
MPMoviePlayerController *mp = [[MPMoviePlayerController alloc] initWithContentURL:movieURL];
if (mp)
{
    // 만약 MPMoviePlayerController가 초기화 되면전역으로 등록되어있는 moviePlayer에 mp 변수를 지정한다.
    self.moviePlayer = mp;
    // 위에서 reference count가 증가했기 때문에 relese를 호출하여 감소시켜준다. .
    [mp release];
    // 번들 세팅을 적용해 주기 위하여 setMoviePlayerUserSettings 메소드를 호출하여 적용시킨다(생략)
    [self setMoviePlayerUserSettings];
    // 동영상을 재생한다
    [self.moviePlayer play];
}


위의 코드를 실행시키자면 높은 버전의 sdk에서는 지원하지 않을것이다. 이를 수정하는 방법을 간략하게 적으면 다음과 같다.

MPMoviePlayerViewController *playerView = [[MPMoviePlayerViewController alloc] initWithContentURL:movieURL];
// MPMoviePlayerController* mp= [playerView moviePlayer]; 
[self presentMoviePlayerViewControllerAnimated:playerView];
[playerView release];

그리고 참고로 동영상 플레이가 종료되었을때를 위한 이벤트 핸들러는 다음과 같이 추가한다.
MoviePlayerAppDelegate.m : 81
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(moviePlayBackDidFinish:) name:MPMoviePlayerPlaybackDidFinishNotification object:nil];

댓글

Holic Spirit :: Tistory Edition

design by tokiidesu. powerd by kakao.