본문 바로가기
Android/오디오 및 비디오

DroidKnights - Jetpack Media3로 좋은 콘텐츠 소비 경험 구현하기

by 안스 인민군 2023. 11. 2.

이번 글은 DroidKnights에서 발표한 류기민님의 Jetpack Media3로 좋은 콘텐츠 소비 경험 구현하기를 정리한 글입니다.


이전에는....

2000년 중 후반쯤, 우리가 동영상을 볼 때 위와 같은 버퍼링표시를 보곤 했었다.

이때는 스트리밍이 고려되지 않은 상태여서 파일을 통째로 전달받아 재생하는 형태였다. 이때는 1%도 되지 않으면 재생이 되지 않았었다...

그랬던 시절을 지나...

2010년에 들어서 모다일 시장이 열려 스트리밍 시장이 확대되었다.

 

 

그래서 스트리밍을 위한 국제 표준 기술이 등장하게되는데...!!

 

DASH

Dynamic Adaptive Streaming over HTTP ISO 표준으로 개발된 HTTP Adaptive Streaming 의 한종류이다.

Adaptive에서 알 수 있듯 클라이언트는 자신의 단말기 쪽 네트워크 상황에 맞추어 적정한 비디오 화질을 선택하여 서비스를 제공하는 기술이다. (자세한 내용 링크)

 

이러한 국제 표준 기술에 대응하기 위해 안드로이드 진형에서는 Exoplayer라는 오픈소스를 발표하게 된다.

ExoPlayer가 제공하는 것은

기본적인 재생을 위한 라이브러리 부터, 구글 캐스트, 미디어 세션과 같은 사용자 경험, 많이 사용하는 OKHttp사용하는 데이터 소스, 8K를 재생하기 위한 av1코덱을 재상하기 위한 extension을 제공한다. 이에 대한 자세한 내용은 자세한 Document가 있기에 커스터마이징이 가능하다. (Document)

이렇게 잘 사용 중

그러던 중 2021년 안드로이드 Dev에서 갑자기 Media3가 발표가 되는데...

Media3가 왜 출시를 한 것인가??

간단한 예시로 알아보자.

아래 사진과 같이 player가 있고 UI가 있어서 state를 그려주고 UI에서 재생, 일시정지 버튼을 눌러 Player의 명령을 내리는 구조가 있다고 하자.

 

이러한 문제점은

아무런 조치를 해주지 않으면 안드로이드 플랫폼에서는 미디어의 상태를 알 수 있는 방법이 없다.

이러한 구조에서 안드로이드 플랫폼에 알려주기 위해 Media Session이라는 국제 표준을 구현해주어야 한다.

구현을 하면 얻을 수있는 것은 기본 미디어 시스템 알림의 Commend를 받을 수 있고,

다음곡, 이전곡, 일시정지 등 이벤트를 처리할 수 있고

갤럭시 워치, 갤럭시 버즈, 구글 어시스턴트 등으로 Media를 Commend 할 수 있다.

그럼 좋다는 걸 알겠는데 기존에는 어떠한 어려움이 있었을까?

문제는 미디어 API 가 다양하게 존재한다는 것이 문제였다.

  • Jetpack Media(MediaCompat)
  • Media2
  • Exoplayer

이들은 각자 목적이 있는데 모두 미디어를 다루는 라이브러리이므로 겹치는 구현이 상당했다.

Media2 와 Exoplayer는 미디어 UI 가 겹쳤고

Jetpack Media과 Media2는 Media Session이 겹쳤다.

이 밖에도 미디어에 관련된 구현을 했을때 어떤 라이브러리를 사용해야 하는지 쉽게 결정할 수 없었고

각 라이브러리들이 가진 한계와 호환성 때문에 서로를 연결해 주는 추가적인 코드작업이 필요했다.

 

이러한 문제를 해결하고자 Media3가 탄생하게 되었다.

Media3는 기존에 존재하던 라이브러리에서 UI 재생, 그리고 Media Session 과 같은 공통 기능을 정의 했다.

또 각 라이브러리 구현을 다듬어 합쳤다.

또한 공통으로 사용 할 수 있는 Player 인터페이스를 정의하여 개발자 편의성을 증대 시켰다.

예시를 통해 Media3가 주는 이점에 대해 알아보자.

첫째로, 포그라운드 재생이다.

포그라운드 재생하는 앱을 생각해보면 한 액티비티에 Media Session, Player, UI가 한번에 있는 예시를 들 수 있다.

이때 Media Session을 통해 미디어 키 이벤트들을 처리하고 PIP 모드도 지원가능하다.

그러나 Media Session과 Player는 다른 라이브러리에서 왔고 다른 인터페이스를 가지고 있으므로 직접적으로 연결을 하기 어렵다.

그래서 Media Session과 Player와의 커넥터가 필요하고 Exoplayer에서는 미디어 세션 익스텐션으로 미디어 커넥터를 제공하고 있다.

발표에 따르면 인기앱의 50%이상이 안드로이드 플랫폼과 재생상태를 동기화하는데 문제를 겪었다고 한다.

 

아래는 미디어 세션 커넥터를 핵심적인 부분만 축약하여 구현한 코드이다.

미디어 세션 커멘드가 도착하면 그 콜백을 구현을 해서 명령을 내리고

 

예를 들어 플레이어의 상태변화가 있을때 미디어 세션으로 업데이트 하는 코드이다.

 

그렇다면 Media3에서는 어떻게 변경이 되었을까?

Commen 모듈에 Player라는 인터페이스를 선언했다.

그래서 Exoplayer는 Player는 인터페이스의 구현체로 작용을 하고 UI 와 MediaSession은 Player 인터페이스를 직접적으로 취함으로서

Connecter가 필요없이 player를 구현할 수 있게 되었다.

코드로 보면

  1. player를 초기화 하면
  2. MediaSession의 빌더에 직접적으로 넣을 수 있음
  3. 마찬가지로 UI 에도 별다른 커넥터 없이 player를 설정할 수 있게 되었다. (ex playerView)

두번째로 백그라운드 재생이다.

안드로이드 백그라운드 재생을 구현을 하려면 안드로이드 컴포넌트인 Service와 Activity를 이용하고 둘 사이를 연결해 주어야 한다.

그런데 Exoplayer에서는 백그라운드 재생을 구현하는데 쉽지 않다.

마찬가지로 백그라운드 재생도 예전 API대로 하면 Service의 player와 MediaSession을 초기화 하고 Activity에 MediaController와 UI가 있어 MediaSession과 MediaController가 통신을 하고 재생상태가 동기화가 되는 형태였다.

이도 Player와 UI는 Exoplayer를 사용하고 MediaSession과 MediaController는 Media2라이브러리를 사용하여 서로 호환이 되지 않았고 둘 사이에 커넥터가 필요했다. 그리고 이 과정들은 실수를 하기 너무 쉬웠다. (ex. Callback 중 하나라도 빼먹으면 잘못 동작함)

이를 Media3는 어떻게 해결을 했을까?

마찬가지로

Service에서 Exoplayer가 Player 인터페이스를 구현하고 MediaSession이 Player인스턴스를 취하게 된다.

Activity에서는 MediaController가 Player인터페이스를 구현하고 MediaSession과 MediaController가 서로 통신하는 것을 Media3에서

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

https://speakerdeck.com/workspace93/jetpack-media3ro-joheun-kontenceu-sobi-gyeongheom-guhyeonhagi?slide=3

 

Jetpack Media3로 좋은 콘텐츠 소비 경험 구현하기

이 발표는 안드로이드 미디어 경험 구현을 위한 새로운 라이브러리 컬렉션인 Media3를 다룹니다. ExoPlayer와 같은 Android 지원 라이브러리가 Media3로 이관되었는데 Media3는 어떤 의도를 가지고 개발되

speakerdeck.com

 

'Android > 오디오 및 비디오' 카테고리의 다른 글

미디어 용어 사전2 - Android  (0) 2023.11.14
미디어 용어 사전1 - Basic  (0) 2023.11.12
ExoPlayer / Player  (0) 2023.11.06
MPEG-DASH 란  (1) 2023.11.03
MedioPlayer에서 ExoPlayer로 전환하는 이유(1)  (2) 2023.08.11