본문
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
// movieURLTextField의 값을 받아와 NSURL 형태로 저장한다..
동영상의 주소를 얻었으면 바로 위 코드에서 봤듯이 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];
로컬 동영상은 이 메소드 내의 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 : 63NSBundle *bundle = [NSBundle mainBundle];
// 객체가 생성이 안될 경우도 있므로 체크, 그리고 번들되지 않은 애플리케이션을 사용하더라도 (올바르지 않은) NSBundle가 불러와질 수 있다.
if (bundle)
{
// 기본 폴더에서 Movie.m4v에 대한 위치정보를 설정한다.
NSString *moviePath = [bundle pathForResource:@"Movie" ofType:@"m4v"];
if (moviePath)
{
// 만약 위의 경로를 받아오는데 문제가 없다면 이 경로를 filURL으로 변경하여 받아온다.
self.movieURL = [NSURL fileURLWithPath:moviePath];
}
}
// 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];
}
}
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];
댓글