AVPlayer를 활용한 자체 제작 미디어 플레이어
나만의 미디어플레이어를 제작하는데
overlayView를 생성하고 그 위에 버튼과 슬레이드를 배치하고자 하였다.
PlayerLayer를 지정하고 이를 overlayView의 레이어에 설정을 하니
재생화면이 나오지 않는 현상이 발생되었다.
샘플코드도 이와 마찬가지였다.
먼저 overlayView 에 도구로 사용한 버튼과 슬레이드 등을 배치한다.
그 다음 OverlayView의 배경색을 ClearColor 로 변경한다.
- (void)viewDidLoad
{
[super viewDidLoad];
// 이전 뷰에서 선택한 파일을 가져온다.
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSURL *selectedURL = [defaults URLForKey:@"selectedURL"];
NSLog(@"selectedURL: %@", selectedURL);
// 재생에 필요한 준비를 한다.
asset = [AVURLAsset URLAssetWithURL:selectedURL options:nil];
playerItem = [AVPlayerItem playerItemWithAsset:asset];
player = [AVPlayer playerWithPlayerItem:playerItem];
// 재생표시 설정
float durationSeconds = asset.duration.value / asset.duration.timescale;
[sldPlayBar setMaximumValue:durationSeconds];
sldPlayBar.value = 0;
// 재생 파일이 있는지 여부
NSArray *visualTracks = [asset tracksWithMediaCharacteristic:AVMediaCharacteristicVisual];
if ((!visualTracks)||([visualTracks count] == 0)) {
NSLog(@"not movie file");
} else {
// 레이어 설정
UIView *preView = [self videoPreviewWithFrame:[self.view frame]];
[self.view addSubview:preView];
// 오버레이 앞으로 가져오기
[self.view bringSubviewToFront:overlayView];
// 재생이 완료되면 수신할 이벤트 정의
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(playerItemDidReachEnd:) name:AVPlayerItemDidPlayToEndTimeNotification object:playerItem];
// 재생상태 표시
sliderTimer = [NSTimer scheduledTimerWithTimeInterval:0.2 target:self selector:@selector(updateSlider:) userInfo:nil repeats:YES];
// 동영상 재생
[player play];
}
}
뷰가 시작할 때 메스드이다.
위에서 videoPreviewWithFrame 이 메소드가 핵심이다.
- (UIView *)videoPreviewWithFrame:(CGRect)frame
{
// 레이서 설정
playerLayer = [AVPlayerLayer playerLayerWithPlayer:player];
// 크기 조정
playerLayer.frame = frame;
// 크기에 동영상 맞추기
playerLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
UIView *tempView = [[UIView alloc] init];
[tempView.layer addSublayer:playerLayer];
tempView.frame = frame;
return tempView;
}
메소드의 내용은 별도의 TempView를 만들고 이를 SuperView 하위에 붙이고
플레이를 한다.
그 다음에 overlayView를 앞으로 가져온다.
위와같이 작성하였더니 잘된다.
며칠간의 삽질 내용이었습니다.
overlayView를 생성하고 그 위에 버튼과 슬레이드를 배치하고자 하였다.
PlayerLayer를 지정하고 이를 overlayView의 레이어에 설정을 하니
재생화면이 나오지 않는 현상이 발생되었다.
샘플코드도 이와 마찬가지였다.
먼저 overlayView 에 도구로 사용한 버튼과 슬레이드 등을 배치한다.
그 다음 OverlayView의 배경색을 ClearColor 로 변경한다.
- (void)viewDidLoad
{
[super viewDidLoad];
// 이전 뷰에서 선택한 파일을 가져온다.
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSURL *selectedURL = [defaults URLForKey:@"selectedURL"];
NSLog(@"selectedURL: %@", selectedURL);
// 재생에 필요한 준비를 한다.
asset = [AVURLAsset URLAssetWithURL:selectedURL options:nil];
playerItem = [AVPlayerItem playerItemWithAsset:asset];
player = [AVPlayer playerWithPlayerItem:playerItem];
// 재생표시 설정
float durationSeconds = asset.duration.value / asset.duration.timescale;
[sldPlayBar setMaximumValue:durationSeconds];
sldPlayBar.value = 0;
// 재생 파일이 있는지 여부
NSArray *visualTracks = [asset tracksWithMediaCharacteristic:AVMediaCharacteristicVisual];
if ((!visualTracks)||([visualTracks count] == 0)) {
NSLog(@"not movie file");
} else {
// 레이어 설정
UIView *preView = [self videoPreviewWithFrame:[self.view frame]];
[self.view addSubview:preView];
// 오버레이 앞으로 가져오기
[self.view bringSubviewToFront:overlayView];
// 재생이 완료되면 수신할 이벤트 정의
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(playerItemDidReachEnd:) name:AVPlayerItemDidPlayToEndTimeNotification object:playerItem];
// 재생상태 표시
sliderTimer = [NSTimer scheduledTimerWithTimeInterval:0.2 target:self selector:@selector(updateSlider:) userInfo:nil repeats:YES];
// 동영상 재생
[player play];
}
}
뷰가 시작할 때 메스드이다.
위에서 videoPreviewWithFrame 이 메소드가 핵심이다.
- (UIView *)videoPreviewWithFrame:(CGRect)frame
{
// 레이서 설정
playerLayer = [AVPlayerLayer playerLayerWithPlayer:player];
// 크기 조정
playerLayer.frame = frame;
// 크기에 동영상 맞추기
playerLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
UIView *tempView = [[UIView alloc] init];
[tempView.layer addSublayer:playerLayer];
tempView.frame = frame;
return tempView;
}
메소드의 내용은 별도의 TempView를 만들고 이를 SuperView 하위에 붙이고
플레이를 한다.
그 다음에 overlayView를 앞으로 가져온다.
위와같이 작성하였더니 잘된다.
며칠간의 삽질 내용이었습니다.
댓글
댓글 쓰기