Save the date! Android Dev Summit is coming to Sunnyvale, CA on Oct 23-24, 2019.

미디어 앱 아키텍처 개요

이 섹션에서는 미디어 플레이어 앱을 미디어 컨트롤러(UI의 경우)와 미디어 세션(실제 플레이어의 경우)으로 구분하는 방법에 대해 설명합니다. 또한 두 가지 미디어 앱 아키텍처인 클라이언트/서버 디자인(오디오 앱에서 제대로 작동하는 디자인)과 단일 액티비티 디자인(동영상 플레이어용 디자인)에 대해 설명합니다. 또한 미디어 앱이 하드웨어 컨트롤에 응답하게 만드는 방법과 오디오 출력 스트림을 사용하는 다른 앱들과 협력하는 방법을 보여줍니다.

플레이어 및 UI

오디오나 동영상을 재생하는 멀티미디어 애플리케이션에는 일반적으로 다음과 같은 두 부분이 있습니다.

  • 디지털 미디어를 취하여 동영상 및/또는 오디오로 렌더링하는 플레이어
  • 플레이어를 실행하고 플레이어 상태를 선택적으로 표시하는 전송 컨트롤이 있는 UI

ui-and-player

Android에서는 자신만의 플레이어를 완전히 새로 빌드하거나 아니면 다음 옵션 중에서 하나를 선택할 수 있습니다.

  • MediaPlayer 클래스는 가장 일반적인 오디오/동영상 형식과 데이터 소스를 지원하는 기본형 플레이어에 기본적인 기능을 제공합니다.
  • ExoPlayer는 저수준의 Android 오디오 API를 노출하는 오픈소스 라이브러리입니다. ExoPlayer는 MediaPlayer에는 없는 DASH 및 HLS 스트리밍과 같은 고성능 기능을 지원합니다. ExoPlayer 코드를 사용자설정할 수 있으므로 새로운 구성 요소를 추가하는 것이 쉽습니다. ExoPlayer는 Android 버전 4.1 이상에서만 사용될 수 있습니다.

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

UI와 플레이어의 API는 임의적일 수 있지만, 두 부분 사이의 상호작용이라는 특성은 기본적으로 모든 미디어 플레이어 앱에서 동일합니다. Android 프레임워크에서는 미디어 플레이어 앱을 빌드하기 위한 잘 정의된 구조를 지정하는 두 가지 클래스(미디어 세션미디어 컨트롤러)를 정의합니다.

미디어 세션 및 미디어 컨트롤러는 표준 플레이어 작업(재생, 일시 중지, 정지 등)에 해당하는 미리 정의된 콜백을 사용하여 서로 통신할 뿐만 아니라 앱 고유의 특정 동작을 정의하는 데 사용되는 확장 가능한 사용자설정 호출을 사용하여 서로 통신합니다.

controller-and-session

미디어 세션

미디어 세션은 플레이어와의 모든 통신을 담당합니다. 미디어 세션은 플레이어의 API를 앱의 나머지 부분에서 숨깁니다. 플레이어는 이 플레이어를 제어하는 미디어 세션으로부터만 호출됩니다.

이 세션에서는 플레이어의 상태 표시(재생 중/일시 중지됨)와 재생 관련 정보를 관리합니다. 세션은 하나 이상의 미디어 컨트롤러로부터 콜백을 수신할 수 있습니다. 이렇게 하면 Wear OS 및 Android Auto가 실행 중인 부속 기기 뿐만 아니라 앱 UI를 통해서도 플레이어를 제어하는 것이 가능합니다.

미디어 컨트롤러

미디어 컨트롤러는 UI를 격리합니다. UI 코드는 미디어 컨트롤러와만 통신하며, 플레이어 자체와는 통신하지 않습니다. 미디어 컨트롤러는 전송 제어 작업을 미디어 세션에 대한 콜백으로 변환합니다. 또한 세션 상태가 변경될 때마다 미디어 세션으로부터 콜백을 수신합니다. 이것은 연결된 UI를 자동으로 업데이트하는 메커니즘입니다. 미디어 컨트롤러는 한 번에 하나의 미디어 세션에만 연결될 수 있습니다.

미디어 컨트롤러와 미디어 세션을 사용하는 경우, 서로 다른 인터페이스 및/또는 플레이어를 런타임에 배포할 수 있습니다. 앱이 실행 중인 기기의 성능에 따라서는 앱의 모양 및/또는 성능을 독립적으로 변경할 수 있습니다.

동영상 앱과 오디오 앱

동영상을 재생하는 경우에는 눈과 귀를 모두 사용합니다. 오디오를 재생하는 경우에는 소리를 들으면서 동시에 다른 앱을 사용할 수도 있습니다. 각 사용 사례마다 디자인이 다릅니다.

동영상 앱

동영상 앱에는 콘텐츠를 시청하기 위한 창이 필요합니다. 이런 이유 때문에, 일반적으로 동영상 앱은 단일 Android 액티비티로 구현됩니다. 동영상이 나타나는 화면은 이 액티비티의 일부입니다.

동영상 플레이어 액티비티

오디오 앱

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

이 디자인을 Android에서 구현하려면 두 가지 구성 요소(UI의 경우 액티비티, 플레이어의 경우 서비스)를 사용하여 오디오 앱을 빌드할 수 있습니다. 사용자가 또 다른 앱으로 전환하면 해당 서비스가 백그라운드에서 실행될 수 있습니다. 오디오 앱의 두 부분을 별도의 구성 요소로 분할하게 되면, 각 부분이 독립하여 더 효율적으로 실행될 수 있습니다. UI는 일반적으로 플레이어에 비해 수명이 짧으며, 플레이어는 UI 없이도 장시간 실행될 수 있습니다.

오디오 액티비티 및 BrowserService

지원 라이브러리는 이 클라이언트/서버 접근방식을 구현하기 위해 MediaBrowserServiceMediaBrowser의 두 가지 클래스를 제공합니다. 서비스 구성 요소는 미디어 세션과 그 플레이어가 포함된 MediaBrowserService의 하위 클래스로 구현됩니다. UI 및 미디어 컨트롤러와의 액티비티에는 MediaBrowserService와 통신하는 MediaBrowser가 포함되어야 합니다.

MediaBrowserService를 사용하면 UI 액티비티에 전혀 액세스하지 않고도 부속 기기(예: Android Auto 및 Wear)가 쉽게 앱을 검색하고, 이 앱에 연결하고, 콘텐츠를 찾아보고, 재생을 제어할 수 있습니다.

미디어 앱 및 Android 오디오 인프라

잘 디자인된 미디어 앱은 오디오를 재생하는 다른 앱들과 "함께 잘 재생"되어야 합니다. 이 미디어 앱은 전화를 공유하도록 준비되어야 하고 또한 오디오를 사용하는 기기상의 다른 앱들과 협력하도록 준비되어야 합니다. 이 앱은 또한 기기상의 하드웨어 컨트롤에 응답해야 합니다.

plays-with-others

이 모든 동작은 오디오 출력 제어에 설명됩니다.

media-compat 라이브러리

media-compat 라이브러리에는 오디오 및 동영상 재생 앱을 빌드하는 데 유용한 클래스가 포함되어 있습니다. 이들 클래스는 Android 2.3(API 레벨 9) 이상이 실행 중인 기기와 호환됩니다. 또한 다른 Android 기능과 함께 사용되어 편안하고 친숙한 Android 환경을 만들어 줍니다.

미디어 세션 및 미디어 컨트롤러의 권장되는 구현은 MediaSessionCompatMediaControllerCompat 클래스이며,이들 클래스는 media-compat 지원 라이브러리에 정의됩니다. 이들 클래스는 Android 5.0(API 레벨 21)에 소개되었던 이전 버전의MediaSessionMediaController 클래스를 대체합니다. compat 클래스는 동일한 기능을 제공하지만 하나의 API에만 작성하면 되므로 앱 개발이 더욱 쉬워집니다. 이 라이브러리는 미디어 세션 메서드를 오래된 플랫폼 버전상의 동일한 메서드로 변환하여 이전 버전과의 호환성을 관리합니다.

작동 중인 앱이 오래된 클래스를 이미 사용 중인 경우에는 compat 클래스로 업데이트하는 것이 좋습니다. compat 버전을 사용하는 경우에는 registerMediaButtonReceiver()에 대한 모든 호출과 RemoteControlClient의 모든 메서드를 제거할 수 있습니다.

성능 측정

Android 8.0(API 레벨 26) 이상의 경우, 일부 미디어 클래스에 getMetrics() 메서드를 사용할 수 있습니다. 이것은 PersistableBundle 객체를 반환하는데, 이 객체는 특성과 값의 맵으로 표현되는 구성과 성능 정보를 포함합니다. getMetrics() 메서드는 다음과 같은 미디어 클래스에 대해 정의됩니다.

지표는 각 인스턴스에 대해 개별적으로 수집되며 인스턴스 수명 동안 지속됩니다. 사용할 수 있는 지표가 없으면 메서드는 null을 반환합니다. 반환되는 실제 지표는 클래스에 따라 달라집니다.