ScreenRecorder


화면 녹화 프로세스

  1. 비디오 코덱으로 부터 얻은 Surface를 통해 VirtualDisplay를 생성하였다면, 비디오코덱의 출력버퍼로부터 부호화된 프레임 버퍼를 얻을수 있다.
  2. AudioRecord로 부터 얻은 오디오 버퍼(PCM)를  오디오 코덱의 입력버퍼에 넣고 큐에 넣는다면, 출력버퍼로부터 부호화된 오디오 버퍼를 얻을수 있다.
  3. MediaMuxer에 비디오와 오디오트랙을 추가하고, start() 한다.
  4. muxer.writeSampleData(trackIndex, buffer) 메소드를 통해 먹싱을 한다.
  5. 녹화를 중지하고 싶다면 stop(), release()를 순서대로 호출한다.

다운로드 : https://github.com/Charlezz/ScreenRecorder
 


안드로이드 화면 데이터 얻기

안드로이드 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);

MediaCodec 객체 생성 하기

 

  • MediaCodecList를 사용하여 특정 MediaFormat에 대한 MediaCodec객체를 생성할 수 있다.
  • MediaCodec.createByCodecName(String name)을 사용하여 원하는 코덱을 만들수 있다
  • 마찬가지로 원하는 디코더 또는 인코더를 생성할 수도 있다.
    MediaCodec.createDecoderByType(String type)
    MediaCodec.createEncoderByType(String type)

MediaCodec 설정하기

미디어 코덱 객체를 생성하였다면 configure(MediaFormat format, Surface surface, MediaCrypto crypto, int flags) 메소드를 사용하여 작업에 필요한 최소한의 작업환경을 설정해야한다. 설정 후 start()를 호출하여 인코딩/디코딩 작업을 시작한다.
format:입력데이터의 포맷 또는 출력을 바라는 데이터의 포맷을 가르킨다.
surface: 비디오를 디코딩하여 출력하고자 하는 화면을 가르킨다.
crypto: 저작권이 걸려있는 암호문을 평문으로 복호화할 때 사용하는 MediaCrypto객체를 가르킨다.
flags:인코더로 사용하려면 CONFIGURE_FLAG_ENCODE로 설정한다. 디코더의 경우 0
 


MediaCodec 입출력버퍼

소켓처럼 미디어 코덱으로부터 입력 버퍼와 출력 버퍼를 받을 수 있다.
입력버퍼에 데이터를 넣고 큐에 넣으면, 출력버퍼로부터 부호화된 데이터를 얻을 수 있다.





MediaMuxer


동영상 파일을 만들기 위해서는 미디어 먹서가 필요하다.

트랙 : 영상 또는 음성
컨테이너 : 영상 또는 음성 트랙을 추가할 수 있는 공간.
int addTrack(MediaFormat format) 메소드를 호출하여 트랙을 추가 한 뒤 start()를 호출하여 먹싱을 시작하고, writeSampleData()를 통해 데이터를 넣을 수 있다.
먹싱을 끝낼때는 stop()을 반드시 호출해야 한다.


 
https://github.com/Charlezz/ScreenRecorder
 
 

카테고리: 미분류

3개의 댓글

김명우 · 2020년 11월 9일 2:44 오후

안녕하세요 , 자료 감사합니다. 보고 공부를 해보려고하는데 실행하고 녹화버튼누르면 튕기는데 어떻게 해야할까요? ㅠㅠ;

    Charlezz · 2020년 11월 9일 4:01 오후

    만든지 좀 된 소스라… 시간날 때 확인해보고 수정할게요

Ismael · 2023년 6월 23일 4:58 오전

I’m messaging you via your contact form on your website at charlezz.com. So by reading this message you just proved that contact form advertising works! Want to blast your ad to millions of contact forms? Or maybe you prefer a more targeted approach and only want to blast your ad out to websites in certain business verticals? We charge $99 to blast your ad to 1 million contact forms. Volume discounts are available. I have over 35 million contact forms. Let’s discuss, contact me via Skype here: live:.cid.7aad4787a72a11d0

답글 남기기

Avatar placeholder

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.