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

미디어 용어 사전2 - Android

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

AudioTrack

AudioTrack은 안드로이드에서 제공하는 API로, 간단하게 말해 안드로이드 앱에서 소리를 재생하는 데 사용되는 도구이다. 이 API를 통해 음악, 효과음, 또는 다양한 오디오 소스를 앱에서 제어하고 재생할 수 있다.

예를 들어, 게임 앱에서 특정 상황에 맞는 효과음을 재생하거나 음악 앱에서 노래를 재생하는 데에 사용될 수 있다. AudioTrack은 오디오 데이터를 다루고 재생하는 데 도움이 되며, 앱 개발자들은 이를 활용하여 사용자에게 더 풍부하고 흥미로운 오디오 경험을 제공할 수 있다.

 

AudioTrack 클래스는 Java 어플리케이션에서 하나의 오디오 자원을 관리하고 재생하는 역할을 한다. 이 클래스는 PCM(펄스 코드 변조) 오디오 버퍼를 오디오 장치로 전송하여 재생하는 기능을 제공한다. 이를 위해서는 AudioTrack 객체로 데이터를 "푸시"해야 하는데, 이는 write(byte[], int, int), write(short[], int, int), write(float[], int, int, int) 메서드 중 하나를 사용하여 수행된다.

AudioTrack 인스턴스는 두 가지 모드에서 작동할 수 있다. 정적(static) 또는 스트리밍(streaming) 모드이다.

스트리밍(streaming) 모드

스트리밍 모드에서 어플리케이션은 write() 메서드 중 하나를 사용하여 AudioTrack에 지속적인 데이터 스트림을 작성한다. 이 메서드들은 데이터가 Java 레이어에서 네이티브 레이어로 전송되어 재생 대기열에 추가될 때까지 블록되며, 스트리밍 모드는 주로 다음과 같은 경우에 유용하다.

  • 재생할 소리의 지속 시간 때문에 메모리에 맞지 않을 때
  • 오디오 데이터의 특성 때문에 메모리에 맞지 않을 때 (고 샘플링 속도, 비트당 샘플 등)
  • 이전에 대기열에 추가된 오디오가 재생 중일 때 새로운 데이터를 받거나 생성할 때

정적 모드

정적 모드는 메모리에 맞는 짧은 소리를 처리하고 가능한 최소의 대기 시간으로 재생해야 하는 경우 선택해야 한다. 정적 모드는 주로 자주 재생되는 UI 및 게임 소리와 같은 경우에 권장된다.

AudioTrack 객체를 생성하면 연관된 오디오 버퍼가 초기화된다. 이 버퍼의 크기는 생성 중에 지정되며, AudioTrack이 데이터가 부족하여 재생을 계속하기 전에 얼마 동안 재생할 수 있는지 결정한다.

정적 모드를 사용하는 AudioTrack의 경우, 이 크기는 해당 모드에서 재생할 수 있는 소리의 최대 크기이다. 스트리밍 모드의 경우 데이터는 전체 버퍼 크기보다 작거나 같은 크기의 청크로 오디오 장치에 쓰여진다. AudioTrack은 최종 클래스가 아니기 때문에 하위 클래스를 허용하지만 이러한 사용은 권장되지 않는다.

 

AudioTrack 객체를 생성하면 연관된 오디오 버퍼가 초기화된다. 이 버퍼의 크기는 생성 중에 지정되며, AudioTrack이 데이터가 부족하여 재생을 계속하기 전에 얼마 동안 재생할 수 있는지 결정한다.

정적 모드를 사용하는 AudioTrack의 경우, 이 크기는 해당 모드에서 재생할 수 있는 소리의 최대 크기이다. 스트리밍 모드의 경우 데이터는 전체 버퍼 크기보다 작거나 같은 크기의 청크로 오디오 장치에 쓰여진다. AudioTrack은 최종 클래스가 아니기 때문에 하위 클래스를 허용하지만 이러한 사용은 권장되지 않는다.

 

MediaDrm

Android에서 제공하는 API로, 암호화된 미디어 콘텐츠를 복호화하고 재생하기 위한 방법을 제공한다.

  1. 암호화된 콘텐츠는 서버에서 준비되어 저장된다.
  2. 사용자의 앱은 이 콘텐츠를 라이선스 서버에서 암호를 받아 해독하게 된다.
  3. 앱은 이를 위해 MediaDrm 객체를 생성하고, 라이선스 서버로부터 키(암호) 요청을 한다.
  4. 서버의 응답을 받으면, 이 키를 사용해 콘텐츠를 해독하고 재생한다.

이 과정에서 MediaDrm은 여러가지 예외 상황을 처리할 수 있도록 도와준다. 예를 들어, DRM 플러그인이나 보안 하드웨어에서 복구할 수 없는 오류가 발생하거나, 앱이 실행 중인 동안 미디어 서버 프로세스가 충돌하거나 재시작하는 경우 등에 대비할 수 있다.

또한, 애플리케이션은 재생이나 스트리밍 중에 키 상태 업데이트를 알리기 위해 정보 이벤트를 등록할 수 있다. 이를 통해 콘텐츠의 재생 상태를 실시간으로 모니터링할 수 있다.

 

콘텐츠 복호화 모듈(CDM)

콘텐프 복호화 모뷸(CDM)은 디지털 권한 관리(DRM)로 보호된 콘텐츠를 복호화(즉, 암호화를 해제)하는 역할을 하는 시스템이다. 즉, DRM으로 보호된 영상, 음악 등의 미디어 콘텐츠를 실제로 사용자가 재생하거나 볼 수 있게 만드는 역할을 한다.

CDM은 Android의 MediaDrm API를 통해 사용하게 된다. 즉, 앱이 DRM 보호된 콘텐츠를 재생하려고 할 때, MediaDrm API를 통해 CDM에 접근하고, CDM은 받아온 암호화된 콘텐츠를 복호화하여 실제로 재생 가능한 형태로 만들어주는 것이다.

간단하게 말하면, CDM은 자물쇠를 여는 열쇠와 같은 역할을 하는 시스템이라고 할 수 있다. DRM이라는 자물쇠로 잠겨있는 콘텐츠를 CDM이라는 열쇠로 열어서 사용자가 볼 수 있게 해주는 것이다.

양방향 미디어 광고(IMA)

양방향 미디어 광고 (IMA)는 웹사이트나 앱에 광고를 쉽게 넣을 수 있게 도와주는 도구 모음이다. 이 도구를 사용하면 VAST라는 표준에 맞는 광고 서버에서 광고를 불러와서 앱에서 재생할 수 있다. 또한, 동시에 다른 광고를 보여주거나, 광고의 효과를 측정하고 보고하는 기능도 제공한다.

IMA SDK를 사용하는 방법은 크게 두 가지이다. 하나는 앱에서 직접 광고와 콘텐츠 동영상을 한데 묶는 방법이고, 다른 하나는 Ad Manager 서버에서 광고와 콘텐츠 동영상을 묶어서 앱에 전달하는 방법이다.

간단히 말하자면, IMA는 앱이나 웹사이트에 광고를 쉽게 넣을 수 있게 도와주는 도구라고 할 수 있다. 이를 통해 광고를 불러오고, 광고의 효과를 측정하고, 광고를 효과적으로 보여줄 수 있다.

미디어 코덱

미디어 코덱은 인코더/디코더 구성요소인 저수준 미디어 코덱에 접근하는 데 사용된다. 이는 Android의 저수준 멀티미디어 지원 인프라의 일부로, 보통 MediaExtractor, MediaSync, MediaMuxer, MediaCrypto, MediaDrm, Image, Surface, AudioTrack 등과 함께 사용된다.

간단하게 설명하자면, MediaCodec은 입력 데이터를 받아서 출력 데이터를 생성하는 역할을 한다. 이 과정은 비동기적으로 이루어지며, 입력 및 출력 버퍼 세트를 사용한다. 빈 입력 버퍼를 요청(또는 받아서) 데이터로 채운 후, 이를 코덱에 전달해서 처리하게 한다. 코덱은 이 데이터를 소비하고, 이를 빈 출력 버퍼 중 하나로 변환한다. 마지막으로, 채워진 출력 버퍼를 요청(또는 받아서) 내용을 소비하고, 이를 다시 코덱에 반환한다.

즉, MediaCodec은 미디어 데이터를 변환하는 역할을 하는 도구라고 볼 수 있다. 이를 통해 미디어 데이터를 인코딩하거나 디코딩하는 작업을 할 수 있다.

오디오 오포로드

"오디오 오프로드"는 기기에 내장된 디지털 신호 프로세서(DSP)를 이용해 압축된 오디오를 직접 처리하는 기능을 말한다. 이렇게 하면 중앙 처리 장치(CPU)의 부하를 줄일 수 있어, 전력을 효율적으로 사용할 수 있게 된다.

이 기능은 특히 저전력 상태에서 오디오를 재생할 때 유용하다. 즉, 오디오 오프로드는 기기의 배터리를 절약하면서도 오디오 재생 기능을 제공할 수 있게 돕는 기술이라고 할 수 있다.

패스 스루

"패스 스루"는 압축된 오디오를 먼저 디코딩하지 않고 그대로 HDMI 등의 연결을 통해 전송하는 기능을 의미한다. 일반적으로 오디오 데이터는 재생 전에 디코딩 과정을 거치지만, 패스 스루 기능을 사용하면 이 디코딩 과정을 건너뛰고 오디오 데이터를 직접 전송할 수 있다.

예를 들어, Android TV에서 5.1 서라운드 사운드를 재생할 때 이 기능을 사용하면 오디오 데이터를 TV에서 디코딩하지 않고, 오디오 시스템에서 직접 디코딩하도록 할 수 있다. 이로 인해 오디오 품질이 손상되지 않고, 또한 TV의 부하를 줄일 수 있다.

간단하게 말하면, 패스 스루는 디코딩 과정 없이 오디오 데이터를 직접 전송하는 기능이다. 이를 통해 오디오 품질을 유지하면서 부하를 줄일 수 있다.

Surface

안드로이드 시스템에서 'Surface'는 화면 합성기(screen compositor)가 관리하는 원시 버퍼에 대한 핸들이다. 즉, 그래픽 렌더링을 위한 버퍼를 관리하는 인터페이스를 말한다.

Surface는 일반적으로 이미지 버퍼의 소비자(SurfaceTexture, MediaRecorder, Allocation 등)가 만들거나 소비자로부터 생성되며, 생산자(OpenGL, MediaPlayer, CameraDevice 등)에게 전달되어 그림을 그릴 수 있다.

'SurfaceHolder'는 Surface를 편집하고 제어할 수 있게 해주는 인터페이스이다. 일반적으로 뷰와 상호작용하는 대부분의 컴포넌트는 SurfaceHolder를 사용한다.

따라서, 간단하게 말하면 'Surface'와 'SurfaceHolder'는 앱이 화면에 이미지를 그리는 데 필요한 버퍼를 관리하고 제어하는 역할을 한다. 이를 통해 앱은 이미지를 렌더링하고, 화면에 출력하는 작업을 수행할 수 있다.

tunneling

"터널링" 또는 "멀티미디어 터널링"은 압축된 비디오 데이터가 하드웨어 비디오 디코더를 통해 직접 디스플레이로 이동하도록 하여, 앱 코드나 안드로이드 프레임워크 코드에 의해 처리되지 않게 하는 기능이다.

이 기능은 안드로이드 프레임워크가 압축된 비디오와 압축된 데이터 또는 PCM 오디오 데이터를 받아서 디코딩, 동기화, 렌더링하는 일부 작업을 대신한다. 이로 인해 AV(오디오-비디오) 동기화를 향상시키고 비디오 재생을 원활하게 하며, 애플리케이션 프로세서의 부하를 줄일 수 있습니다. 주로 Android TV에서 사용된다.

즉, 간단하게 말하면, "터널링"은 애플리케이션의 부하를 줄이고 비디오 재생을 원활하게 하기 위해, 비디오 데이터를 직접 디스플레이로 전송하는 기능이다. 이 기능을 통해 애플리케이션은 디코딩, 동기화, 렌더링 등의 복잡한 작업을 안드로이드 프레임워크에 맡기고, 자신은 비디오 재생을 더 원활하게 제어할 수 있게 된다.


출처

https://developer.android.com/guide/topics/media/exoplayer/glossary?hl=ko

https://developer.android.com/reference/android/media/AudioTrack

https://developer.android.com/reference/android/media/MediaCodec

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

Jetpack Media3  (0) 2023.11.15
미디어 용어 사전1 - Basic  (0) 2023.11.12
ExoPlayer / Player  (0) 2023.11.06
MPEG-DASH 란  (1) 2023.11.03
DroidKnights - Jetpack Media3로 좋은 콘텐츠 소비 경험 구현하기  (0) 2023.11.02