2. 순서
1. 영상과 소리
2. Codec(Encoding, Decoding)
3. 안드로이드 화면 녹화
4. Demonstration
5. Q &A
3. 동영상이란?
한정된 시간속에서의 연속된 이미지의
모음.
사람 눈의 잔상 효과 이용.
FPS = 초당 프레임수
영화에서는 24fps
한국, 미국 등 TV 30fps
youtube 직캠 60fps
Vibe, 오큘러스 리프트 90fps
최신 휴대폰 카메라, 액션캠 240fps
4. 동영상 압축
저장 장치 용량, 네트워크 상에서의
데이터 전송률의 한계로 영상 데이터의
압축은 필수이다.
5. 소리란?
주파수 : 음의 진동하는 횟수. 주파수를 표현하는 단위는 Hz(헤르츠)라 하며 초당 진동 수를
나타낸다.
진폭 : 주기적으로 진동하는 음파의 높이를 가르킨다. 음파의 크기를 나타내는 단위는 음압레벨
(SPL) 또는 데시벨 이다.
7. 코덱(Codec; COder and DECoder)
음성 또는 영상의 신호를 디지털 신호로 변환하는 코더와
그 반대로 변환 시켜주는 디코더를 통틀어 부르는 말.
안드로이드에서 지원하는 포맷 및 코덱 목록
확인
8. 인코딩 / 디코딩 이란?
- 인코딩 : 부호화라고 하며, 원본 이미지 시퀀스를 알고리즘에 따라 압축하는 것.
- 디코딩 : 복호화라고 하며, 압축한것을 다시 해제하는 것.
인코더
디코더
인코딩된
영상or음성
또는
코덱
9. 비디오코덱 ; H.264 AVC Base Profile
- 안드로이드 3.0 이상 지원
- 지원 컨테이너 타입 ; 3gp, mp4, ts
- 대부분의 Bit-Rate 에서 50% 이상의 압축률 고품질 영상
- 에러 복원 기능
- 높은 네트워크 이식성을 가짐
10. 오디오코덱 ; AAC-LC(Low Complexity)
- 디지털 오디오에서 쓰이는 표준적인 손실 데이터 압축방식
- 가장 기본적인 AAC 프로파일
- 샘플레이트 : 8kbits/s~192kbits/s
- 비트레이트 : 256kbits/s
- 최대 48채널까지 제공
- 지원 컨테이너 타입 ; 3gp, mp4, ts
12. 화면 녹화 프로세스
1. 비디오 코덱으로 부터 얻은 Surface를 통해 VirtualDisplay를 생성하였다면,
비디오코덱의 출력버퍼로부터 부호화된 프레임 버퍼를 얻을수 있다.
2. AudioRecord로 부터 얻은 오디오 버퍼(PCM)를 오디오 코덱의 입력버퍼에 넣고
큐에 넣는다면, 출력버퍼로부터 부호화된 오디오 버퍼를 얻을수 있다.
3. MediaMuxer에 비디오와 오디오트랙을 추가하고, start() 한다.
4. muxer.writeSampleData(trackIndex, buffer) 메소드를 통해 먹싱을 한다.
5. 녹화를 중지하고 싶다면 stop(), release()를 순서대로 호출한다.
13. 안드로이드 화면 소스 얻기
안드로이드 5.0(Lollipop: API21) 부터 Screen 데이터를 가져올 수 있는
MediaProjection이 추가되었습니다.
이를 이용하여 화면의 스크린샷을 찍거나 녹화하는 애플리케이션을 만들 수
있습니다.
14. MediaProjection
MediaProjectionManager는 getSystemService를 통해 서비스를 생성하고,
사용자에게 권한을 요구하게 됩니다.
MediaProjectionManager mgm = getSystemService(Context.MEDIA_PROJECTION_SERVICE)
startActivityForResult(mpm.createScreenCaptureIntent(), REQUEST_CODE);
15. VirtualDisplay
protected void onActivityResult(int requestCode, int resultCode, Intent data){
if(requestCode==REQUEST_CODE){
mediaProjection = mgm.getMediaProjection(resultCode,data);
virtualDisplay = mediaProjection.createVirtualDisplay(“name”, screenWidth, screenHeight, screenDpi,
flag, surface, null,null);
}
}
Note : 화면녹화시에는 반드시 코덱으로 부터 얻은 surface 로 virtualDisplay를 생성해야한다.
16. AudioRecord
AudioRecord 객체 생성 및 레코딩 시작
mAudioRecord = new AudioRecord(mAudioSource, mSampleRate, mChannelCount, mAudioFormat, mBufferSize);
mAudioRecord.startRecording();
한 번에 전달 받을 최소의 audio data 크기 구하기
int bufferSize = AudioTrack.getMinBufferSize(mSampleRate, mChannelCount, mAudioFormat);
버퍼에 오디오 데이터 담기
int byteCount = mAudioRecord.read(buffer, 0, bufferSize);
17. (1) MediaCodec 객체 생성하기
1. MediaCodecList를 사용하여 특정 MediaFormat에 대한 MediaCodec객체를
생성할 수 있다.
2. MediaCodec.createByCodecName(String name)을 사용하여 원하는 코덱을
만들수 있다
3. 마찬가지로 원하는 디코더 또는 인코더를 생성할 수도 있다.
MediaCodec.createDecoderByType(String type)
MediaCodec.createEncoderByType(String type)
18. (2) MediaCodec 설정하기
미디어 코덱 객체를 생성하였다면 configure(MediaFormat format, Surface surface,
MediaCrypto crypto, int flags) 메소드를 사용하여 작업에 필요한 최소한의
작업환경을 설정해야한다. 설정 후 start()를 호출하여 인코딩/디코딩 작업을
시작한다.
format:입력데이터의 포맷 또는 출력을 바라는 데이터의 포맷을 가르킨다.
surface: 비디오를 디코딩하여 출력하고자 하는 화면을 가르킨다.
crypto: 저작권이 걸려있는 암호문을 평문으로 복호화할 때 사용하는
MediaCrypto객체를 가르킨다.
flags:인코더로 사용하려면 CONFIGURE_FLAG_ENCODE로 설정한다. 디코더의
경우 0
19. (3) MediaCodec 입출력버퍼
소켓처럼 미디어 코덱으로부터 입력 버퍼와 출력 버퍼를 받을 수 있다.
입력버퍼에 데이터를 넣고 큐에 넣으면, 출력버퍼로부터 부호화된 데이터를 얻을 수
있다.
20. MediaMuxer
동영상 파일을 만들기 위해서는 미디어 먹서가
필요하다.
트랙 : 영상 또는 음성
컨테이너 : 영상 또는 음성 트랙을 추가할 수 있는
공간.
int addTrack(MediaFormat format) 메소드를
호출하여 트랙을 추가 한 뒤 start()를 호출하여
먹싱을 시작하고, writeSampleData()를 통해
데이터를 넣을 수 있다.
먹싱을 끝낼때는 stop()을 반드시 호출해야 한다.
21. 3줄요약:
1. 스크린 녹화 파일을 만들기 위해서는 화면과 Mic 소스가 필요하다.
(VirtualDisplay, AudioRecord 필요)
2. 연속된 영상 및 음성 프레임버퍼는 용량이 크므로 인코딩 과정이 필요하다
(MediaFormat, MediaCodec 필요)
3. 인코딩된 데이터를 MediaMuxer에 쓰고 mp4 파일을 생성한다.
23. 참조:
빛과 소리의 향연 안드로이드 미디어 프로그래밍 - 박헌재
비디오 코덱과 동영상 포맷 - 김도훈
Android Media Codec 사용하기 - 권태환
“찰스, 세미나 좀 준비해 “ - 장중제
git : https://svn.maxst.com:8443/scm/git/ScreenRecorder