본문 바로가기
Android/etc

프로젝트에 Exoplayer - FFmpeg Module 적용하기

by wannagohome97 2024. 1. 12.

글을 시작하기에 앞서 이 글은 Linux 를 사용하여 Android 를 빌드하는 과정이 포함되어있습니다.

- Virtual Machine 으로 Ubuntu 를 사용하시거나 Linux OS 를 사용하는 PC 를 필요로 합니다.

 

Android  에서 미디어 관련 앱을 개발하다 보면 꼭 쓰게 되는 Exoplayer 입니다.

ExoPlayer 로 스트림을 재생할 때 MediaSource 의 분류만 제대로 맞춘다면 웬만하면 문제가 없지만

특히 Video쪽은 정말 문제가 잘 안발생하지만

Audio 쪽에서 간혹 문제가 발생합니다

  • Video 는 정상이지만 Audio 가 재생되지 않는다던지
  • Video 도 재생되지 않는 와중에 로그를 보니 또 Audio 관련 에러가 있다던지

이런 경우 Exoplayer 에서 기본 지원되는 포맷이아닌건지 한번 의심을 해볼만 합니다.

 

아래 링크는 Exoplayer 에서  '기본적으로'  지원되는 포맷 목록입니다.

 

 

Supported formats - ExoPlayer

 

exoplayer.dev

 

Exoplayer 에서 현재 재생되고 있는 Stream 의 포맷 정보를 확인 하는 방법은 아래 글에서 확인할 수 있습니다.

 

 

Android Exoplayer 현재 재생중인 스트림 포맷 확인 방법

ExoPlayer 를 이용해서 개발을 하다 보면 현재 재생되고 있는 Stream 이 어떤 형식으로 오는지 알아야 하는 경우가 생깁니다.( 디버깅 시 필요 하다던지, UI 에 재생 정보를 표기해야한다던지와 같은

developanything.tistory.com

 

포맷 명을 알아냈다면 FFmpeg Extension 에서 지원되는 Formats 와 비교해봅니다.

 

저의 경우는 문제가 되었던 Test 스트림의 Audio Format 이  MPEG -L2(mp2) 였고 , FFmpeg Extension 목록에 있었습니다.

 

만약 문제가 되는 Stream 의 Format 명이 FFmpeg Extension 목록에 있다면 Exoplayer - FFmpeg Extension 을 빌드하는 것으로 문제를 해결할 수 있습니다.

 

아래는 Exoplayer 소스 GitHub 입니다

 

GitHub - google/ExoPlayer: An extensible media player for Android

An extensible media player for Android. Contribute to google/ExoPlayer development by creating an account on GitHub.

github.com

 

이 프로젝트를 Clone 해주고 

git clone https://github.com/google/ExoPlayer.git

 

프로젝트 폴더로 이동해줍니다

cd <프로젝트 폴더 경로>

 

 

FFmpeg Extension 모듈의 경로 / Android NDK 가 저장되어있는 경로 / Host Platform 정보를 각각 저장해줍니다

FFMPEG_MODULE_PATH="$(pwd)/extensions/ffmpeg/src/main"
NDK_PATH=<NDK 저장 경로>
HOST_PLATFORM="linux-x86_64"

 

 

그리고 위에서 문제가 되었던 Format 의 Decoder Name 을 저장해둡니다

저의 경우는 MPEG-L2 하나가 문제여서 mp3 에 추가로 임의 Decoder 를 2개 넣은 예시를 작성했습니다.

ENABLED_DECODERS=(mp3 ac3 eac3)

 

그 후 모듈 안으로 들어가 Shell Script 를 실행해주고

cd "${FFMPEG_MODULE_PATH}/jni" && \
./build_ffmpeg.sh \
  "${FFMPEG_MODULE_PATH}" "${NDK_PATH}" "${HOST_PLATFORM}" "${ENABLED_DECODERS[@]}"

 

 

프로젝트 파일을 연 뒤 Terminal 에서 아래 명령어를 실행시켜 Assemble Release 로 앱을 빌드하여

aar 형태의 Library 를 만들어줍니다.

./gradlew :extension-ffmpeg:assembleRelease

 

이제 본인의 프로젝트로 돌아온 뒤 app 하단의 libs 폴더에 해당 aar 파일을 집어넣어줍니다. 

 

좌측 상단에 필터를 Android 에서 Project로 바꾸면 app 모듈 하단에 libs 폴더가 있습니다. 없다면 생성하시면 됩니다.

 

그리고 Module Level 의 build.gradle 에 아래 구문을 작성해주시면 됩니다.

...
repositories {
    flatDir {
        dirs 'libs'
    }
}
dependencies {
	/* aar 파일의 파일명과 확장자(aar) 순으로 아래와 같이 넣어줍니다 */
	implementation name: 'exoplayer_ffmpeg_extension', ext: 'aar'
}

 

'Android > etc' 카테고리의 다른 글

[Android Gradle] 버전 카탈로그로 Gradle 관리하기  (0) 2024.03.28