* 인코딩/디코딩
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로 넘기면 합쳐집니다.