마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

안드로이드 모바일 생방송어플 영상처리 관련 부분 질문드립니다. [closed]

0 추천
안녕하세요 선배님들,

현재 대학생활하면서 독학으로 안드로이드 어플을 만들고 있는 학생입니다.

안드로이드에서 영상쪽을 다뤄보신분이나 영상쪽 잘 알고 계신분이 있다면 도움주시면 정말 감사하겠습니다.

안드로이드 1년정도 공부한 상태이구요. 이번 어플이 2번째로 만드는 어플입니다.

(클라이언트 UI부분, 서버통신과 DB는 기본적인건 다뤄본 상태입니다)

 

제가 만들고자 하는 어플은 아프리카 TV, Twitch, Periscope 등과 같은 유명한 어플에서 제공하는 기능 중 하나인

모바일 방송이 가능한 어플입니다. 안드로이드 핸드폰에 장착된 내장 카메라로 "방송하기" 버튼을 누르면

실시간 영상을 녹화하면서 다른 안드로이드 기기들 또는 웹상에 스티리밍하는게 목표입니다.

실제로 출시를 목표로 하는 어플은 아니고 영상쪽에 관심이 생겨서 졸업한 후 취업할때 포트폴리오로 사용도 하면서

어떻게 구현 되는지 궁금해서 직접 개발해보고 싶어 시작하게 되었습니다.

 

약 두달 동안 열심히 구글링을 하면서 이것저것.... 이론적인 부분과 개념을 쌓아왔는데 아직까지 답답한 부분이

한두가지가 아니네요.......영상쪽은 너무 생소하다보니 한없이 막막합니다 ㅜㅜ

너무 답답한 나머지 선배님들에게 도움을 요청하려고 이렇게 글을 작성하게 되었습니다.

 

지금까지 조사한 내용은 동영상에 대한 기본적인 이해, 코덱, 스트리밍 프로토콜(RTP, RTSP, RTMP), FFMPEG,

HLS, MPEG-DASH등 여러가지 조사를 해봤습니다.

 

조사를 해보면서 스트리밍 방식으로는 MPEG-DASH 방식으로 스트리밍을 할 예정이고 서버는 Nginx를

사용할 생각입니다. 처음엔 RTMP를 사용해야 된다, RTSP로 서버에 넘겨줘야한다, HTTP방식인 HLS 방식으로

해야한다...이것저것 읽다보니 개념이 도통 잡히지 않았습니다. 하지만, 일주일정도 계속해서 읽다보니 스트리밍 기술의

발전에 대해서 알게되었고 RTSP, RTMP 방식에서 현재는 HTTP 서버를 이용한 Adaptive Bitrate Streaming방식을

사용한다는걸 알게되었고 Apple사에서 만든 HLS와 ISO에서 국제 통용화한 DASH 중에 고민하며 차이점에 대한

문서들을 읽어보면서 DASH 방식을 사용해보자 라고 선택했습니다...

 

지금까지는 제가 약 두달간 찾아본 부분을 설명드렸습니다.  

제가 지금까지 조사해보면서 아직까지 궁금한 부분은 외부기기 (웹캠, 외부카메라장치)가 아닌 휴대폰 내부 장착된

카메라를 통해 녹화를 하는 부분입니다. 어떤 기술을 사용해서 녹화를 해야하고 그 녹화하는 부분을 실시간으로

nginx 서버까지 전달해야 할까요?

 

[녹화하는 부분은 쉽게 MediaRecorder를 사용해서 하는 것 같았는데 간단한 최신예제는 찾기 힘들더라구요...

계속해서 구글링을 하다보니 어느분은 OpenCV를 이용해서 영상 프레임을 가져와야 된다는 말도있고.....]

 

그리고, 전체적인 프로세스가 제가 생각하고 있는게 맞는지 궁금합니다.

(이것 저것 보다보니 엉켜버린것 같습니다 ...ㅠㅠ)

 

1. "방송하기"를 누르면

 

2. 디폴트인 후방카메라로 미리 Preview 보여주면서 하단에 "방송시작" 버튼을 누르면 방송이 시작.

제가 정해놓은 초 단위의 프레임을 nginx서버로 보낸다 (여기서 FFmpeg로 인코딩을 해야하는지...서버에서 해야하는지도...궁금합니다)

 

3. 서버에서는 특정 컨테이너 포멧을 디코딩해서 프레임단위로 저장하고 다른 안드로이드 기기에 전달한다

(그럼 그 기기들은 어떻게 재생을 시켜야할까요....Player를 사용해야되는데 DASH를 지원하는 Player를 보니

안드로이드 자체에선 지원을 안하고 ExoPlayer라는게 있던데...)

 

전체적으로 개념을 잡기가 힘든게 영상인것 같습니다.

생각해야 될께 너무나 많네요

최대한 조사한 부분과 모르는 부분을 나눠서 적어봤는데,

긴 글 읽어주시느라 일단 감사드리고 부족한 부분 또는 이 부분에서 제가 이해를 못하고 있구나...하는게 있다면

말씀해주세요. 감사하겠습니다.
질문을 종료한 이유: 해결하였습니다.
체이써 (170 포인트) 님이 2016년 12월 1일 질문
체이써님이 2017년 3월 19일 closed

1개의 답변

+1 추천

방향은 맞는 듯 합니다.

1. 여기서 FFmpeg로 인코딩을 해야하는지...서버에서 해야하는지도...궁금합니다

->  ffmpeg로 하려면 카메라 데이터 구하기도 어렵구, 구해도 속도 이슈가 있습니다.

서버에서 할 경우 RAW 데이터를 전송해야 하는데, 용량이 상당해서, 네트워크 단에 부하가 걸릴 겁니다.  MediaCodec를 통해 H264로 인코딩하여 전송하는 것을 추천합니다.

전송 하는 것은 RTP/TCP/RTSP/RTMP 중 편하시는 것으로 하시면 되니, 서버에서 DASH로 변화시키는 곳에서 쓰기 편하는 데이터로 보내시는게 좋습니다.  

물론  TCP사용시 딜레이 이슈가 있을 수 있으며,

TS나 FLV로 컨테이너를 씌워 보내면, 서버에서도 처리를 해야하니.. 

 RTSP에 H264 데이터 자체를 보내는게 제일 깔끔하긴 합니다.

 

2. 그 기기들은 어떻게 재생을 시켜야할까요...

- 생각하신대로  DASH면 ExoPlayer나 MAL Player 중 편하신걸 사용하시면 됩니다.

 

 

 

익명사용자 님이 2016년 12월 1일 답변
빠른 답변 정말 감사드립니다.

혹시 녹화하는 부분은 MediaRecorder로 하는게 맞을까요?
다른 방법으로 녹화할수도 있을까요?
최신예제(deprecated가 안된)를 찾기가 힘들어서 여러가지 키워드로 구글링을 하다보니 OpenCV를 사용하는 방법과
FFmpegFrameRecorder를 사용해야 된다는 말도 있더라구요...너무햇갈리네요...

그리고 안드로이드에선 네트워크 프로토콜로 RTP, RTSP, HLS 만 지원하더라구요.
https://developer.android.com/guide/appendix/media-formats.html
RTSP H264로 데이터를 보내는게 깔끔하겠군요 ! (감사합니다 꾸벅..ㅜㅜ )

전체적인 프로세스로 볼때 RTSP에 H264 로 서버에 보낸 후에 서버에서 다시 클라이언트딴으로 보내면 ExoPlayer로 VOD 재생시키면 되는거 맞나요?

답변 다시한번 감사드립니다! 많은 도움이 되고 있습니다.
녹화하는 부분은 MediaRecorder로 하는게 맞을까요?
 -> 아니요,  가능은 하지만 이걸로하면, 파일로 생성되고, mp4, 3gpp, 등 선택한 것에 따라 컨테이너가 씌워집니다. 이 컨테이너를 제거 하셔야 합니다.
앞서 말씀 드렸듯이 Camera 영상을 MediaCodec을 통해 H264로만 인코딩하시는게 좋습니다.

전체적인 프로세스로 볼때 RTSP에 H264 로 서버에 보낸 후에 서버에서 다시 클라이언트딴으로 보내면 ExoPlayer로 VOD 재생시키면 되는거 맞나요?
=> 서버에서 RTSP를 받아 H264를 DASH 컨텐츠로 만든다면, EXO에서 받아가면 재생됩니다. 참고로 EXO의 경우 RTP,RTSP는 지원하지 않습니다.

단지 서버에서 H264를 받아 DASH로 만들어주는 것을 구현하시기가 쉽지는 않으실 듯 하네요..ㅎㅎ

아래 링크는 Camera API를 사용하여 ,카메라에서 데이터를 구해 RTMP로 전송하는 코드입니다.
https://github.com/ossrs/srs-sea

Camera2 API를 사용해 인코딩한 방법도 이 사이트에 다른분에게 가이드 해 드린적 있으니. 필요하시면 찾아보세요.
좋은 답변 감사합니다. 개념잡는데 많은 도움 된 것 같습니다.

MediaCodec을 좀 더 살펴봐야겠네요. 내부 카메라로 영상을 촬영하면서 MediaCodec을 통해 H264로 인코딩해야 되는 부분 맞나요??

저는 영상 촬영하는 코드를 MediaRecorder를 이용해야 되는줄 알았는데 MediaRecorder를 사용하면 시작 -> 종료하면 바로 mp4 와 같은 확장자를 가진 파일이 생성이 되는군요...ㅜㅜ 그럼 영상촬영하는 것부터 어떻게 구현해야 되는지 좀 더 검색을 해봐야겠네요. (아래 링크해주신 예제를 응용하면 바로 알수도 ...있겠네요)

-----------------------------------------------------------------------------------------------------------
아래 링크는 Camera API를 사용하여 ,카메라에서 데이터를 구해 RTMP로 전송하는 코드입니다.
https://github.com/ossrs/srs-sea
-----------------------------------------------------------------------------------------------------------
검색하면서 봤던 예제인데요. 이 예제는 RTMP로 하기 때문에 자세히 안보고 넘어갔었는데
응용을 해서 Camera2 API를 사용해서 RTSP로 전송하는 코드를 만들어봐야 겠네요.

정말 큰 도움 됬습니다. 감사합니다.
...