VideoStreaming

결과화면

result

시연영상

Watch the video

(https://www.youtube.com/watch?v=QKAQjdldyWg)

UI Design

사실 고민하지 않았다. 주어진 시간은 2개월 남짓이었고, 기능 구현을 완성한다는 보장도 없었던 터인지라 UI를 신경쓰지는 못했다.
그냥 필요한 버튼들만 구성해놓았고, 동영상 플레이어 기능 구현에 집중했다.

Wifi-Direct

생각보다 많이 구리다...
거의 모든 핸드폰이 와이파이 다이렉트 기능을 제공하긴 하는데,
안드로이드 스튜디오에서 와이파이 다이렉트를 사용하려고 하면
인식을 못하는 경우가 굉장히 많았다.

또 호스트를 정하는 과정에서 LG핸드폰은 한 번 호스트를 잡으면
로그를 삭제하기전까진 호스트를 놓지 않으려고 한다.
이것 또한 엄청 스트레스 많이 받았다. ㅠ

어쨋든 근거리 통신에서 사용할 수 있는 수단이 이것 밖에 없어서
사용했지만, 와이파이 다이렉트는 별로인걸로..

Network

사실 이거 만들면서 80% 이상의 시간을 할애한 부분이다.
네트워크 프로그래밍 수업때 소켓을 처음써보고 2년만에 다시 사용했다.
그 당시 프로젝트 할 때는 로컬에서 통신했기 때문에 아이피는 따로 생각할
필요가 없었는데, 이건 3대 각각 다른 핸드폰에서 통신하기 때문에
각각 와이파이 다이렉트로 연결된 IP 알아내고 연결하고, 화면 전환할 때 마다
소켓정보, IP정보들을 건네줘야 했다.

메인 Thread에서는 소켓이나 네트워크 통신이 안되는 것 조차도 몰라서
며칠을 헤매다 Async Task를 알게 되었다(사실 이 프로젝트는 Async Task보단
그냥 쓰레드를 사용하는게 훨씬 좋았다.). 근데 이게 또 문제인게, 작업이 끝나면
그대로 작업만 마치면 되는데, 소켓이 끊어져 버려서 더 이상 네트워크 통신을 할 수
없는 상태가 되어버렸다. (네트워크 중에서도 가장 힘들었던 부분)

반복문 써서 소켓 안끊어지게 해보기도 하고, Async Task에서 그냥 무한루프로
화면이 바뀌든 어쩌든 데이터 계속 보내보기도 하고, 계속 삽질했던 것 같다.

결국 해결한 방법은 통신이 한 번 끝나면 해당 비동기 작업 끝내면서 소켓 끊어버리고
다시 비동기 쓰레드 생성하면서 소켓 연결을 다시 해줬다.
그냥 서버 하나 만들어 놓으면 모든게 해결되지만, 프로젝트 설계 당시 와이파이 다이렉트를
사용할 것이라고 호언장담을 해놨기 때문에 별 수 없었다.....
(심지어 서버가 어떻게 돌아가는지 구조적인 부분도 몰랐음)

Display

네트워크 파트를 끝내고 마지막으로 구현한 부분이다.
3대의 핸드폰을 나란히 놓고, 놓인 핸드폰들의 화면 크기에 맞춰
동영상의 사이즈를 알맞게 나눠주면 된다.

핸드폰 화면크기는 DisplayMetrics를 통해 알아낼 수 있었다.
DisplayMetrics로 핸드폰의 dpi(dot per inch)와 화면 가로, 세로의 mm 길이를 구했다.

이렇게 구한 가로길이를 전부 더한뒤, 모든 VideoView의 크기를 합한 크기만큼으로 설정한다.
그리고 핸드폰의 위치에 맞게 VideoView의 위치를 조정해주면 된다.
그림으로 보면 다음처럼 되는 것이다.

제목 없음 제목 없음2 제목 없음3

근데 VideoView의 가로만 늘려줘서 그런지 늘어나지 않은 세로의 크기에 맞춰서 재생이 된다.
그래서 동영상의 해상도를 이용해 가로를 늘린만큼 세로도 늘려줬다...ㅎㅎ

결과적으로 핸드폰 각각에서 위치에 맞는 영상을 재생하며 이어진 화면으로 동영상을 볼 수 있게 해준다.