안드로이드 IP Camera Rtsp 접근을 위한 FFmpeg 빌드
안드로이드 FFmpeg 빌드
이번 예제의 시작은 집안에 굴러다니던 아주 오래된 IP Camera에서부터 시작되었습니다.^^ 취미로 안드로이드 공부를 하고 있던 어느 날 서랍을 정리하고 있는데 예전에 한참 유행했던 IP 카메라가 하나 나오더라고요. 보통 밖에서 집안의 상황을 볼 때 사용했던 녀석인데 그동안 저도 모르게 무슨 수난을 겪었는지 이 모양이 됐네요.ㅎ
뼈대만 앙상하게 남아있지만 4~5년 전에는 나름대로 괜찮았던 LW130W라는 모델의 IP Camera입니다.
여하튼 그렇게 우연히 발견된 이 IP Camera를 스마트폰에서 볼 수 있는 안드로이드 앱을 하나 만들어보고 싶어지더라고요. 물론 이 카메라를 볼 수 있는 전용 App이 있습니다. 하지만 호기심이 발동해서 직접 한 번 만들어보고 싶어졌고.... 저의 삽질은 그렇게 시작되었습니다. 그리고 어찌어찌 해서 성공을 했는데요.
(혹시 이 글을 보는 분들이 계신다면..... 초보가 다른 분들의 자료들을 보면서 겨우 따라 만든 거라서 전문성은 없습니다. 그냥 초보의 노트정리라고 생각하고 보시면 좋을 거 같고.... 부족한 부분은 제가 보고 따라 한 분(http://dev2.prompt.co.kr/77)의 글을 참고하시면 도움이 될 거예요.)
그래도 이 앱을 만들어보면서 그동안 한 번도 접해보지 못한 android NDK도 조금 익히고 FFmpeg에 대해서도 조금은 알 수 있는 계기가 되었답니다. 처음에는 단순하게 URL 주소를 가져와서 SurfaceView와 MediaPlayer를 이용해서 화면에 뿌리면 되겠구나 생각했는데 무지한 초보의 어리석은 생각이었습니다. 그렇게 쉽게 될 리가 없죠.ㅎㅎ
그래서 이 IP 카메라의 접근 형식을 보니...
이런 식으로 프로토콜은 RTSP, Path는 /Master-0으로 접근을 해야하더군요. 개인적으로 영상 관련 쪽으로는 아는 게 전혀 없고 지금도 저것들의 장단점은 모르지만 앞으로 하나씩 익혀보기로 하고 일단 가장 유용하다고만 알고 있는 FFMPEG로 접근해보기로 했습니다. 그리고 ffmpeg를 사용하기 위해서는 Android NDK를 사용해야 한다는 것도 처음 알게 됐고 일단 NDK 설치와 FFmpeg 빌드를 시도해보기로 했습니다.
[참고]
처음에는 안드로이드 NDK를 사용해보기 위해서 안드로이드 스튜디오에서 최신 버전으로 받아서 시도를 했었는데... 이게 며칠 동안의 제 여가 시간을 모두 빼앗아 가는 원인이 되었습니다.ㅠ.ㅠ 이 NDk마다 빌드하는 과정에서 사용되는 스크립트의 문법이 조금씩 다른 거 같더라고요.;; 여하튼 저는 앞에서 언급한 분의 글을 보고 NDK13 버전과 FFmpeg는 3.2 버전을 사용해서 빌드를 했습니다.
1. OS는 Mac 10.13.3이고요.
2. Android Studio는 3.0.1을 사용하고 있습니다.
3. NDK는 13이고 FFmpeg는 3.2입니다.
우선 Android NDK 13을 내려받았습니다.
https://developer.android.com/ndk/downloads/older_releases.html?hl=ko#ndk-13b-downloads
그리고 FFmpeg는 3.2 버전을 받았고요.
https://www.ffmpeg.org/download.html
각각 압축을 푼 다음 ffmpeg를 NDK 폴더의 Sources 안에 넣습니다.
이제 ffmpeg폴더 안으로 들어가서 파일 하나를 약간 수정하고 새로운 파일도 하나 만들어야 합니다.
수정할 파일의 이름은 Configure입니다.
Configure 중간 부분에 SLIBNAME_WITH_MAJOR 부터 SLIB_INSTALL_LINKS까지 네 줄을 그림과 같이 바꿔주면 됩니다. (혹시 필요하신 분들이 계실지 몰라서 수정할 부분과 생성할 파일은 아래 텍스트 파일로 첨부해 놓을게요. 복사해서 사용하시면 될 거예요.)
SLIBNAME_WITH_MAJOR='$(SLIBNAME).$(LIBMAJOR)'
LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"'
SLIB_INSTALL_NAME='$(SLIBNAME_WITH_VERSION)'
SLIB_INSTALL_LINKS='$(SLIBNAME_WITH_MAJOR) $(SLIBNAME)'
아마 처음에는 위와 같이 되어 있을 거에요. 이걸 아래 내용으로 바꿔줍니다.
SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"'
SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
SLIB_INSTALL_LINKS='$(SLIBNAME)'
다음은 안드로이드 빌드를 위한 새로운 sh파일을 하나 만들어야 하는데요. 파일의 이름은 build_android.sh로 만들었으며 내용은 다음과 같고 아래 파일 받아 복사해서 사용하셔요.
맨 위에 NKD 경로만 현재 컴퓨터에 저장된 경로를 지정해주면 됩니다. 그리고 앞에서도 잠깐 언급했지만 이 파일은 NDK13에서만 제가 원하던 결과가 나오더라고요. 저는 처음에 NDK15버전으로 진행하다가 안돼서 적지 않은 시간을 허비했네요.ㅠ.ㅠ (빌드는 되는데 보고 따라 하는 글과 다른 결과가 나와서...ㅎㅎ 어떤 내용인지는 아래쪽에서 확인하기로 하고요.)
그렇게 수정과 생성을 마친 뒤에 각각 저장을 하고 터미널을 열고 이 파일이 있는 폴더로 이동을 합니다.
그리고 chmod +x buiild_android.sh 명령어를 입력해서 앞에서 작성한 파일에 권한 주고요.
./build_android.sh 명령어를 실행해서 빌드를 시작합니다. 여기까지 했으면 잠깐 쉬다고 오셔요. ㅎㅎ 이 빌드 과정이 컴퓨터 성능에 따라 다르겠지만 딸리는 제 컴퓨터에서는 거의 20분 가까이 소요되더라고요.ㅎ PC 앞에서 끝나기를 기다리면 시간 아까워요.^^
그렇게 한참의 시간동안 빌드를 진행한 후에는 ffmpeg 폴더 안에.... 아까는 안 보이던 android라는 새로운 폴더가 하나 생성됩니다.
그 android 안에는 arm 폴더가 있고 또 안에는 include, lib 폴더가 생성된 걸 확인할 수 있습니다. NDK15에서도 앞에서 만든 sh 파일로 빌드는 되더군요. 그런데 이 폴더가 생기지 않아서 좀 당황했어요. ㅎㅎ
다른 분들이 정리해놓은 글을 보고 따라 하는 수준의 실력에서 그분들과 다르게 실행되니까 어떻게 해야 할지 막막하더라고요. 물론 지금은 약간 대처(?) 할 수 있을 거 같기는 한데 처음 따라 할 때 이 폴더가 안생겨서 많은 시간을 허비했던 게 생각나서 저처럼 공부하시는 분들 중 아까운 시간을 허비하는 분들이 없기를 바라는 마음에 앞에서 자꾸 언급을 했었네요. 될 수 있으면 각각의 버전(NDK13, FFmpeg3.2)을 맞춰서 해보시고요.
이번 글은 여기서 마무리하고 다음 글에서 이어서 정리를 할게요. 수고하셨습니다.