Programming/Android(41)
-
3일에 걸친 리펙토링을 하고나서, 코드를 잘 작성하는 법에 대해 생각해봤다.
NVR/DVR에 저장되어있는 기록을 검색해서, 리스트 형태로 보여주는 UI에 추가기능을 구현해야했다. 전임자는 MFC를 이용해서 윈도우 프로그래밍을 하던 사람으로, 팀 내에 안드로이드 개발자가 관두게 되면서 잠시 땜빵식으로 일을 맡게 됐다고 한다. 안드로이드를 하던 사람은 커녕, 자바를 쓰던 사람도 아니었기 때문에 코드를 열어보기 전까지 어느정도의 각오는 되어 있었다. 하지만 현실은 생각보다 더 처참했다. channel이라는 변수명을 입력하다가 자동완성이 되지 않아서 다시 확인해보니, 해당 클래스 내 전체에서 chennel이라고 오타가 난 변수명을 그대로 사용하고 있는 것(심지어 참조하는 부분도 꽤 있었다.)은 애교. 버튼을 선택했을 때는 #ffffff로, 선택되지 않았을 때 #000000로 변경해주는 ..
2019.09.15 -
[NDK] Colorspace Conversion 관련 삽질기
이상하게 요즘 삽질을 계속해서 하는 느낌이다. 이번에는 구글의 정책으로 인해 64bits를 지원하도록 NDK 라이브러리를 수정하는 과정에서, Colorspace Conversion의 문제로 삽질을 하게 됐다. 일단 현재 GPU를 사용하지 않고 Colorspace Conversion을 처리하기때문에 성능상에 문제가 있기는 하지만, 어느정도 안정적으로 처리하는 것 까지만 확인하고 삽질기를 작성하기로 했다. 2019년 8월 1일부터 64bits를 지원하지 않는 앱은, 구글 플레이에 업데이트 할 수 없다. NDK를 사용하지 않는다면 상관이 없겠지만, 영상 스트리밍과 관련된 기능을 사용하고 있었기 때문에 필요한 라이브러리를 ARM64-v8a 칩셋에 맞게끔 다시 빌드할 필요가 있었다. 대표적인 예가 바로 FFmpe..
2019.07.04 -
[Android] Thread와 BlockingQueue에 대한 삽질기록
프로그램을 작성하다보면 여러개의 작업을 병렬로 처리해야 할 경우가 있다. 네트워크를 통해 영상 데이터를 전송받아서, 디코딩한 후 재생하는 경우가 대표적이다. 아무튼 이번에는 BlockingQueue를 사용한 코드를 수정하다가, 몹시 곤혹스러운 상황을 맞딱드리게되서 기록을 남기려고 한다. Thread.wait()이나 Thread.sleep()을 호출하지 않는데도 Thread의 상태가 WAIT으로 변경되고, notify()나 notifyAll(), Thread.start()를 호출하지 않아도 Thread의 상태가 RUNNING으로 변경된다. 내가 작성한 코드라면 금방 단서를 찾을 수 있거나 혹은 이런 경험이 있다면 원인을 찾기 좀 쉬울 것 같은데, 심지어 Thread의 상태를 검색해보면 위에서 언급한 메서드..
2019.06.28 -
cURL을 Android에서 사용하기 위해 Shared Library(libcurl.so)로 빌드하기(32bits/64bits/without-ssl)
2019년 8월부터 64bits를 지원하지 않는 앱은 구글 플레이에 등록할 수 없다. 그래서 지금 앱에서 어떤 라이브러리를 사용하고 있는지 확인하니, ffmpeg와 curl을 비롯하여 꽤 많은 라이브러리를 사용하고 있었다. ffmpeg을 어떻게건 빌드하긴 했는데, 64bits 라이브러리를 전부 포함하지 않아서 그런지 정상적으로 영상이 재생되지 않았다. 일단 할 수 있는건 curl을 포함한 나머지 라이브러리를 크로스컴파일하는 방법밖에 없었기에, 무작정 시작해봤다. 이 글에서는 Static Library에 대해서는 다루지 않는다. Android/iOS에서 사용하기 위한 curl을 Static Library로 빌드하기 위해서는, curl-android-ios, gcesarmza 깃허브를 참조하도록 하자. 체크..
2019.06.13 -
[삽질기록] RAW H.264(AVC)에 MP4컨테이너 씌우기 #4 / FFmpeg 재빌드(64bits)
RTP로 전달된 h264, h265 파일을 차곡차곡 RAW데이터로 저장한 뒤, FFmpeg를 이용해서 Muxing해보니 정상적으로 mp4파일이 생성됐다. 재생도 잘 된다. 파일이 생성되지 않는 것 같아서 잠시 당황했었는데, LG G5에서 PC에 파일 전송모드로 연결했을 때 파일을 제대로 표시하지 못하는 문제가 있었다. File Explorer 앱을 이용해서 확인해보니 파일 생성 및 Muxing에는 문제가 없어서, 일단 기능구현이 완성된 후 고민하기로 했다. 2019년 8월부터 64bits를 지원하지 않는 앱은 구글 플레이에 등록 및 업데이트가 불가능하기 때문에, FFmpeg를 다시 빌드하기로 했다. 이전의 빌드 스크립트에서 수정해야 할 곳은 다음과 같다. 이전의 빌드스크립트는 [삽질기록] RAW H.26..
2019.06.10 -
[삽질기록] RAW H.264(AVC)에 MP4컨테이너 씌우기 #3 / 테스트 코드를 이용하여 MP4 컨테이너 씌우기
MediaMuxer를 대신해서 FFmpeg를 사용하여 MP4 컨테이너를 씌우는 예제를 검색하다가, 깃허브에서 [ffmpeg-muxer, Akagi201](https://github.com/Akagi201/ffmpeg-muxer/blob/master/main.c) 코드를 발견했다. 정확히 Muxing을 하는 코드여서, 이 코드를 사용하여 테스트해보기로 한다. [삽질기록] RAW H.264(AVC)에 MP4컨테이너 씌우기 #2 / FFmpeg 빌드에서 muxer/demuxer모듈이 추가된 ffmpeg 라이브러리를 적용하고 빌드하니, 중간에 Got signal 에러를 뱉고는 앱이 멈춰버린다. 원인을 보니 오디오 파일을 입력하지 않았는데, 이로 인해서 코드 중간에 오동작이 발생해서 앱이 크러쉬되는 것이었다. 위..
2019.06.03