[회고] 신입 iOS 개발자가 되기까지 feat. 카카오 자세히보기

🍎 Apple/Swift

[Swift] AVFoundation 기초

inu 2023. 7. 15. 22:50
반응형

최근에 AVFoundation을 알아야 할 일이 있어서 공부를 좀 했습니다.

본 포스트는 애플 공식 문서의 의역을 대다수 포함합니다.


AVFoundation

  • 시청각 asset들로 작업하고, 장치 카메라를 제어하고, 오디오를 처리하고, 시스템 오디오 상호 작용을 구성할 수 있습니다.
  • AVFoundation은 Apple 플랫폼에서 미디어를 검사, 재생, 캡처 및 처리는 등 광범위한 작업을 포괄하는 몇 가지 주요 기술 영역을 포괄하고 있습니다.

  • UIKit 너머의 Core 프레임워크와 맞닿아 있는 프레임워크입니다.

AVAsset

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

  • 시간이 지정된 시청각 미디어를 모델링하는 객체
  • 해당 객체는 파일 기반의 미디어 데이터를 모델링하며, HLS(HTTP Live Streaming)을 사용해 스트리밍된 데이터도 마찬가지로 모델링합니다.
    • cf. HLS : HLS는 HTTP Live Streaming의 약자입니다. 이는 Apple에서 개발한 비디오 스트리밍 프로토콜 중 하나입니다. 이 프로토콜은 인터넷을 통해 비디오를 제공하는 데 사용됩니다. HLS는 비디오를 작은 조각으로 나누고, 각 조각을 일련의 HTTP 요청으로 전송합니다. 이렇게 하면 비디오를 제공하는 서버의 부하를 분산시킬 수 있으며, 네트워크 조건에 따라 비디오 품질을 조절할 수 있습니다. 또한, 이 프로토콜은 비디오를 라이브로 스트리밍하거나, 사전 녹화된 비디오를 스트리밍하는 데 모두 사용할 수 있습니다. HLS는 Apple에서 개발되었지만, 지금은 인터넷에서 가장 인기 있는 비디오 스트리밍 프로토콜 중 하나입니다.

  • AVAsset은 하나 이상의 AVAssetTrack 인스턴스를 위한 컨테이너 객체입니다.
    • AVAssetTrack : 에셋에 포함된 미디어 트랙을 모델링하는 객체
  • 가장 일반적으로 사용되는 트랙 유형은 오디오 및 비디오이지만 Asset에는 선택 캡션, 자막 및 시간 제한 메타데이터와 같은 보조 트랙도 포함될 수 있습니다.

AVPlayer, AVPlayerIteam

AVPlayer

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

  • 플레이어의 이동 동작을 제어하는 인터페이스를 제공하는 객체
  • Player는 미디어 에셋의 재생 및 시간을 관리하는 컨트롤러 객체입니다.
  • AVPlayer 인스턴스를 사용하여 로컬 및 원격의 파일 기반 미디어 및 HTTP 라이브 스트리밍을 사용하여 제공되는 시청각 미디어를 재생할 수 있습니다.
  • Player를 사용하여 한 번에 하나의 미디어 에셋을 재생합니다.
  • Player 인스턴스를 재사용하여 replaceCurrentItem(with:)메서드를 사용하여 추가 미디어 자산을 재생할 수 있지만, 한 번에 하나의 미디어 자산만 재생이 가능합니다.
  • 또한 프레임워크는 순차적으로 재생되는 미디어 자산의 대기열을 생성하고 관리하는 데 사용하는 AVQueuePlayer라는 클래스의 서브클래스를 제공합니다.
  • AVAsset은 미디어의 시간 및 생성 날짜같은 정적 데이터만 모델링되어 있기 때문에, 그 자체로는 AVPlayer의 재생 대상이 되기에 적합하지 않습니다. (재생 시간과 같은 값은 동적으로 변동되기 때문)
  • 에셋을 재생하려면 AVPlayerItem에서 찾을 수 있는 동적 부분이 필요합니다.
  • AVPlayer는 상태가 지속적으로 변경되는 동적 객체입니다. 상태 변화 관찰을 위해서는 주로 KVO가 사용됩니다.
  • 다만 AVPlayerAVPlayerItem 둘 모두 비시각적 객체입니다. 따라서 그들만으로는 콘텐츠를 화면에 표시할 수 없습니다. 화면에 콘텐츠를 표시하기 위해서는 주로 2가지 방법이 사용됩니다.
    • AVKit 프레임워크의 AVPlayerViewController 클래스를 사용. 컨트롤 기능과 함께 최적화된 재생 환경을 제공함.
    • AVFoundation에 존재하는 AVPlayerLaye를 사용. AVPlayerViewController와는 다르게 재생환경을 따로 제공하지는 않음. 그런 부분은 사용자의 몫.

AVPlayerItem

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

  • 에셋이 재생 상태일 때 해당 에셋의 타이밍과 프레젠테이션 상태를 모델링하는 객체
  • player item은 재생할 미디어를 나타내는 AVAsset 객체에 대한 참조를 보유합니다.
  • 재생을 위해 대기열에 넣기 전에 에셋을 검사해야 하는 경우, load(_:)메서드를 호출하여 하나 이상의 프로퍼티 값을 검색합니다.
  • 또는 player item에 필요한 프로퍼티를 init(asset:automaticallyLoadedAssetKeys:) 이니셜라이저에 전달하여 자동으로 로드하도록 지시할 수도 있습니다.

  • 즉, AVPlayer 객체가 AVPlayerItem을 사용하고, AVPlayerItem이 AVAsset을 사용하는 구조입니다.

AVPlayerLayer

  • Player 객체의 시각적 콘텐츠를 표시하는 객체
  • CALayer의 서브클래스
// Player를 기반으로 생성됩니다. 
let playerLayer = AVPlayerLayer(player: player)

// 비디오를 표시할 위치와 크기, 표시방법을 선택합니다.
playerLayer.frame = CGRect(x: 0, y: 0, width: view.bounds.width, height: view.bounds.height)
playerLayer.videoGravity = .resizeAspectFill

// 생성된 layer를 원하는 뷰계층구조에 추가하는 것으로 비디오를 표시할 수 있습니다.
view.layer.addSublayer(playerLayer)

cf. CALayer

  • 이미지 기반 콘텐츠를 관리하고 해당 콘텐츠에 애니메이션을 적용할 수 있는 객체
  • CoreAnimation 프레임워크에 소속된 객체
  • 레이어는 종종 View를 위한 백그라운드 저장소를 제공하는 데 사용되지만 View 없이 콘텐츠를 표시하는 데 사용할 수도 있습니다.
  • 레이어의 주요 역할은 제공하는 시각적 콘텐츠를 관리하는 것이지만 레이어 자체에는 배경색, 테두리, 그림자 등 설정할 수 있는 시각적 속성이 있습니다.
  • 레이어는 시각적 콘텐츠를 관리하는 것 외에도 해당 콘텐츠를 화면에 표시하는 데 사용되는 콘텐츠의 지오메트리(예: 위치, 크기 및 변형)에 대한 정보도 유지 관리합니다.
  • 레이어의 속성을 수정하는 것은 레이어의 콘텐츠 또는 지오메트리에서 애니메이션을 시작하는 방법입니다.

AVAudioSession

https://developer.apple.com/documentation/avfaudio/avaudiosession

  • 앱에서 오디오를 사용하는 방법을 시스템에 전달하는 객체
  • 오디오 세션은 앱과 운영 체제, 그리고 기본 오디오 하드웨어 사이의 중개자 역할을 합니다.
  • 오디오 세션을 사용하면 오디오 하드웨어와의 특정 동작이나 필요한 상호 작용을 자세히 설명하지 않고 앱 오디오의 일반적인 특성을 운영 체제에 전달할 수 있습니다.
  • 세부 사항의 관리를 오디오 세션에 위임하면 운영 체제가 사용자의 오디오 경험을 가장 잘 관리할 수 있습니다.
  • 기본 오디오 세션은 유용한 동작을 제공하지만 일반적으로 미디어 앱에 필요한 구체적 오디오 동작을 제공하지는 않습니다. 기본 동작을 변경하려면 앱의 오디오 세션 카테고리를 구성합니다.
  • 사용할 수 있는 카테고리는 6가지가 있지만, playback은 재생 앱이 가장 일반적으로 사용하는 카테고리입니다.
  • 이 카테고리는 오디오 재생이 앱의 핵심 기능임을 나타냅니다. 이 카테고리를 지정하면 벨소리/무음 스위치가 무음 모드로 설정된 상태에서 앱의 오디오가 계속 재생됩니다(iOS만 해당).
  • 또한 Audio, AirPlay 및 PIP 백그라운드 모드를 사용하는 경우 백그라운드 오디오를 재생할 수도 있습니다. (참고 : https://developer.apple.com/documentation/avfoundation/media_playback/creating_a_basic_video_player_ios_and_tvos/enabling_background_audio)
  • AVAudioSession은 싱글톤으로 이루어져 있으며, 보통은 아래와 같이 앱 실행시에 구성하는 경우가 많습니다.
func application(_ application: UIApplication,
                 didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

    // 싱글톤 인스턴스 가져오기
    let audioSession = AVAudioSession.sharedInstance()
    do {
        // 카테고리, 모드, 옵션 설정하기
        try audioSession.setCategory(.playback, mode: .moviePlayback, options: [])
    } catch {
        print("Failed to set audio session category.")
    }
    return true
}
  • 오디오 세션은 setActive(:) 또는 setActive(:options:) 메서드를 사용하여 세션을 활성화할 때 이 구성을 사용합니다.
  • 언제든지 활성화는 가능하지만, 되도록 앱에서 오디오 재생이 이루어질 때까지 활성화를 미루는 것이 좋습니다. 필요하지 않을 때 활성화를 수행하면 다른 백그라운드 오디오를 조기에 중단할 위험이 있기 때문입니다.

AVAudioSession.Category

  • 오디오 동작에 관해 정의하는 역할을 합니다.
  • Session의 Category의 종류는 아래와 같습니다.

  • playback : 앱의 성공적 사용성과 직결된 음악 혹은 음성을 재생하는 카테고리
    • 이 category를 사용한 앱의 오디오는 스크린이 잠겼을 때나 무음 스위치가 켜졌을 때에도 계속됩니다. 앱이 백그라운드로 전환 (예를 들어, 화면이 잠길 때)된 후에도 오디오를 계속해서 재생하기 위해서는 정보 속성 리스트(plist)의 UIBackgroundModes 키에 audio 값을 추가하세요.
    • 기본적으로 이 category를 사용한다는 것은 앱의 오디오가 믹스될 수 없음을 의미하며 해당 category의 오디오 세션을 활성화 시킬 경우 믹스될 수 없는 다른 오디오 세션을 중단시킬 것입니다. 이 category가 믹스될 수 있게 하려면 mixWithOthers 옵션을 사용하세요.
반응형

'🍎 Apple > Swift' 카테고리의 다른 글

[Swfit] resolvedColor(with:) / UITraitCollection.current  (0) 2023.10.27
[Swift] Attributes  (2) 2023.07.29
[Swift][문서의역] Macro  (4) 2023.07.15
[Swift] Mirror  (0) 2023.05.18
[Swift] autoreleasepool  (2) 2022.05.27