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

화면녹화 + 음성녹화 = 영상 / 자문 구합니다.

0 추천
1. 비디오 녹화 시작

2. 음성녹음버튼 클릭

3. 비디오 녹화 일시중지

4. 음성녹음 시작

5. 음성녹음 끝

6. 화면 녹화 시작

7. 화면 녹화 끝

8. 음성과 영상 merge

9. 결과물.mp4 추출

 

이런 영역은 첨이라 인코딩 디코딩 코덱 먹싱 디먹싱 등 용어 알아가면서 공부하고있는데요.

어떻게 구현하나 검색해보니
찾은게 MediaCodec, MediaRecorder MediaProjection, FFmpeg, FFmegFrameRecoder 등을 찾았습니다.

질문은

1. 이 중에 어떤것들을 써야되는 지 정리 좀 해주시면 고맙겠습니다.(주어진 시간이 많다면 좀 더 알아보고 고르겠으나 그게 아니여서 이렇게 문의를 합니다.)

2. 제일 궁금한게 화면 녹화와 음성녹화 후에 어떻게 합쳐야 하는지 너무 궁금합니다. 검색하며 알아낸건

화면 녹화한 영상과 음성을 프레임으로 가져와서 시간에 맞게 음성을 넣어주는 건데 뭘 써서 처리해야하는 지 알고 싶습니다.

 

감사합니다.
피에로 (150 포인트) 님이 2018년 11월 29일 질문

1개의 답변

+1 추천

* 인코딩/디코딩

RGB888의 경우 8bit별로 빨강, 녹색, 파랑색의 정보가 들어있으며, 이게 점 한개를 나타내는 색상 정보입니다.

720p영상은 1028x720개의 점으로 이뤄져있습니다. 따라서 8bit x 3의 점이 1280x720 개가 있어야 한개의 그림을 완성할 수 있습니다. 30fps의 동영상이라면 이러한 이미지가 1초에 30개 나온다는 의미로, 압축을 하지 않으면, 용량이 엄청 큽니다. 

그래서 압축하여, 사용하는데  보통 영상은 h264/h265(hevc)로 압축하며, 이러한 압축을 하는 과정을  인코딩이라 합니다.  이와 유사하게 화면에 보여주기 위해 압축한 데이터를 푸는것이 디코딩입니다.

* 코덱

인코딩/디코딩 시 사용하는 압축 방식입니다.ZIP/ RAR같이 영상 압축에 사용하는 규격이며, 영상은  h264/h265(hevc)/mpeg2, 오디오는 AAC/MP3/AMR/AC3/DTS 등이 존재 합니다.

*먹싱/디먹싱

영상을 표시하기 위해선 인코딩 한 데이터가  데이터가 어떤 형식으로 압축되어 있으며, 어느 타이밍에  디코딩 해서 보여줘야 하는지의 정보를 가지고 있어야 하며, 한 파일로 묶을 필요가 있습니다.

이러한 동작을 처리하는게 먹싱으로 동영상의 경우 mp4,mkv,avi,wmv같은 여러 형식으로 저장가능합니다.

디먹싱은 이걸 푸는 동작이라 생각하시면 됩니다.

 

1. 이 중에 어떤것들을 써야되는 지 정리 좀 해주시면 고맙겠습니다.(주어진 시간이 많다면 좀 더 알아보고 고르겠으나 그게 아니여서 이렇게 문의를 합니다.)

* MediaCodec 

=> 영상의 데이터를 인코딩/디코딩하는 기능을 합니다. 

MediaRecorder 

=> mic나 camera등에서 데이터를 입력 받아 인코딩/먹싱 해서 파일을 만드는 기능입니다. 

* MediaProjection

=> 안드로이드 폰에 표시 되는 화면 정보를 구할 때 사용하는 메소드입니다.

* FFmpeg

=> 앞서 설명드린 메소드는 안드로이드에서 제공되는 메소드로 안드로이드 단말에서만 사용가능하는것에 비해 , 안드로이드 뿐만 아니라 모든 영상을 처리하는 곳에서 사용하는 오픈소스입니다.

장점은 영상처리에 대한 거의 모든 기능을 지원합니다.  단점은 안드로이드 전용으로 만든 코드가 아니라. 영상 처리시 속도가 늦을 수 있습니다.

FFmegFrameRecoder

=> ffmpeg를 사용해 실제 영상을 녹화하는 기능으로 보입니다.

 

2. 제일 궁금한게 화면 녹화와 음성녹화 후에 어떻게 합쳐야 하는지 너무 궁금합니다. 검색하며 알아낸건 

화면 녹화한 영상과 음성을 프레임으로 가져와서 시간에 맞게 음성을 넣어주는 건데 뭘 써서 처리해야하는 지 알고 싶습니다.

=>  왜 따로 구한 후 합치는 작업을 하는지 이해가 안가네요...

한번에 구해 파일로 만들어도 된다면  MediaProjection 로 영상을 구하고 MediaRecoder를 사용하면 되십니다. 이 경우 아래 소스를 참조 해 보세요.

https://github.com/glt/ScreenRecorder

꼭 따로 구해 합쳐야 한다면, 

앞서 설명드린

1.  url소스에서 오디오/비디오 녹화 기능을 각각 빼고 저장하면 각각의 파일이 생성됩니다.

2. 이걸 MediaExtractor를 통해 읽으면 압축된 코덱 데이터를 구할 수 있습니다.

3. 2로 구한 데이터를  MediaMuxer로  넘기면 합쳐집니다.

 

익명사용자 님이 2018년 11월 30일 답변
어제 ffmpeg으로 해봐야 겠다라고 생각하고 ndk 설치하고 cygwin에서 ffmpeg 빌드를 하는데 오류가.....  윈도우 환경이라 더 그런지... 빌드스크립트를 다시 검색해서 수정, 또 수정 하다 안되서 잤는데 오전에 이 글보고 아 ffmpeg 안써도 되겠다는 희망을 가집니다.
모르는게 많아서 삽질을 많이 하고 있습니다.
상세한 답변 주셔서 이해가 더 많이 되고 있습니다.
2번 항목은 머릿속으로만 막연히 이런식으로 하면 되지 않을까라는 정도로 적은거라 아직 구체적으로 구현은 하지 않은 상태입니다. 화면 녹화 중간 중간 음성을 녹음해야하는 어플인데 왜 따로 구하냐는 물음에 몰라서 답변을 제대로 못드리겠네요. 주신 url 참고해서 이해하도록 하겠습니다.
정말 감사합니다!!
화면 녹화 중간 중간 녹음을 해야 하는 방식인가 보군요..
그러면,
MediaProjection 을 통해 구한 데이터를 mediaCodec을 통해 H264로 인코딩하고,
MediaMuxer로 넘겨  저장하다가,
녹음이 필요할 때 AudioRecoder로 나오는 PCM데이터를 MediaCodec을 통해 AAC로 변환하여 MediaMuxer 로 넘겨 저장하는 방식으로 구현 하시면 될 듯 하네요..

MediaMuxer 로 오디오 / 비디오 데이터를 저장하되, 오디오 데이터는 녹음버튼이 눌렸을 때만 넘기고, 비디오는 화면에서 구해지는대로 계속 넣어주는 방식입니다.

 메소드 사용법만 알면 레고처럼 잘 조합만 하면 되니.. 우선 api 사용법부터 읽혀가시다보면 구현가능하실 겁니다. 파이팅입니다.
오오 한 줄기 빛과 같네요!
구체적으로 설명해주셔서 고맙습니다.
말씀하신 방법대로 구현해볼께요.
정말 고마워요~~~~~ 복 받으실거에요!!!
...