글을 시작하기에 앞서 이 글은 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 |
---|