Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- uitableview
- 클린 코드
- HIG
- swiftUI
- swift documentation
- map
- 리펙터링
- Observable
- uiscrollview
- collectionview
- combine
- Refactoring
- 스위프트
- Human interface guide
- Protocol
- MVVM
- SWIFT
- clean architecture
- RxCocoa
- UICollectionView
- UITextView
- Xcode
- 리팩토링
- ribs
- 리펙토링
- 애니메이션
- Clean Code
- ios
- tableView
- rxswift
Archives
- Today
- Total
김종권의 iOS 앱 개발 알아가기
[iOS - swift] 2. AVFoundation 개념 - AVPlayer, AVPlayerItem 본문
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 사용 (관련 개념 참고)
- AVPlayer 객체는 AVAsset의 전반적인 *playback을 조절하는데 사용
* playback: 녹음, 녹화, 재생 - AVPlayer객체가 AVPlayerItem을 이용하고, AVPlayerItem이 AVAsset을 사용하는 구조
- AVPlayer는 한 번에 하나의 미디어 데이터만 재생할 수 있으므로, 여러 미디어 데이터를 순서대로 재생하고 싶은 경우에는 AVQueuePlayer 클래스 사용
AVPlayerItem 개념
- 시간과 상태 정보를 가지고 있는 객체
- AVAsset: 정적인 상태 관리 (총 재생 시간, 생성 날짜)
- AVPlayerItem: 동적인 상태 관리 (presentation state, 현재 시간, 현재까지 재생된 시간 등등)
- AVPlayerItemTrack 객체
- AVPlayerItem에도 AVAsset과 같이 여러개의 Track들로 관리되어서 이 track을 이용하여 오디오, 비디오 편집이 가능
- ex) AVPlayerItem안에 있는 AVPlayerItemTrack 객체를 이용해 track들을 조정하여 영상 미디어 데이터에서 video 트랙만 활성화 시키고 audio 트랙은 비활성화시키는 등의 편집이 가능
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/documentation/avfoundation/avplayer
'iOS 기본 (swift)' 카테고리의 다른 글
Comments