Media app architecture overview Android


Media app architecture overview

https://developer.android.com/guide/topics/media-apps/media-apps-overview

이 섹션은 미디어 플레이어 앱을 미디어 컨트롤러 (UI를 위한) 와 미디어 세션 (실제 플레이어)로 어떻게 분리하는지를 설명한다. 이는 두 개의 미디어 앱 아키텍쳐를 설명하는데 오디오 앱을 위해 잘 작동하는 클라이언트/서버 디자인 그리고 비디오 플레이어를 위한 단일 액티비티 디자인이다. 또한 하드웨어 컨트롤에 반응하는 방법과 오디오 출력 스트림을 사용하는 다른 앱과의 상호작용까지 다룬다.

플레이어와 UI

오디오나 비디오를 재생하는 멀티미디어 어플리케이션 은 두 부분을 가진다.
- 비디오와 오디오를 렌더할 플레이어
- 플레이어를 실행하고 플레이어의 상태를 표시하기 위한 UI
ui-and-player

안드로이드에서 플레이어를 만듦에 있어 시작부터 작성하거나 이들 옵션중에 선택할 수 있다.
- MediaPlayer 클래스는 대부분의 공통적인 오디오/비디오 포맷과 데이터 소스를 지원하는 베어본 플레이어를 위한 기본 기능을 제공한다.
- ExoPlayer 는 오픈소스 라이브러리로서 하위레벨 안드로이드 오디오 API를 제공한다. 엑소플레이어는 MediaPlayer 에서 불가용한 DASH, HLS스트리밍과 같은 고성능 기능또한 지원한다. ExoPlayer 코드를 커스터마이즈해 새로운 컴포넌트를 쉽게 만들 수 있다. ExoPlayer 는 안드로이드 4.1 이상에서 사용된다.

미디어 세션과 미디어 컨트롤러

UI와 플레이어를 위한 API가 임의적임에 따라 이 두 부분이 상호작용하는 방식은 모든 미디어 플레이어 앱에서 기본적으로 동일하다. 안드로이드 프레임워크는 두 클래스를 정의하는데 미디어 세션과 미디어 컨트롤러 이다. 이들은 미디어 플레이어 앱을 만들기위해 잘 정의된 구조를 가능하게 한다.

미디어 세션과 미디어 컨트롤러는 표준 플레이어 행동에 연계된 미리정의된 콜백을 사용해 서로 상호작용하며 앱내에서 특징적으로 특수한 작용을 지정하는 확장가능한 사용자 호출과도 상호작용한다.

controller-and-session

미디어 세션

미디어 세션은 플레이어와의 모든 교신을 담당한다. 플레이어의 API를 앱에서의 나머지에서 감춘다. 플레이어는 미디어 세션으로부터만 호출된다.

세션은 플레이어의 상태(플레잉/포즈드)의 표현을 유지하며 무엇이 재생되는지에 대한 정보를 관리한다. 세션은 하나이상의 미디어 컨트롤러로 부터 콜백을 받을 수 있다. 이를 통해 플레이어는 자체 UI뿐아니라 Wear OS그리고 Android Auto 와 같은 컴패니언 장치로도 제어될 수 있다.

미디어 컨트롤러

미디어 컨트롤러는 UI를 고립시킨다. UI코드는 플레이어 자체가 아닌 오직 미디어 컨트롤러에만 교신할 수 있다. 미디어 컨트롤러는 제어 액션을 해석하고 미디어 세션으로의 콜백에 전달한다. 이는 연관된 UI를 자동적으로 업데이트하는 매커니즘을 제공한다. 미디어 컨트롤러는 한번에 하나의 미디어 세션에만 연결할 수 있다. 

미디어 컨트롤러와 미디어 세션을 사용할 때 실시간에서 다른 인터페이스와 플레이어를 배치할 수 있다. 실행중인 장치의 호환상에 의존해 앱의 모양이나 성능을 변경할 수 있다.

비디오 앱 vs 오디오 앱

비디오를 재생할 때, 눈과 귀가 모두 연계된다. 오디오를 재생할 때는 듣기만하므로 동시에 다른 앱을 실행할 수 이다. 각 사용상황에 따라 다른 디자인이 있다.

비디오 앱

비디오 앱은 컨텐트를 보기위한 윈도우를  필요로 한다. 이런 이유로 비디오 앱은 보통 단일 안드로이드 액티비티로 구현된다. 비디오가 보여지는 화면은 액티비티의 일부분이다.

video player activity

오디오 앱

오디오 플레이어는 UI가 항상 보여질 필요는 없다. 오디오를 재생하면 플레이어는 백그라운드 작업으로 실행될 수 있다. 사용자는 계속들으면서 다른 앱으로 전환할 수 있다.

안드로이드에서 이 설계를 구현하려면 두가지 컴포넌트로 오디오 앱을 만들 수 있는데 UI를 위한 액티비티와 플레이어를 위한 서비스 이다. 만약 사용자가 다른 앱으로 스위치하면 서비스는 백그라운드에서 실행할 수 있다. 오디오 앱의 두부분으로 요소화함으로서 각각은 더욱 효율적으로 실행할 수 있다.

Audio activity and BrowserService

서포트 라이브러리는 클라이언트/서버 접근을 구현하기 위한 두개의 클래스를 제공한다. MediaBrowserService, MediaBrowser. 서비스 컴포넌트는 MediaBrowserService 의 서브캘래스로 구현되어 미디어 세션과 그 플레이어를 갖는다. UI와 미디어 컨트롤러를 가지는 액티비티는 MediaBrowser를 포함해야 하며 이 것이 MediaBrowserService와 교신한다.

MediaBrowserService 를 사용함으로서 컴패니언 장치(안드로이드 오토, 웨어)에서 UI액티비티에 접근하지 않고도 쉽게 앱을 발견하고 연결하며 컨텐츠를 브라우즈하고 플래이백을 컨트롤하기 쉽게 해준다.

미디어 앱과 안드로이드 오디오 인프라스트럭쳐

잘 설계된 미디어 앱은 오디오를  재생하는 다른앱과 함께 잘 재생되어야만 한다. 오디오를 사용하는 장치상의 다른앱과 상호작용하고 폰을 공유하기 위한 준비가 되어있어야 한다. 이는 또한 장치상의 하드웨어 컨트롤에도 반응해야 한다.

plays-with-others

All of this behavior is described in Controlling Audio Output.

미디어 컴팻 라이브러리

미디어 컴팻 라이브러리는 오디오와 비디오를 재생하는 앱을 생성하는데 도움을 주는 클래스를 포함한다. 이들 클래스는 안드로이드 2.3 (API 레벨 9) 이상을 실행하는 장치에 호환된다. 이들은 다른 안드로이드 기능과 작용하여 호환되며 친숙한 안드로이드 경험을 제공한다.

미디어 세션과 미디어 컨트롤러의 추천되는 구현은 MediaSessionCompat 와 MediaControllerCompat 이다. 이는 media-compat support library 에 정의되어 있다. 이들은 안드로이드 5.0에서 소개된 MediaSession 와 MediaController 의 이전 버전을 교체하는 것이다. 콤팻 클래스는 같은 기능성을 제공하지만 앱을 개발하기 쉽게 해주는데 한 API만 작성하면 되기 때문이다. 라이브러리는 미디어 세션 메소드를 가능하다면 오래된 플랫폼 버전에서도 동일한 메소드로 해석할 수 있게 해준다.

만약 오래된 클래스와 작동하는 앱이 있다면 콤팻 클래스로 업데이트하는 것을 추천한다. When you use the compat versions you can remove all calls to registerMediaButtonReceiver() and any methods from RemoteControlClient.

성능 측정

안드로이드 8.0 이후에는 몇몇 미디어 클래스에 대해 getMetrics() 메소드를 사용할 수 있다. 이 것은 PersistableBundle 객체를 반환하며 설정과 성능 정보를 포함하고 속성의 맵으로 표현된다. getMetrics() 메소드는 이들 미디어 클래스를 위해 정의되어 있다.

- MediaPlayer.getMetrics()
- MediaRecorder.getMetrics()
- MediaCodec.getMetrics()
- MediaExtractor.getMetrics()

메트릭은 각 인스턴스에 대해 개별적으로 취합되고 인스턴스 라이프 타임동안 유지된다. 만약 메트릭이 가용하지 않다면 null이 반환된다. 실제 메트릭은 클래스에 따라 반환된다.



덧글

댓글 입력 영역