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를 앞으로 가져온다.

위와같이 작성하였더니 잘된다.
며칠간의 삽질 내용이었습니다.

댓글

이 블로그의 인기 게시물

한글 2010 에서 Ctrl + F10 누르면 특수문자 안뜰 때

아이폰에서 RFID 사용하는 방법

맥 화면이 안나올때 조치방법