스트리밍은 대부분의 브라우저와
Developer 앱에서 사용할 수 있습니다.
-
AVFoundation의 미디어 성능 지표 살펴보기
새로운 미디어 성능 API를 활용하여 사용자 경험을 모니터링 및 분석하고 향상하는 방법을 알아보세요. 여러 AVMetricEvents를 사용하여 HLS 애셋의 AVplayer 성능을 모니터링하는 방법, 이러한 지표를 활용하여 플레이어 성능 문제를 파악하고 분류하는 방법 등을 소개합니다.
챕터
- 0:00 - Introduction
- 1:33 - What are events?
- 5:36 - Subscribing to events
리소스
-
다운로드
안녕하세요 저는 AVFoundation HLS 엔지니어인 Nishant입니다 AVFoundation의 새 기능을 소개하게 되어 기쁩니다 이 세션에서는 미디어 성능 지표를 수집하는 새 방법을 설명할게요 이러한 지표는 iOS 18에서 이벤트로 나타납니다 다양한 유형의 이벤트를 먼저 설명하고 앱에서 이러한 이벤트를 구독하는 방법을 알려 드릴게요 그 전에 미디어 재생과 관련된 몇 가지 흔한 문제를 살펴보죠 하나는 미디어 재생이 시작될 때 너무 오래 걸린다는 점이고 다른 하나는 재생이 중간에 멈춘다는 것이죠
현장에서 이러한 문제를 분류하는 것은 어렵지만 클라이언트 측 지표에 액세스하면 수월해집니다 이와 더불어 클라이언트 측 지표는 AVFoundation API의 작동에 대한 정보를 제공합니다 이는 성능을 이해하고 개선하는 데 유용합니다
이전에 미디어 재생에 대해서는 액세스 로그, 오류 로그, 다양한 AVPlayer 알림을 통해 일부 클라이언트 측 지표를 얻을 수 있었습니다 iOS 18에서는 HLS 스트리밍 애셋의 경우 현재 제공되는 지표가 개선되고 더 많은 데이터 포인트가 제공됩니다 이제 몇 가지 새 지표를 살펴보겠습니다 미디어 재생 문제가 있는 재생 세션을 통해 알아보죠 이것은 15분 길이의 동영상 재생 타임라인입니다 첫 2초를 확대하여 시작하는 동안 어떤 작업이 실행되는지 보죠 먼저 AVPlayer가 다변형 플레이리스트를 가져오기 시작합니다 이는 타임라인에 이벤트로 표시됩니다
그 후 AVPlayer는 동영상 오디오 및 자막 플레이리스트를 가져옵니다 마찬가지로 타임라인에 이벤트로 표시됩니다 미디어 플레이리스트를 통해 AVPlayer는 필요한 콘텐츠 키와 함께 미디어 세그먼트를 가져오죠 AVPlayer가 충분히 버퍼링되면 재생을 재개할 수 있는 단계에 도달하게 됩니다 이는 타임라인에서 ‘likely to keep up’ 이벤트로 나타납니다 이 이벤트는 시작 시간과 함께 관련 플레이리스트, 미디어 세그먼트, 콘텐츠 키 이벤트처럼 시작에 영향을 미친 사항에 대한 세부 정보를 제공합니다 여기에서 시작하는 데 거의 2초가 걸린 것을 알 수 있습니다
시작 시간이 길기 때문에 이전 이벤트를 살펴보겠습니다 시작 시간의 대부분이 콘텐츠 키 요청을 위해 대기하는 데 사용되었네요 키 서버 성능을 개선하거나 클라이언트 측에서 재생하기 전에 미리 키를 로드해야 합니다 이렇게 하면 시작 시간을 단축하는 데 도움이 되죠 클라이언트 측 지표를 사용하면 AVFoundation 재생 세션 내에서 어떤 작업이 실행되는지에 대한 정보를 받을 수 있습니다
계속 진행하겠습니다 재생 문제가 중간에 멈추는 문제를 살펴보죠 7분과 8분 사이의 타임라인을 확대해 보니 재생이 멈췄네요
이는 타임라인에 이벤트로 표시됩니다
재생이 멈추기 직전의 이벤트를 보겠습니다 AVPlayer가 미디어 세그먼트를 가져오고 있습니다 자세히 살펴보면 동영상 미디어 세그먼트가 HTTP 404 오류를 반환하고 있네요 변형이 왜 20Mbps에서 15Mbps로 전환되는지 알 수 있죠
변형이 전환된 후 새 변형의 동영상 미디어 세그먼트가 다시 HTTP 404 오류를 반환합니다 이 시점에서 AVPlayer의 버퍼가 부족하여 중단이 발생하는 것으로 보입니다
미디어 세그먼트 이벤트에 접근할 수 있으므로 이제 NSURLSessionTask 지표에 대한 참조를 얻을 수 있습니다 이는 응답 헤더에 대한 전체 세트나 다른 네트워크 트랜잭션 세부 정보 등 요청이 실패한 이유에 대한 추가 세부 정보를 제공하죠 이러한 정보와 세션 식별자를 활용하면 CDN 파트너와 함께 문제의 범위를 좁힐 수 있습니다 클라이언트 측 지표를 사용하여 현장의 문제를 분류할 수도 있죠
마지막으로, 대규모의 세션을 모니터링하는 경우 AVPlayer는 끝부분에 요약 이벤트도 만듭니다 이 이벤트는 중단 횟수, 전환 횟수 등 한눈에 볼 수 있는 세션에 대한 여러 주요 성능 지표를 제공합니다 이 지표로 대규모의 미디어 재생 상태를 추적할 수 있습니다 요약하자면, 플레이리스트와 미디어 세그먼트 및 콘텐츠 키 이벤트에 대해 살펴보았습니다 이들은 개별 리소스 요청에 대한 정보를 제공합니다 그다음 중단 및 변형 전환 이벤트를 다루었습니다 이들은 미디어 재생 중단 및 변형 전환에 대한 정보를 제공하죠 주요 성능 지표를 포함하는 요약 이벤트를 마지막으로 설명했죠 이외에도 AVPlayerItem은 재생 속도가 변경될 때마다 속도 변경 이벤트 사용자가 검색할 때 검색 이벤트 오류가 발생할 때 오류 이벤트도 만들죠 이제 앱에서 이러한 이벤트를 구독하는 방법을 살펴보겠습니다 iOS 18에는 새로운 AVFoundation API가 도입됩니다 AVMetrics죠 이 API는 다양한 AVFoundation 인터페이스로부터 지표를 수집하는 통합된 방법을 제공합니다 미디어 타임라인에서 이벤트가 발생하면 앱에서 이를 수신하며 미디어 플레이리스트 가져오기와 같은 특정 활동이 끝나면 이벤트가 생성됩니다 이 API는 Publisher/Subscriber 모델을 따르므로 관심 있는 이벤트만 구독할 수 있습니다 핵심 개념을 몇 가지 알아보겠습니다 Publisher는 게시 이벤트를 지원하는 AVFoundation 인터페이스로 AVMetricEventStreamPublisher 프로토콜을 준수합니다 이 프로토콜은 특정 지표 이벤트 유형 또는 모든 지표에 대한 이벤트 게시를 지원합니다 iOS 18에서 AVPlayerItem은 AVMetricEventStreamPublisher 프로토콜을 준수하죠 즉, 이벤트를 게시할 수 있죠 예시를 살펴보겠습니다 이 예시의 LikelyToKeepUp 및 Summary 이벤트에 주목하세요 나중에 이 이벤트를 백엔드 분석 서버에 전송할 것입니다 우선 AVMetrics의 LikelyToKeepUp 및 Summary 이벤트에 대한 비동기 시퀀스 스트림을 선택합니다 그다음 시간순으로 병합된 스트림을 만듭니다 이 병합된 스트림은 LikelyToKeepUp 및 Summary 이벤트를 모두 효율적으로 시간순으로 전달합니다 이벤트를 수신하면 직렬화한 후 백엔드 분석 서버에 전송할 수 있습니다
Objective-C 개발자의 경우 AVMetrics API를 다르게 활용하죠 AVMetricEventStream 인스턴스를 만든 다음 subscriber를 설정합니다 나중에 관심 있는 이벤트에 구독하게 되죠
그다음 AVPlayerItem을 추가합니다 이때 subscriber가 이벤트를 수신하기 시작합니다
이러한 이벤트를 직렬화한 후 백엔드 서버에 전송합니다 앱에서 클라이언트 측 지표를 구독하고 이를 백엔드 분석 서버에 보고하는 방법을 살펴보았습니다 이제 마무리하겠습니다 AVPlayer의 클라이언트 측 지표와 여러 이벤트 유형을 알아보고 앱에서 이러한 지표를 구독하여 수신하는 방법을 다루었습니다 앱에서 새 API를 채택해 보시기 바랍니다 강화된 클라이언트 측 분석을 사용하면 현장에서 문제를 수월하게 분류하고 사용자를 위해 미디어 재생을 개선할 수 있습니다 감사합니다
-
-
6:27 - AVMetric Publishers
public protocol AVMetricEventStreamPublisher { func metrics<MetricType: AVMetricEvent>(forType metricType: MetricType.Type) -> AVMetrics<MetricType> func allMetrics() -> AVMetrics<AVMetricEvent> } extension AVPlayerItem : AVMetricEventStreamPublisher
-
6:50 - Example showing how to obtain likely to keep up and summary metrics from AVPlayerItem - Swift
let playerItem : AVPlayerItem = ... let ltkuMetrics = item.metrics(forType: AVMetricPlayerItemLikelyToKeepUpEvent.self) let summaryMetrics = item.metrics(forType: AVMetricPlayerItemPlaybackSummaryEvent.self) for await (metricEvent, publisher) in ltkuMetrics.chronologicalMerge(with: summaryMetrics) { // send metricEvent to server }
-
7:26 - Example showing how to obtain likely to keep up and summary metrics from AVPlayerItem - Objective-C
AVPlayerItem *item = ... AVMetricEventStream *eventStream = [AVMetricEventStream eventStream]; id<AVMetricEventStreamSubscriber> subscriber = [[MyMetricSubscriber alloc] init]; [eventStream setSubscriber:subscriber queue:mySerialQueue] [eventStream subscribeToMetricEvent:[AVMetricPlayerItemLikelyToKeepUpEvent class]]; [eventStream subscribeToMetricEvent:[AVMetricPlayerItemPlaybackSummaryEvent class]]; [eventStream addPublisher:item];
-
-
찾고 계신 콘텐츠가 있나요? 위에 주제를 입력하고 원하는 내용을 바로 검색해 보세요.
쿼리를 제출하는 중에 오류가 발생했습니다. 인터넷 연결을 확인하고 다시 시도해 주세요.