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

More Related Content

Similar to Android Screen Recorder

디지털비디오
디지털비디오디지털비디오
디지털비디오Donghoi Kim
 
Kramer 회사소개 및 구축사례
Kramer 회사소개 및 구축사례Kramer 회사소개 및 구축사례
Kramer 회사소개 및 구축사례BI Ahn
 
Digital contents multimedia
Digital contents multimediaDigital contents multimedia
Digital contents multimediaDonghoi Kim
 
Encrypted media extention
Encrypted media extentionEncrypted media extention
Encrypted media extentionTaehyun Kim
 
[KGC2014] DX9에서DX11로의이행경험공유
[KGC2014] DX9에서DX11로의이행경험공유[KGC2014] DX9에서DX11로의이행경험공유
[KGC2014] DX9에서DX11로의이행경험공유Hwan Min
 
전형규, 가성비 좋은 렌더링 테크닉 10선, NDC2012
전형규, 가성비 좋은 렌더링 테크닉 10선, NDC2012전형규, 가성비 좋은 렌더링 테크닉 10선, NDC2012
전형규, 가성비 좋은 렌더링 테크닉 10선, NDC2012devCAT Studio, NEXON
 
[조진현]Kgc2012 c++amp
[조진현]Kgc2012 c++amp[조진현]Kgc2012 c++amp
[조진현]Kgc2012 c++amp진현 조
 
[NDC2015] 언제 어디서나 프로파일링 가능한 코드네임 JYP 작성기 - 라이브 게임 배포 후에도 프로파일링 하기
[NDC2015] 언제 어디서나 프로파일링 가능한 코드네임 JYP 작성기 - 라이브 게임 배포 후에도 프로파일링 하기[NDC2015] 언제 어디서나 프로파일링 가능한 코드네임 JYP 작성기 - 라이브 게임 배포 후에도 프로파일링 하기
[NDC2015] 언제 어디서나 프로파일링 가능한 코드네임 JYP 작성기 - 라이브 게임 배포 후에도 프로파일링 하기Jaeseung Ha
 
Android audio system(pcm데이터출력요청-서비스클라이언트)
Android audio system(pcm데이터출력요청-서비스클라이언트)Android audio system(pcm데이터출력요청-서비스클라이언트)
Android audio system(pcm데이터출력요청-서비스클라이언트)fefe7270
 
3D카툰메이커 완료세미나(복구됨)
3D카툰메이커 완료세미나(복구됨)3D카툰메이커 완료세미나(복구됨)
3D카툰메이커 완료세미나(복구됨)Daniel Shin
 
제2회 hello world 오픈세미나 Web Audio API-가능성엿보기
제2회 hello world 오픈세미나 Web Audio API-가능성엿보기제2회 hello world 오픈세미나 Web Audio API-가능성엿보기
제2회 hello world 오픈세미나 Web Audio API-가능성엿보기NAVER D2
 
[TECHCON 2019: MOBILE - Android]7.20분만에 만들어보는 라이브 방송 앱
[TECHCON 2019: MOBILE - Android]7.20분만에 만들어보는 라이브 방송 앱[TECHCON 2019: MOBILE - Android]7.20분만에 만들어보는 라이브 방송 앱
[TECHCON 2019: MOBILE - Android]7.20분만에 만들어보는 라이브 방송 앱NAVER Engineering
 
Wecandeo통합제안서
Wecandeo통합제안서Wecandeo통합제안서
Wecandeo통합제안서wecandeo wecandeo
 
[조진현] [Kgc2011]direct x11 이야기
[조진현] [Kgc2011]direct x11 이야기[조진현] [Kgc2011]direct x11 이야기
[조진현] [Kgc2011]direct x11 이야기진현 조
 
한글시계웍샵_ SW
한글시계웍샵_ SW한글시계웍샵_ SW
한글시계웍샵_ SW영광 송
 
Android audio system(오디오 출력-트랙생성)
Android audio system(오디오 출력-트랙생성)Android audio system(오디오 출력-트랙생성)
Android audio system(오디오 출력-트랙생성)fefe7270
 
Hm10 Research sheets
Hm10 Research sheetsHm10 Research sheets
Hm10 Research sheetsyyooooon
 
한글시계웍샵_SW
한글시계웍샵_SW한글시계웍샵_SW
한글시계웍샵_SW영광 송
 
정보매체와 물리교육 동영상
정보매체와 물리교육 동영상정보매체와 물리교육 동영상
정보매체와 물리교육 동영상cineduke
 

Similar to Android Screen Recorder (20)

디지털비디오
디지털비디오디지털비디오
디지털비디오
 
Kramer 회사소개 및 구축사례
Kramer 회사소개 및 구축사례Kramer 회사소개 및 구축사례
Kramer 회사소개 및 구축사례
 
Digital contents multimedia
Digital contents multimediaDigital contents multimedia
Digital contents multimedia
 
Encrypted media extention
Encrypted media extentionEncrypted media extention
Encrypted media extention
 
[KGC2014] DX9에서DX11로의이행경험공유
[KGC2014] DX9에서DX11로의이행경험공유[KGC2014] DX9에서DX11로의이행경험공유
[KGC2014] DX9에서DX11로의이행경험공유
 
전형규, 가성비 좋은 렌더링 테크닉 10선, NDC2012
전형규, 가성비 좋은 렌더링 테크닉 10선, NDC2012전형규, 가성비 좋은 렌더링 테크닉 10선, NDC2012
전형규, 가성비 좋은 렌더링 테크닉 10선, NDC2012
 
[조진현]Kgc2012 c++amp
[조진현]Kgc2012 c++amp[조진현]Kgc2012 c++amp
[조진현]Kgc2012 c++amp
 
[NDC2015] 언제 어디서나 프로파일링 가능한 코드네임 JYP 작성기 - 라이브 게임 배포 후에도 프로파일링 하기
[NDC2015] 언제 어디서나 프로파일링 가능한 코드네임 JYP 작성기 - 라이브 게임 배포 후에도 프로파일링 하기[NDC2015] 언제 어디서나 프로파일링 가능한 코드네임 JYP 작성기 - 라이브 게임 배포 후에도 프로파일링 하기
[NDC2015] 언제 어디서나 프로파일링 가능한 코드네임 JYP 작성기 - 라이브 게임 배포 후에도 프로파일링 하기
 
Android audio system(pcm데이터출력요청-서비스클라이언트)
Android audio system(pcm데이터출력요청-서비스클라이언트)Android audio system(pcm데이터출력요청-서비스클라이언트)
Android audio system(pcm데이터출력요청-서비스클라이언트)
 
3D카툰메이커 완료세미나(복구됨)
3D카툰메이커 완료세미나(복구됨)3D카툰메이커 완료세미나(복구됨)
3D카툰메이커 완료세미나(복구됨)
 
제2회 hello world 오픈세미나 Web Audio API-가능성엿보기
제2회 hello world 오픈세미나 Web Audio API-가능성엿보기제2회 hello world 오픈세미나 Web Audio API-가능성엿보기
제2회 hello world 오픈세미나 Web Audio API-가능성엿보기
 
[TECHCON 2019: MOBILE - Android]7.20분만에 만들어보는 라이브 방송 앱
[TECHCON 2019: MOBILE - Android]7.20분만에 만들어보는 라이브 방송 앱[TECHCON 2019: MOBILE - Android]7.20분만에 만들어보는 라이브 방송 앱
[TECHCON 2019: MOBILE - Android]7.20분만에 만들어보는 라이브 방송 앱
 
Wecandeo통합제안서
Wecandeo통합제안서Wecandeo통합제안서
Wecandeo통합제안서
 
[조진현] [Kgc2011]direct x11 이야기
[조진현] [Kgc2011]direct x11 이야기[조진현] [Kgc2011]direct x11 이야기
[조진현] [Kgc2011]direct x11 이야기
 
부팅
부팅부팅
부팅
 
한글시계웍샵_ SW
한글시계웍샵_ SW한글시계웍샵_ SW
한글시계웍샵_ SW
 
Android audio system(오디오 출력-트랙생성)
Android audio system(오디오 출력-트랙생성)Android audio system(오디오 출력-트랙생성)
Android audio system(오디오 출력-트랙생성)
 
Hm10 Research sheets
Hm10 Research sheetsHm10 Research sheets
Hm10 Research sheets
 
한글시계웍샵_SW
한글시계웍샵_SW한글시계웍샵_SW
한글시계웍샵_SW
 
정보매체와 물리교육 동영상
정보매체와 물리교육 동영상정보매체와 물리교육 동영상
정보매체와 물리교육 동영상
 

Android Screen Recorder

  • 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) 또는 데시벨 이다.
  • 6. PCM(Pulse-Code modulation) 펄스 부호 변조 : 소리라고 하는 아날로그신호를 컴퓨터로 표현하기 위해 이진법의 디지털로 표현한 기호를 말한다.
  • 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