BandwidthMeter(대역폭 측정기)
인터넷이란 큰 파이프 같은 거라고 생각했을때 이 파이프의 크기가 바로 우리의 "대역폭"이다. 그래서 이 파이프를 통해서 얼마나 많은 데이터가 흐를 수 있는지 알면 좋다.
이때, "대역폭 미터"는 이 파이프에서 얼마나 데이터가 흐르고 있는지를 알려주는 도구이다. 이 도구가 데이터의 양을 모니터링해서 알려준다.
그럼 예를 들어, 온라인에서 동영상을 본다고 상상했을때 동영상은 화질에 따라 다르게 나온다. 화질이 좋을수록 더 많은 데이터가 필요한데
대역폭 미터는 우리의 인터넷 파이프가 얼마나 큰지를 알려주고, 그에 맞게 동영상의 화질을 선택할 수 있게 해준다. 빠른 인터넷이면 화질을 높게 선택하고, 느린 인터넷이면 화질을 낮춰서 끊김 없이 동영상을 즐길 수 있다.
그래서 적응형 스트리밍은 이런 대역폭 미터의 정보를 활용해서, 현재 인터넷 상태에 맞게 자동으로 동영상의 화질을 조절해준다. 이렇게 하면 인터넷이 끊기지 않으면서 최상의 화질을 즐길 수 있다.
DataSource(데이터 소스)
'DataSource'는 DataReader를 확장하는 인터페이스로, URI(Uniform Resource Identifier)를 통해 식별된 리소스에서 데이터를 읽어올 수 있도록 한다. 이는 데이터를 요청하고 읽어오는데 필요한 기능을 정의한 것으로 이해할 수 있다.
주어진 코드에서 DataSource 인터페이스를 구현하는 클래스들이 나열되어 있는데, 이 클래스들은 각각 특정한 유형의 데이터를 읽어오는 데에 사용된다. 예를 들면, AesCipherDataSource는 암호화된 데이터를 읽어오는 데 사용되며, HttpDataSource는 HTTP를 통해 데이터를 읽어오는 데에 특화된 클래스이다.
이러한 클래스들은 DataSource의 특정한 기능을 구현하여 다양한 유형의 데이터를 효과적으로 읽어올 수 있도록 도와준다.
Extractor(추출기)
"Extractor(추출기)"는 미디어 컨테이너 형식을 파싱하여 각 트랙의 정보와 해당 트랙에 속한 개별 접근 유닛(access unit)을 디코더가 사용할 수 있는 형태로 출력하는 구성 요소이다.
간단히 말해, Extractor는 미디어 파일에 들어있는 여러 트랙(음악, 비디오 등)의 정보를 파악하고, 각 트랙에 속한 작은 단위의 데이터를 추출하여 디코더가 그것을 이해하고 재생할 수 있도록 하는 역할을 한다.
예를 들어, 동영상 파일에는 여러 트랙이 있을 수 있습니다. 그 중에서 비디오 트랙, 오디오 트랙 등 각각의 트랙에 해당하는 정보와 데이터를 추출하는데 Extractor가 사용된다.
LoadControl(로드 컨트롤)
LoadControl(로드 컨트롤)은 미디어의 버퍼링을 관리하고 결정하는 구성 요소이다. 간단히 말하면, 언제 데이터를 로드(불러오기)를 시작하고 멈추어야 하며, 언제 재생을 시작해야 하는지를 제어하는 역할을 한다.
로드 컨트롤은 미디어 플레이어에서 어떤 속도로 데이터를 불러오고 버퍼링을 조절할지를 결정한다. 예를 들어, 미디어를 스트리밍하는 경우에는 로드 컨트롤이 얼마나 많은 데이터를 버퍼에 적재할지, 언제 재생을 시작할지 등을 조절한다.
주어진 코드에서는 LoadControl 인터페이스를 구현하는 DefaultLoadControl 클래스가 나열되어 있다. 이 클래스는 기본적인 로드 컨트롤 동작을 제공하며, 특정한 상황에 맞게 로드 컨트롤을 조정하고자 할 때 이 인터페이스를 구현하여 사용할 수 있다.
요약하면, 로드 컨트롤은 로딩 시작 및 중지 시점, 재생 시작 시점을 결정하는 구성요소이다.
Timeline(타임라인)
Timeline(타임라인)은 미디어의 구조를 나타내는 것으로, 단일한 미디어 파일부터 광고가 삽입된 재생 목록과 같이 복잡한 미디어 구성까지 다양한 경우를 표현할 수 있는 유연한 표현 방식이다.
간단하게 말하면, 타임라인은 미디어의 시간적 구조를 나타내는 것으로, 어떤 미디어가 언제 재생되고, 언제 광고가 삽입되는지 등을 표현한다. 여러 가지 요소로 이루어져 있는데, 주로 '창(Window)'과 '기간(Period)'으로 구성된다.
- 창(Window): 주로 하나의 재생 목록 항목에 해당한다. 이는 하나 이상의 기간을 포함하며, 현재 재생 가능한 영역을 정의한다. 또한, 창 안에서 시간 이동(시크)이 가능한지 여부와 재생이 시작될 때의 기본 위치와 같은 추가 정보를 제공한다.
- 기간(Period): 하나의 논리적인 미디어 조각을 정의한다. 예를 들어, 이것은 하나의 미디어 파일이 될 수 있다. 또한, 미디어에 삽입된 광고 그룹을 정의하고 해당 광고가 로드되었고 재생되었는지에 대한 정보를 제공한다.
이러한 구성 요소를 조합하여 타임라인은 미디어의 복잡한 구조를 효과적으로 표현한다. 타임라인은 불변(immutable)하며, 동적으로 변하는 미디어(예: 라이브 스트림)의 경우 현재 상태의 스냅샷을 제공한다.
TrackSelection(트랙 선택)
TrackSelection(트랙 선택)은 트랙 그룹에서 정적인 부분집합(static subset)의 트랙들과 이 부분집합에서 선택된 트랙 중에서도 변경될 수 있는 트랙으로 이루어진 선택을 나타낸다. 적응형 스트리밍에서는 TrackSelection이 새로운 미디어 청크가 로딩될 때마다 적절한 트랙을 선택하는 역할을 담당한다.
간단히 말하면, TrackSelect는 특정 미디어에서 어떤 트랙을 선택할지를 정의하는 것 이다. 이 선택은 정적인 부분집합의 트랙 중에서 이루어지며, 이 중에서도 현재 상황에 따라 선택이 변경될 수 있다.
예를 들어, 동일한 비디오를 여러 해상도로 제공하는 경우, 각 해상도에 해당하는 트랙 그룹이 있을 것입니다. 여기서 트랙 선택은 특정 시점에 어떤 해상도의 비디오를 선택할지를 결정한다. 이 선택은 새로운 미디어 청크가 로딩될 때마다 조절될 수 있어서, 네트워크 상태나 디바이스 성능에 따라 최적의 트랙을 선택할 수 있게 된다.
쉽게 말해, 트랙 선택은 동영상이나 오디오 등의 미디어에서 사용자에게 보여질 트랙을 결정하는 것이며, 이를 통해 최상의 시청 경험을 제공할 수 있도록 조절된다.
TrackGroup(트랙 그룹)
TrackGroup(트랙 그룹)은 일반적으로 동일한 비디오, 오디오, 또는 텍스트 콘텐츠에 대한 여러 표현 중에서 적응형 스트리밍의 비트 전송률이 다른 그룹이다. 이는 미디어 스트림 내에서 이용 가능한 트랙들의 불변한(immutable) 집합을 나타낸다. 모든 트랙은 같은 콘텐츠를 나타내지만, 그들의 형식은 다를 수 있다.
간단히 말하면, 트랙 그룹은 동일한 미디어 내에서 다른 트랙들의 집합을 의미한다. 예를 들어, 동일한 비디오를 여러 해상도로 제공하는 경우, 각 해상도에 대한 트랙들이 하나의 비디오 트랙 그룹을 형성할 것 이다. 비슷하게, 다른 카메라 각도의 비디오를 여러 해상도로 제공하는 경우, 해당 각도에 대한 트랙들이 또 다른 비디오 트랙 그룹을 형성할 것 이다.
하지만 언어가 다른 오디오 트랙들은 그룹화되지 않는다. 왜냐하면 서로 다른 언어의 콘텐츠는 동일하지 않다고 간주되기 때문이다. 그러나 동일한 언어의 오디오 트랙 중에서 비트 전송률, 샘플링 속도, 채널 수 등이 다른 경우에는 이러한 속성에 따라 그룹화될 수 있다. 이는 텍스트 트랙에도 적용된다.
트랙 그룹 클래스는 미디어 자체에서 파생된 정보만을 포함하며, 런타임 정보는 포함하지 않는다. Tracks.Group과 달리, 장치에서 각 트랙의 재생이 얼마나 지원되는지, 현재 선택된 트랙이 무엇인지 등과 같은 런타임 정보는 포함되지 않는다.
Renderer(렌더러)
"Renderer(렌더러)"는 미디어 샘플을 읽어들이고 디코딩한 다음 화면에나 스피커로 해당 미디어를 표시하는 구성 요소이다. Android 플랫폼에서는 주로 비디오 및 오디오 데이터를 표시하는 데에 사용되며, 이를 표준적으로 수행하는 구성 요소로 볼 수 있다. Surface와 AudioTrack은 Android에서 비디오 및 오디오를 렌더링하는 데 사용되는 표준 요소이다.
간단히 말하면, 렌더러는 미디어를 읽어들이고 그것을 실제로 화면에나 스피커로 표시하는 일종의 '통역사' 같은 역할을 한다.
예를 들어, 렌더러는 동영상의 경우 비디오를 디코딩하고 화면에 표시하며, 오디오의 경우에는 오디오를 재생하는 역할을 한다.
Track Selector(트랙 선택기)
Track Selector(트랙 선택기)는 ExoPlayer의 구성 요소 중 하나로, 각각의 Renderer(렌더러)에 의해 소비될 트랙을 선택하는 역할을 한다. 주로 미디어의 다양한 트랙 중에서 어떤 것을 재생할지를 결정하며, 대부분의 경우에는 DefaultTrackSelector 구현이 대부분의 사용 사례에 적합하다.
트랙 선택기와 플레이어 간의 상호 작용은 다음과 같다:
- 플레이어 초기화: 플레이어가 생성되면 트랙 선택기는 init을 호출하여 초기화된다.
- 트랙 선택: 플레이어가 트랙을 선택해야 할 때는 selectTracks를 호출한다. 이는 주로 재생이 시작될 때, 새로운 미디어 기간을 버퍼링할 때, 이전 선택이 무효화될 때 등이 있다.
- 트랙 선택 사전 수행: 트랙이 활성화되기 훨씬 전에 (렌더러가 해당 선택을 실제로 사용하는 상태가 되기 전에) 트랙 선택이 수행될 수 있다. 예를 들어 여러 기간을 포함하는 미디어를 재생할 때, 해당 기간을 버퍼링하기 시작할 때 트랙 선택이 이루어진다.
- 활성화된 선택 알림: 트랙 선택이 실제로 활성화될 때(렌더러가 해당 미디어를 소비하기 시작할 때) 트랙 선택기에게 알림을 줄 수 있다.
- 트랙 무효화: 트랙 선택기가 이전에 한 선택이 더 이상 유효하지 않음을 플레이어에게 알릴 수 있다. 예를 들어 구성이 변경되어 특정 언어의 오디오 트랙을 선호하게 되면 트랙 선택이 무효화된다.
- 플레이어 해제: 플레이어가 해제될 때 트랙 선택기도 해제된다.
트랙 선택기의 반환값으로는 각 렌더러에 대한 트랙 선택 정보뿐만 아니라, 렌더러가 해당 미디어를 소비할 때 적용해야 하는 구성 매개변수를 정의하는 RendererConfigurations가 포함된 TrackSelectorResult가 있다.
중요한 점은 트랙 선택과 렌더러 구성이 서로 긴밀하게 연결되어 있다는 것 이다. 특정한 트랙 조합을 재생하려면 렌더러를 특정한 방식으로 구성해야 할 수 있고, 반대로 특정한 트랙을 선택하려면 렌더러를 특정한 방식으로 구성해야 할 수 있다.
MediaPeriod(미디어 기간)
MediaPeriod(미디어 기간)은 단일한 미디어(예: 오디오 파일, 광고, 광고 사이에 인터리브된 콘텐츠 등)를 로드하고, 이를 Renderers(렌더러)에서 읽을 수 있도록 허용하는 역할을 한다. MediaPeriod은 주로 ExoPlayer나 비슷한 미디어 재생 시스템에서 사용된다.
간단히 말하면, MediaPeriod은 특정한 미디어 콘텐츠를 재생 가능한 형태로 만들어주는 컴포넌트이다.
- 로드된 미디어 읽기: 미디어 기간은 로드된 미디어를 실제로 읽을 수 있도록 해준다. 이는 주로 렌더러(Renderers)가 미디어를 해석하고 화면에 표시하거나 스피커에서 재생하는 데 사용된다.
- 트랙 로드 결정: 어떤 트랙이 로드되어야 하는지에 대한 결정은 TrackSelector(트랙 선택기)에 의해 이루어진다. 즉, 어떤 비디오, 오디오, 텍스트 트랙 등이 로드되어야 하는지를 선택한다.
- 로드 제어 결정: 로드가 언제 시작되고 중지되어야 하는지에 대한 결정은 LoadControl(로드 컨트롤)에 의해 이루어진다. 이는 버퍼링이나 재생 중단 등을 관리하는 데 사용된다.
미디어 기간은 전반적인 미디어 재생의 핵심 구성 요소 중 하나이며, 다양한 트랙과 로드 제어를 관리하여 부드러운 미디어 재생을 가능하게 한다.
MediaSource(미디어 소스)
MediaSource(미디어 소스)는 미디어의 구조에 대한 고수준 정보를 제공하며, 재생을 위한 MediaPeriod 인스턴스를 생성한다. 여기서 말하는 "미디어"는 주로 동영상, 음악, 오디오, 텍스트와 같은 멀티미디어 콘텐츠를 의미한다.
간단히 말하면, 미디어 소스는 미디어의 구조를 파악하고 재생을 위해 필요한 기본적인 정보를 제공하는 역할을 한다. 이것은 미디어의 재생 가능한 부분을 기간(MediaPeriod)으로 정의하고, 전체 미디어의 구조를 타임라인(Timeline)으로 제공한다.
- 미디어의 구조에 대한 정보: 미디어 소스는 어떤 기간으로 나뉘어 있는지, 각 기간이 언제 시작하고 끝나는지 등의 정보를 제공한다.
- MediaPeriod 생성: 재생이 시작될 때, 각각의 기간을 표현하는 MediaPeriod 인스턴스를 생성한다. 이는 특정 구간의 미디어를 실제로 재생 가능한 형태로 만드는 역할을 한다.
이렇게 하면 미디어 소스를 이용하여 미디어 재생기(예: ExoPlayer)가 미디어를 효과적으로 재생할 수 있다. 미디어 소스는 다양한 형식의 미디어에 대응할 수 있도록 설계되어 있으며, 새로운 미디어 타입이나 포맷이 추가되어도 재생기를 수정하지 않고 사용할 수 있게 한다.
출처
https://developer.android.com/guide/topics/media/exoplayer/glossary?hl=ko
https://developer.android.com/reference/android/media/AudioTrack