
👋 들어가기 전
요즘 개발할 때 나의 가장 큰 다른점은 앞에 NS, 또는 Core 같이 C가 붙어있는 내용,
더 나아가 objc 부분을 해석하는 것을 생각보다 즐긴다는 것이다.
이전에 나는 위와 같은 코드가 있으면, 지레 겁을 먹고
"아 이제 애플에서 swift로 바꿔줬거나, 굳이 알지 않아도 사용할 수 잇게 만들었겠지"
라며 그 자리를 피했다.

요즘도 겁을 안 먹는 것은 아니다.
다만 포기를 하더라도, 내가 파악할 수 있는 부분까지 내려가보고
아 이부분은 이런느낌으로 사용하게 만들었구나 또는 아 이런식으로 동작을 하는구나
라고 파악은 하고 지나간다는 것이다.
서두가 길어졌지만 간단히 정리하면 swift보다 깊숙히 들어간다는 것은
메타데이터를 알고 싶다는 의미와 비슷하다가 생각한다.
요즘은 모르는 코드를 보면 내부가 어떤 느낌일지 너무 궁금하다.
✊AVAssetTrack
✨ 정의
미디어 데이터 트랙(비디오, 오디어, 자막)
🌲 AVAsset과의 관계
이전 부스트캠프 수료 프로젝트에서 스트리밍 서비스를 만들면서
AVFoundation 프레임워크를 처음 학습했는데, 이 때 까먹고 넘어간 내용이 있다.
바로 AVAssetTrack이 였다.
왜 넘어가도 크게 문제가 안됐냐면, 단순 영상재생을 위해 굳이 몰라도 되는 놈이였다.
하지만 이놈이 궁금해졌다.
정리하면, AVAsset은 하나 이상의 AVAssetTrack을 담고 있는 하나의 컨테이너 객체이다.
즉 우리가 쓰는 플레이어는 비디오 파일을 직접 재생하지 않고
AVAsset이란 메타데이터를 담고 있는 컨테이너에 접근해서 재생하는 것이다.
여기서 실제 재생에 사용되는 놈이 AVAsset안에 포함되어있는 다양한 AVAssetTrack임!
아래 사진을 참고하면 쉽게 이해된다.

❓어디에 쓸까
대표적인 파라미터만 살펴보자.
더 자세한거는 공식문서를 살펴보자.
정말 어마어마 하게 많은 정보를 제공해준다.
1. 미디어 타입

현재 Track이 어떤 미디어 타입인지 알 수 있다.
@available(iOS 4.0, *)
public static let video: AVMediaType
@available(iOS 4.0, *)
public static let audio: AVMediaType
@available(iOS 4.0, *)
public static let text: AVMediaType
@available(iOS 4.0, *)
public static let closedCaption: AVMediaType
@available(iOS 4.0, *)
public static let subtitle: AVMediaType
@available(iOS 4.0, *)
public static let timecode: AVMediaType
@available(iOS 6.0, *)
public static let metadata: AVMediaType
@available(iOS 4.0, *)
public static let muxed: AVMediaType
@available(iOS 10.0, *)
public static let haptic: AVMediaType
2. formatDescriptions

아래에서 설명할 객체인데 AVAssetTrack이 CMFormatDescription 타입을 갖고 있다는 것을
알아두자.
☝️CMFormatDescription
✨ 정의
CoreMedia 프레임워크에 존재하는 타입으로 미디어 포맷 정보를 갖고있는 객체
🎯 종류
원하는 미디어 타입에 따라 Description 객체가 존재한다.


관계는 typealias 형태이므로 손쉽게 사용할 수 있다.
❓어디에 쓸까
객체 단독으로 쓰는 경우도 있지만, 대부분 CMFormatDescriotionGet~
이라는 Prefix가 있는 함수안에 매개변수로 제공하여 원하는 데이터를 뽑아낸다.

예를 들어 내가 비디오의 코덱 정보를 알고 싶다 ??
그렇다면 다음과 같이 Description 객체를 얻은 후 데이터를 얻는다.
let formatDescription = formatDesc as! CMFormatDescription
let codecType = CMFormatDescriptionGetMediaSubType(formatDescription)
print(codecType)
// OUTPUT: 1635148593
어라 근데 우리가 원하는 형태의 코덱 정보가 아니다.
public func CMFormatDescriptionGetMediaSubType(_ desc: CMFormatDescription) -> FourCharCode
FourCharCode라는 타입으로 받네 ??
바로 다음 챕터에서 알아보자.
4️⃣ FourCharCode
정의
Xcode 상으로 살펴보면 ForCharCode는 실질적으로 UInt32 타입이고
용도는 1 byte(32bit) character를 32-bit UInt32 타입으로 만든 것
여기서 포함되어있는 위치를 보면 Darwin인 것을 보면
커널 레벨에서 사용하기 위해 만든 내용으로 유추할 수 있다.
실제 공식문서 위치는 Kernel/ Kernel Data Types / FourCharCode에 있다.

용도
커널 레벨로 내려갔다는 것은 밑으로 깊숙히 내려갔다는 뜻이고
메타데이터에 가까워 졌다는 뜻
위에서 codecType에서 나온 FourCharCode를 우리가 알아볼 수 있게 문자열로 바꿔보자.
func fourCharCodeToString(_ code: FourCharCode) -> String {
let bytes = [
UInt8((code >> 24) & 0xff),
UInt8((code >> 16) & 0xff),
UInt8((code >> 8) & 0xff),
UInt8(code & 0xff)
]
return String(bytes: bytes, encoding: .ascii) ?? ""
}
let str = fourCharCodeToString(1635148593)
print(str) // "avc1"
비트하나씩 옮겨 문자열로 바꿔보니 avc1(H264)라는 코덱 정보를 얻어 냈다.
즉 FourCharCode는 메타데이터로 많이 이용되고 있다는 뜻
👍 CMVideoCodecType
딱 하나만 더 알아보자.
코덱 데이터를 저렇게 꼭 문자열로 바꿔야 우리가 판별할 수 있을까??
애플은 그렇게 무심하지 않다.
이렇게 FourCharCode를 typealias를 통해 쉽게 쓸 수 있다.


아마 다양한 typealias로 FourCharCode가 많이 이용될 듯 하다.
😀 소감 및 마무리
Core 부분까지 내려가서 파보니 시간 가는지 모르고 정리했다.
이번에는 그나마 스텝이 너무 깊지 않았는데
다음에 objc 코드까지 가면 시간이 얼마나 걸릴지 긴장반, 설렘반이다.
출처
https://developer.apple.com/documentation/avfoundation/avassettrack
AVAssetTrack | Apple Developer Documentation
An object that models a track of media that an asset contains.
developer.apple.com
https://developer.apple.com/documentation/coremedia/cmformatdescription
CMFormatDescription | Apple Developer Documentation
An object that describes a media format descriptor.
developer.apple.com
https://developer.apple.com/documentation/kernel/fourcharcode
FourCharCode | Apple Developer Documentation
There's never been a better time to develop for Apple platforms.
developer.apple.com
https://developer.apple.com/documentation/coremedia/cmvideocodectype
CMVideoCodecType | Apple Developer Documentation
A video codec type.
developer.apple.com
'iOS > Framework' 카테고리의 다른 글
소셜 로그인 구현하기 (1) | 2025.01.03 |
---|---|
AVFoundation (4) [AVAudioSession] (3) | 2024.10.22 |
AVFoundation (3) [AVPlayerLayer] (1) | 2024.10.22 |
AVFoundation (2) [AVPlayer, AVPlayerItem] (0) | 2024.10.21 |
AVKit (4) | 2024.10.21 |