Notice
Recent Posts
Recent Comments
Link
관리 메뉴

김종권의 iOS 앱 개발 알아가기

[iOS - swift] 2. AVFoundation 개념 - AVPlayer, AVPlayerItem 본문

iOS 기본 (swift)

[iOS - swift] 2. AVFoundation 개념 - AVPlayer, AVPlayerItem

jake-kim 2022. 4. 2. 22:26

1. AVFoundation 개념 - 구조, AVAsset, AVKit

2. AVFoundation 개념 - AVPlayer, AVPlayerItem

3. AVFoundation 개념 - AVPlayer 오디오 재생, 일시정지, 재생구간 이동 구현 (play, pause, seek)

4. AVFoundation 개념 - AVPlayer, AVPlayerLayer로 동영상 재생 방법

5. AVFoundation 개념 - AVAudioSession 개념 (오디오 활성화, 입출력 변경, 잠금화면 재생, 재생 중 전화가 온 경우 처리)

AVPlayer 개념

  • AVPlayer: player 작업에 관한 인터페이스를 제공하는 객체
  • 실시간 스트리밍 파일을 재생할때 사용 (mp3 url만 가지고, 다운로드 받지 않고 재생하는 경우)
    • 로컬에서 다운받아서 재생하고 싶은 경우에는 AVAudioPlayer 사용 (관련 개념 참고)

https://developer.apple.com/documentation/avfoundation/avplayer

  • AVPlayer 객체는 AVAsset의 전반적인 *playback을 조절하는데 사용
    * playback: 녹음, 녹화, 재생
  • AVPlayer객체가 AVPlayerItem을 이용하고, AVPlayerItem이 AVAsset을 사용하는 구조

  • AVPlayer는 한 번에 하나의 미디어 데이터만 재생할 수 있으므로, 여러 미디어 데이터를 순서대로 재생하고 싶은 경우에는 AVQueuePlayer 클래스 사용

AVPlayerItem 개념

  • 시간과 상태 정보를 가지고 있는 객체
    • AVAsset: 정적인 상태 관리 (총 재생 시간, 생성 날짜)
    • AVPlayerItem: 동적인 상태 관리 (presentation state, 현재 시간, 현재까지 재생된 시간 등등)

https://developer.apple.com/documentation/avfoundation/avplayeritem

  • AVPlayerItemTrack 객체
    • AVPlayerItem에도 AVAsset과 같이 여러개의 Track들로 관리되어서 이 track을 이용하여 오디오, 비디오 편집이 가능

https://developer.apple.com/library/archive/documentation/AudioVideo/Conceptual/AVFoundationPG/Articles/02_Playback.html#//apple_ref/doc/uid/TP40010188-CH3-SW1

  • ex) AVPlayerItem안에 있는 AVPlayerItemTrack 객체를 이용해 track들을 조정하여 영상 미디어 데이터에서 video 트랙만 활성화 시키고 audio 트랙은 비활성화시키는 등의 편집이 가능

https://developer.apple.com/library/archive/documentation/AudioVideo/Conceptual/AVFoundationPG/Articles/02_Playback.html#//apple_ref/doc/uid/TP40010188-CH3-SW1

AVPlayer 상태 처리 방법 - 옵저빙

  • AVPlayer와 AVPlayerItem은 상태가 지속적으로 변하므로, 이 상태에 대한 값을 처리하기위해서 KVO를 통해 상태값을 구독하여 사용

ex) 

// VideoCropViewController.swift

extension AVPlayerItem {
    public class let timeJumpedNotification: NSNotification.Name
    public class let recommendedTimeOffsetFromLiveDidChangeNotification: NSNotification.Name // the value of recommendedTimeOffsetFromLive has changed
    public class let mediaSelectionDidChangeNotification: NSNotification.Name // a media selection group changed its selected option
    
    // notification userInfo key                                                                    type
    public class let timeJumpedOriginatingParticipantKey: String
    
    public enum Status : Int, @unchecked Sendable {    
        case unknown = 0
        case readyToPlay = 1
        case failed = 2
    }
}
extension NSNotification.Name {

    @available(iOS 4.0, *)
    public static let AVPlayerItemDidPlayToEndTime: NSNotification.Name

    @available(iOS 4.3, *)
    public static let AVPlayerItemFailedToPlayToEndTime: NSNotification.Name

    @available(iOS 6.0, *)
    public static let AVPlayerItemPlaybackStalled: NSNotification.Name

    @available(iOS 6.0, *)
    public static let AVPlayerItemNewAccessLogEntry: NSNotification.Name

    @available(iOS 6.0, *)
    public static let AVPlayerItemNewErrorLogEntry: NSNotification.Name
}

비디오 재생 방법

  • AVPlayer와 AVPlayerItem은 비시각적인 객체이므로 화면에 영상 출력 불가
    • AVKit을 통해 비디오 재생: 애플에서 미리 정의한 표준적인 비디오 재생 UI 제공 (iOS, tvOS에서는 AVPlayerViewController를 사용하고, macOS에서는 AVPlayerView)
    • AVPlayerLayer를 통해 비디오 재생: AVFoundation에서 제공하고 CALayer를 상속받은 AVPlayerLayer (오직 화면 출력 기능만을 제공하기 때문에 미디어 재생에 관한 기능은 모두 직접 구현)
  • 보통 디자인 커스터마이징을 사용하기 때문에 AVKit보다는 AVPlayerLayer를 사용

AVPlayer, AVPlayerItem에서 사용하는 타입

  • AVFoundation에서는 Core Media 프레임워크의 CMTime 타입을 사용
    • 부동소수점의 부정확성으로 인해 디테일한 시간의 작업이 필요한 미디어 재생에서의 문제점을 막기위해 사용

* 참고

https://developer.apple.com/library/archive/documentation/AudioVideo/Conceptual/AVFoundationPG/Articles/02_Playback.html#//apple_ref/doc/uid/TP40010188-CH3-SW1

https://developer.apple.com/documentation/avfoundation/avplayer

https://developer.apple.com/library/archive/documentation/AudioVideo/Conceptual/AVFoundationPG/Articles/00_Introduction.html#//apple_ref/doc/uid/TP40010188-CH1-SW3

Comments