반응형
250x250
Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags more
Archives
Today
Total
관리 메뉴

멋진 개발자가 되고 싶다

[Android] Android에서 ExoPlayer 사용하기 본문

Android/개발 관련 팁

[Android] Android에서 ExoPlayer 사용하기

오패산개구리 2021. 7. 19. 13:08
728x90
반응형

 

엑소 플레이어란?


ExoPlayer는 Android용 애플리케이션 레벨 미디어 플레이어로, Android의 Media Player 대신 사용할 수 있습니다.

로컬 및 인터넷을 통해 오디오/비디오를 재생할 수 있습니다.

 

ExoPlayer가 인기 있는 또 다른 이유는 MediaPlayer에서 지원되지 않는 HTTP(DASH) 및 SmoothStreaming과 같은 많은 기능을 지원하기 때문입니다.

 

커스터마이징이 매우 용이하며 많은 특징과 기능을 제공합니다.

 


무엇을 다룰까요?


앞서 언급했듯이 ExoPlayer는 커스터마이징이 가능하고 모듈식입니다.

 

이를 통해 맞춤형 구성 요소 구현을 포함하고 필요에 맞게 완벽하게 조정할 수 있습니다.

 

문자 그대로 두 줄의 코드가 있어야 원시 오디오를 재생할 수 있는 안드로이드 미디어 플레이어와 달리 ExoPlayer에는 부분 부분들을 입맛에 맞게 갖다 쓸 수 있습니다.

 

이 글에서는 ExoPlayer에 대한 기본 요소에 관해 설명하고 ExoPlayer의 간단한 예를 다룰 것입니다.

 


ExoPlayer에 단점이 있나요?


ExoPlayer는 Android의 MediaCodec(API Level 16 추가)에 의존하기 때문에 Android 4.1 이상 버전을 지원합니다. 이전 버전을 지원하지 않는 경우에도 모든 Android 기기의 97.6%를 지원합니다.

 

ExoPlayer에서 Widevine common encryption는 Android 4.4(API 19) 이상에서 지원됩니다.

 

 

 

 

ExoPlayer의 기본 요소

 

1) ExoPlayer

 

ExoPlayer 라이브러리의 핵심은 ExoPlayer 인터페이스입니다.

 

ExoPlayerFactory 클래스를 통해 인스턴스를 생성할 수 있습니다.

 

간단한 예로 다음과 같이 호출해야 합니다.

 

1
2
3
SimpleExoPlayer exoPlayer = 
ExoPlayerFactory.newSimpleInstance(Context context, TrackSelector 
trackSelector);
cs

 

이 메서드는 SimpleExoPlayer 인스턴스를 반환합니다.

 

ExoPlayer는 getAudioFormat, getCurrentPosition, getDuration, setVolume, seekTo, setPlay와 같은 기존의 고급 미디어 플레이어 기능을 제공합니다.

 

앞서 말씀드린 것처럼 ExoPlayer는 모듈화 및 커스터마이징을 용이하게 하기 위해 많은 구성 요소를 제공합니다.

 

더 이상 필요하지 않을 때는 플레이어를 해제해야 한다는 점을 명심해야 합니다.

 

이 작업은 ExoPlayer.release로 호출하여 수행할 수 있습니다.

 

 

 

2) TrackSelector()


ExoPlayerFactory. newSimpleInstance(…)를 호출했을 때 알아차리셨겠지만

 

TrackSelector 인스턴스를 제공해야 합니다.

 

TrackSelector는 MediaSource에서 제공하는 트랙을 선택하여 사용 가능한 각 Renderer가 사용할 트랙을 선택합니다.

 

MediaSource와 Renderer는 밑에서 설명하겠습니다.

 

보통 new DefaultTrackSelector()를 호출하여 인스턴스를 얻을 수 있습니다.

 

1
TrackSelector trackSelector = new DefaultTrackSelector();
cs

 

 

 

3) MediaSource


ExoPlayer가 재생할 미디어를 정의하고 제공합니다.

 

MediaSource 인스턴스는 다음 방법으로 전달되어야 합니다.

 

1
ExoPlayer.prepare(MediaSource mediaSource)
cs

 

MediaSource 인스턴스는 재사용하지 마십시오. 즉, 한 번만 전달해야 합니다.

 

MediaSource 인스턴스를 가져오는 방법은 재생하려는 데이터 유형에 따라 다릅니다.

 

일반 미디어 파일의 경우 ExtractorMediaSource, DASH(DashMediaSource), SmoothStreaming(SsMediaSource) 및 HLS(HlsMediaSource)를 사용합니다.


간단한 MP3 파일의 경우 다음을 호출해야 합니다.

 

1
2
3
MediaSource mediaSource = new
ExtractorMediaSource.Factory(DataSource.Factory dataSourceFactory)
.createMediaSource(Uri mp3Uri);
cs

 

 

4) DataSource

 

위에서 보시는 것처럼 간단한 MP3 MediaSource를 생성할 때 DataSource를 주입해야 합니다.

 

간단한 MP3 사용 사례의 경우 DefaultDataSourceFactory를 사용하여 인스턴스를 생성할 수 있습니다.

 

1
2
3
DataSource.Factory dataSourceFactory = new 
DefaultDataSourceFactory(context, Util.getUserAgent(this
“yourApplicationName”));
cs

 

 

 

5) Renderer


미디어의 개별 구성 요소를 렌더링 합니다.

 

라이브러리는 일반 미디어 유형(MediaCodecVideoRenderer, MediaCodecAudioRenderer, TextRenderer 및 MetadataRenderer)에 대한 기본 구현 기능을 제공합니다.

 

재생 중인 MediaSource의 미디어를 소비합니다.

 

Renderer는 플레이어가 생성될 때 주입되지만 간단한 예에서는 자신의 인스턴스를 통과하지 않아도 됩니다.

 


6.) LoadControl


LoadControl은 MediaSource가 더 많은 미디어를 버퍼링 해야 하는 시기와 버퍼링해야 하는 양을 제어합니다.

 

대부분의 경우 기본 구현 DefaultLoadControl이 적합합니다.

 

ExoPlayer 인스턴스가 생성될 때도 주입되지만 간단한 경우에는 주입할 필요가 없습니다.

 


7) PlayerView


지금까지는 백엔드 논리만 다뤘습니다.

 

비디오나 오디오를 컨트롤과 함께 표시하려면 ExoPlayer의 Player View를 사용하면 됩니다.

 

XML 레이아웃에 다음 줄을 추가하기만 하면 됩니다.

 

1
2
3
4
<com.google.android.exoplayer2.ui.PlayerView
    android:id="@+id/audio_player_view"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />
cs

 

그런 다음 ExoPlayer를 PlayerView에 바인딩하기만 하면 됩니다.

 

1
2
PlayerView playerView ... // Find view
playerView.setPlayer(SimpleExoPlayer exoPlayer);
cs

 

PlayerView는 다른 구성 요소와 마찬가지로 커스터마이징이 매우 용이합니다.

 

다른 XML 레이아웃을 제공하여 모양과 느낌을 변경하고, 아트워크(기본 아트워크 설정) 등을 설정할 수 있습니다.


물론 엑소플레이어가 사용하는 구성품도 많지만 여기서는 다루지 않겠습니다.

 

관심이 있거나 특정 클래스 참조가 필요한 경우 여기에서 설명서를 확인할 수 있습니다.

 

https://exoplayer.dev/doc/reference/

 

Overview (ExoPlayer library)

 

exoplayer.dev

 

 

전체 코드로 알아보기

 

이는 Android의 Media Player와 비교했을 때 ExoPlayer 인스턴스에 많은 것을 주입해야 합니다.

 

이제 간단한 MP3 플레이어의 모양을 살펴보겠습니다.


먼저 build.gradle 파일에 다음 종속성을 추가해야 합니다.

1
implementation 'com.google.android.exoplayer:exoplayer:2.7.3'
cs

 

* 그 후 Activity에서

1
2
3
4
5
6
7
8
// 1. Declare a field SimpleExoPlayer
private SimpleExoPlayer;
...
// In onCreate
// 2. Create a default TrackSelector
TrackSelector trackSelector = new DefaultTrackSelector();
// 3. Create a SimpleExoPlayer instance
player = ExoPlayerFactory.newSimpleInstance(this, trackSelector);
cs

 

 

* XML 레이아웃에 추가

1
2
3
4
<com.google.android.exoplayer2.ui.PlayerView
    android:id="@+id/player_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />
cs

 

 

* Activity의 onCreate에 추가

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 4. Find the view
PlayerView playerView = findViewById(R.id.player_view);
// 5. Bind the player to the view.
playerView.setPlayer(player);
// 6. Create a DataSource.Factory instance through which media data is loaded.
DataSource.Factory dataSourceFactory = new  DefaultDataSourceFactory(this,
  Util.getUserAgent(this"simpleAudioApp"));
// 6. Create a MediaSource representing the media to be played.
// Note that I have my file in main/assets
Uri audioSourceUri = Uri.parse("file:///android_asset/hungarian_dance.mp3");
MediaSource audioSource = new ExtractorMediaSource.Factory(dataSourceFactory)
    .createMediaSource(audioSourceUri);
// Prepare the player with the source.
player.prepare(audioSource);
cs

 

* 마지막으로 onDestroy에서 release를 꼭 호출해줍니다

1
2
3
4
5
@Override
protected void onDestroy() {
    super.onDestroy();
    player.release();
}
cs

 

 

Extras

 

ExoPlayer 라이브러리는 훨씬 좋은 특성들을 제공합니다.

 

맛보기 좀 보여줄까요??

 

Loop

 

간단히 MediaSource를 통과시켜 비디오/오디오를 장시간 반복할 수 있습니다.

 

1
2
3
4
5
6
// Create a media source
MediaSource mediaSource =
 new ExtractorMediaSource.Factory(...)
.createMediaSource(audioUri);
// Plays the video n-times.
LoopingMediaSource loopingSource = new LoopingMediaSource(MediaSource mediaSource, int nTimesToLoop);
cs

 

무기한적으로 반복시키고 싶으면 ExoPlayer 인스턴스에 간단히 setRepeatMode를 호출하면 된다.

 

1
player.setRepeatMode(Player.REPEAT_MODE_ALL);
cs

 

비디오 연속 재생


ConcatenatingMediaSource에 두 개의 MediaSource를 전달하기만 하면 됩니다.

 

 

1
2
3
4
5
6
7
MediaSource firstSource = new ExtractorMediaSource.Factory(...)
.createMediaSource(firstVideoUri);
MediaSource secondSource = new ExtractorMediaSource.Factory(...)
.createMediaSource(secondVideoUri);
// Plays the first video, then the second video.
ConcatenatingMediaSource concatenatedSource =
    new ConcatenatingMediaSource(firstSource, secondSource);
cs

 

MergingMediaSource을 사용하여 재생을 위해 여러 파일을 단일 원본으로 병합할 수 있으며

 

EventListener 등을 추가할 수 있습니다.

 

 

 

 

 

 

[출처:https://medium.com/android-news/exoplayer-components-explained-9937e3a5d2f5]

728x90
반응형