검색결과 리스트
안드로이드/클론리플레이어에 해당되는 글 4건
- 2017.03.01 클론 리플레이어 x86_64/arm64 지원
- 2015.04.24 클론리플레이어 오디오 인코딩 변환 지원
- 2014.11.02 구간반복 학습앱 소개 20
- 2014.09.12 ringdroid 클론 반복 학습기
앱이 실행이 안된다는 보고가 있어서 이 문제를 살펴보았더니 인텔 CPU용 안드로이드 x86/x86_64에서 실행되지 않는 문제였다. 리포팅된 로그에 남아있는 오류는 대략 다음과 같았다.
java.lang.UnsatisfiedLinkError: dlopen failed: \ "/data/app-lib/org.dumpcookie.ringdroidclone-1/libffmpeg_jni.so" has unexpected e_machine: 40
특히 위 링크의 마지막 문서를 보면 1997년에 만들어진 Miller의 Recursive Make Considered Harmful 이라는 make에 대한 흥미로운 문서를 만날 수 있다. (2002년 2008년 개정판(?)을 pdf로 볼 수 있다)
ffmpeg + android로 검색해보면 나오는 다음의 문서를 통해서 automake/autoconf + cross compile 방식을 써서 Android.mk를 만드는 방법을 어느정도 살펴볼 수 있다.
안드로이드 펍의 ffmpeg NDK 컴파일 방법 강좌 시리즈
- http://www.androidpub.com/1645684
- http://www.androidpub.com/1646144
- http://www.androidpub.com/1646529
- http://www.androidpub.com/1646540
하지만 불행중 다행으로(?) 안드로이드용 FFmpeg을 보다 손쉽게 할 수 있는 방법이 있다. 공식 AOSP는 FFmpeg을 포함하지 않고 있으나 CyanogenMod 소스는 FFmpeg을 포함하고 있다. (반면 Android-x86 프로젝트 소스도 FFmpeg을 포함하고 있으나, 이 소스는 CyanogenMod에서 거의 그대로 가져온 소스였고, make파일도 불완전했다.) 그런데 CM13/CM14 소스는 이미 x86을 지원하고 있었지만 YASM에 관련된 수정을 해야 Android-x86 소스트리에서 정상적으로 컴파일이 된다. 즉, AOSP/CM 최신 빌드 스크립트는 이미 YASM을 지원하고 있기 때문에 CM소스에 들어있는 ffmpeg의 x86+YASM관련 fix가 필요 없다. YASM에 관련된 fix를 제거하고 x86_64에 대한 지원을 추가 수정 해주면 x86뿐만 아니라 x86_64 역시 컴파일이 잘 된다.
Android용 mpg123는 검색해보면 몇가지를 찾을 수 있지만 대개 최신 mpg123이 아니고 x86도 지원하지 않는다. 기존에 있던 Android.mk + configure + Makefile을 바탕으로 Android.mk를 만들고 AOSP 소스트리에서 컴파일을 할 수 있었다.
일반적인 automake/autoconf 방식은 configure를 통해서 config.h를 생성시켜야 하는데 호스트는 x86_64이고 타겟을 arm용으로 빌드하는 cross compile 방식을 써야 한다. configure를 통한 cross compile은 대개 잘 지원하기는 하지만 이 방식의 각각의 라이브러리마다 약간씩 차이가 있으므로 configure.* 파일과 Makefile.*의 내용을 잘 살펴보면서 Android.mk를 작성해야 한다. 이 부분은 따로 설명하고 https://github.com/wkpark/mpg123에 올려두었다.
위에서 기술한 방식으로 x86_64로 빌드해서 성공하기는 하였지만, 이번에는 최신 스마트폰을 대응하기 위해서 arm64에 대해서 또 다시 빌드하려고 하니 또 AOSP트리를 별도로 컴파일 해도 하나 하는 고민에 빠졌다. 물론 이런 식으로 별도의 CPU마다 AOSP 소스 트리를 따로 마련해도 되겠지만 이렇게 하는 것은 뭔가 낭비인 것 같아서 이번에는 ndk-build를 조금 고치고 AOSP식의 소스를 관리하면 편리할 것 같아 ndk-build 스크립트를 조금 고쳐보았다. (ndk-build의 장점은 무었보다도 APP_ABI := armeabi armeabi-v7a arm64-v8a x86 x86_64 라는 식으로 지정하여 각기 다른 CPU별 바이너리를 보다 쉽게(?) 빌드할 수 있다는 점일 것이다.)
ndk-build 빌드 방식이 AOSP 빌드시스템과 다르게 불편한 점은 바로 외부 라이브러리의 의존성 문제이다. 예를 들어서 FFmpeg을 빌드하기 위해서 외부 라이브러리 lame을 사용하는 경우에 lame 라이브러리에 대해서 import-module 방식을 쓰거나 ($(call import-module, external/lame)과 같은 줄을 Android.mk에 추가해 줌) 혹은 PREBUILT_SHARED_LIBRARY 방식을 써야 한다. 그러나 이는 AOSP식의 빌드시스템에 비교해서 여간 불편한게 아니다. 또한 import-module 방식을 쓰는 경우에는 이미 빌드한 외부 라이브러리가 다시 빌드되는 현상이 있었다(이는 ndk-build의 버그로 보인다. 그밖에, Android.mk를 고칠때마다 다시 빌드되는 현상도 버그로 보였다. NDK_OUT을 동일하게 지정해도 여전히 다시 빌드되는 현상은 마찬가지였다. 소스를 추적해보니 아니나다를까 해당 오브젝트 파일의 디펜던시에 Android.mk 및 Application.mk가 지정되어있었다. 이를 제거하면 Application.mk / Android.mk를 수정해도 재컴파일 되거나 하지 않았다. 만약 재컴파일 해야 하는 경우라면 -B 옵션을 넣어 ndk-build -B 라는 식으로 실행해야 한다.)
import-module을 사용하는 방식이 PREBUILT_SHARED_LIBRARY를 사용하는 것 보다 Android.mk를 덜 수정하는 방식이어서 더 나아보였지만 AOSP 빌드시스템과 비교해보면 너무도 불편한 것 이었다. 즉, AOSP 빌드 시스템의 경우 external 하위에 무수한 외부 라이브러리들의 의존성이 자동으로 판별되며, 이미 빌드된 외부 라이브러리를 그대로 재사용 하게 된다는 점이 ndk-build와 비교해서 가장 큰 차이점이었다.
그리하여 삽질끝에 ndk-build 스크립트의 다음과 같은 내용을 수정하였다.
이정도 수정을 하니 ndk-build 시스템을 AOSP 빌드시스템과 마찬가지로 외부 라이브러리 의존성에 대해서 덜 걱정하도록 해 주었고 쓸만해졌다.
이렇게 수정을 한 ndk-build를 통해서 arm64용으로 FFmpeg + lame + 기타 jni 소스등을 빌드해서 테스트하여 잘 실행이 됨을 확인하였다.
(※주의: arm64와 같이 64비트의 경우는 AOSP 롤리팝 이후부터 지원됨)
안드로이드 6.0 이후부터는 text relocations 문제가 있는 shared 라이브러리를 사용하는 경우 앱이 실행이 되지 않는다. arm64/x86_64에서는 이 문제가 없거나 해결하기 쉬운 편이나, 유독 x86 아키텍쳐에서는 text relocations 문제를 쉽게 해결하기 어려우며 이러한 문제가 발생하게 된다.
앱이 타겟 API가 22 이하로 빌드된 경우에는 경고만 뿌리고 실행이 정상적으로 되지만, 클론 리플레이어의 경우는 타겟 API가 23이며 text relocations 오류를 내며 앱이 실행조차 되지 않는다. 그래서 원래는 x86 아키텍쳐용으로 FFmpeg/mpg123 등등을 컴파일하고 지원하려고 했지만 text relocations 문제로 인해 x86을 당장 지원하기는 어렵게 되었고 x86_64 및 arm64 지원용 라이브러리를 우선적으로 테스트하게 되었던 것이다.
Text relocation 문제가 있는 라이브러리는 다음과 같았다.
클론리플레이어 오디오 인코딩 변환 지원 (0) | 2015.04.24 |
---|---|
구간반복 학습앱 소개 (20) | 2014.11.02 |
ringdroid 클론 반복 학습기 (0) | 2014.09.12 |
클론 리플레이어는 FFmpeg 라이브러리 + JNI wrapper를 사용하여 FFmpeg에서 디코딩 가능한 가능한 일부 동영상 및 오디오를 함께 지원하고 있습니다.
FFmpeg의 인코딩도 가능하기때문에 이를 활용할 수 있도록 클론리플레이어 버전 2.89부터는 FFmpeg 인코딩 JNI wrapper를 함께 제공하며, MP3 / FLAC / WAV 등등의 널리 쓰이는 오디오포맷으로 보다 손쉽게 변환이 가능한 기능을 제공하게 되었으며,
버전 2.90부터는 이 기능을 좀 더 확장하여 아래와 같은 모습으로 사용하실 수 있게 되었습니다~
현재 오디오로 인코딩 가능할 수 있도록 설정되어있는 포맷은 WMA, M4A, FLAC, WAV 등등입니다. FFmpeg으로 변환 가능한 여러 포맷은 추후에 제공하도록 할 계획입니다~
또한 예전에는 MP4 등등의 동영상 파일의 경우 특정 구간을 잘라서 저장하는 기능을 제공하지 않았으나, 이제는 MP4 등등의 동영상의 특정 구간을 잘라서 MP3/FLAC/WAV 파일로 저장할 수 있게 되었습니다~
(위 스크린샷은 클론 리플레이어 2.90 개발판에서 찍은 것입니다.)
클론 리플레이어 x86_64/arm64 지원 (0) | 2017.03.01 |
---|---|
구간반복 학습앱 소개 (20) | 2014.11.02 |
ringdroid 클론 반복 학습기 (0) | 2014.09.12 |
찍찍이 류의 구간 반복학습 앱을 한번쯤은 써보았을 것이다. 상당수의 앱은 A-B구간 반복만을 지원하며, 사용자가 수동으로 설정을 해야 비로소 선택된 구간이 반복되게 된다.
여기서 한 걸음 더 나아가, 오디오를 자동 분석해서 문장 단위로 자동으로 끊어서 구간반복을 보다 쉽게 지원하는 앱들이 있는데 이를 여기서 소개해보려 한다.
워크오디오북은 파형 분석속도가 타의 추종을 불허한다. 1시간 이상 분량의 MP3도 파형 분석 속도가 10초 수준이다. 워크오디오북에서는 파형을 모두 읽는 방식이 아니라 MP3의 각 프레임의 global_gain값만 읽어 보여주는 방식이다. 또한, 모든 음성 구간을 분석하는 것이 아니라, 보이는 부분의 구간만 재빠르게 분석하 매우 빠르다. 반면 본인이 개발하고 있는 클론리플레이어는 MP3 공개 라이브러리중에 가장 빠르다는 libmpg123을 사용하는데도 1시간짜리 mp3 분석이 1분 가까이 소요된다. 최초 시동시에 작동 반응 속도를 빠르게 하기 위해서 2015년 5월(?) 버전부터 mp3의 앞부분 ~2분 분량 정도를 무조건 읽고나서 즉각적으로 화면으로 보여준 후에, 나머지 파일은 백그라운드로 읽고, 모든 것이 완료되면 다시 나머지 분량의 파형을 갱신해서 화면에 표시하도록 하였으며,이러한 방식으로 로딩시간으로 인해 기다리게되는 불편함을 어느정도 해소시켰다.
클론 리플레이어의 그밖에 특징
클론 리플레이어 x86_64/arm64 지원 (0) | 2017.03.01 |
---|---|
클론리플레이어 오디오 인코딩 변환 지원 (0) | 2015.04.24 |
ringdroid 클론 반복 학습기 (0) | 2014.09.12 |
아직 마땅한 이름은 정하지 못했고, ringdroid에 아주 초 간단 Voice segmentation 기능을 추가하고 개선시킨 반복 듣기용 영어 어학 학습기를 만들어봤습니다.
ringdroid가 워낙 잘 만든 놈이라서, 기능 추가하는 것도 어렵지 않고, 기존에 나와있던 반복 학습기들의 단점 보완을 목표로 해서 개선시키고 있습니다.
장점
1. 예쁘다. :)
2. UI가 쉽고 간단.
단점
1. JLayer가 너무 느리다ㅠ : 너무 느리다면 waveform을 캐싱하는 방법도 고려해야 할 듯.
2. Voice segmentation 개선 필요. : 현재는 silence 경계 판단이 매우 매우 간단한 알고리즘 (최소 noise + rms 체크)
개선점
1. Voice Recognition을 사용한 자동 자막 기능. (반자동 기능으로?)
2. 배터리 절약 모드(?) - 색상을 어둡게 하거나 몇가지 선택 가능한 테마로
3. 이어폰으로 간단한 제어가능하도록
4. 음악 파일 디렉토리 지정 가능하도록
5. OGG 지원 (일단 읽기만이라도)
클론 리플레이어 x86_64/arm64 지원 (0) | 2017.03.01 |
---|---|
클론리플레이어 오디오 인코딩 변환 지원 (0) | 2015.04.24 |
구간반복 학습앱 소개 (20) | 2014.11.02 |
RECENT COMMENT