1 of 36

MediaRecorder?

MediaCodec으로 구현해보자!

Taehwan (taehwan@thdev.net)

2 of 36

순 서

  • API(MediaRecorder, MediaCodec)
  • 인코딩/디코딩이란?
  • Codec이란?
    • H.264/AVC
    • AAC
  • MediaCodec
  • MediaMuxer
  • 추천사이트

3 of 36

동영상?

동영상은 연속적으로 움직이는 그림!

4 of 36

MediaRecorder?

Android에서 카메라의 영상과 마이크의 음성을 간단하게 녹화해주는 API

5 of 36

MediaRecorder?

Video와 Audio를 녹화 할 수 있는 API

- API 1 부터 사용 가능

- MP4 파일에 카메라 정보와 오디오 정보를 저장

6 of 36

MediaRecorder?

MediaRecorder recorder = new MediaRecorder();

Video

recorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);

recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);

recorder.setOutputFile("/sdcard/video.mp4");

recorder.setPreviewDisplay(surface);

recorder.prepare();

recorder.start();

recorder.stop();

recorder.release();

Audio

recorder.setAudioChannels(2);

recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);

recorder.setAudioSource(MediaRecorder.AudioSource.MIC);

7 of 36

MediaCodec?

기존 MediaRecorder의 인코딩 부분을 MediaCodec의 별도 API로 만들어서 제공

8 of 36

MediaCodec

  • MediaCodec(API 16부터 사용)
    • ACodec.cpp를 통해 기존의 MediaRecorder를 사용
  • MediaExtractor(파일을 읽을 때 사용)(API 16부터 사용)
  • MediaMuxer(MP4 파일을 출력할 때 사용)(API 18 부터 사용)
    • MediaMuxer의 경우 MPEG4Writer.cpp 를 사용

추가로 알아야 할 것들

  • OpenGL ES(API 18 부터 사용 가능)
  • NDK(libyuv, openCV 등)(API 16부터 사용)

9 of 36

MediaCodec

  • Android 4.1
    • 기존 MediaRecorder를 이용하여 제공되던 인코딩 기능을 Android 4.1에서 추가
    • 동영상/음성을 인코딩/디코딩하는 API
    • Surface를 통한 비디오 디코딩 가능
    • Audio는 AudioTrack을 이용하여 재생 가능

  • Android 4.3
    • Surface를 통한 인코딩 가능.(OpenGL ES, EGL)
    • MediaMuxer를 통한 MP4 파일 생성 가능
    • VP8, VP9 인코딩(.WebM)

  • Android 4.4
    • setParameters API 추가
      • 인코딩 중 bitrate를 수정하거나, 일시 중지, 동기화 프레임(I-Frame) 생성 기능 추가

10 of 36

MediaCodec - 지원 codec

  • "video/x-vnd.on2.vp8" - VP8 video (i.e. video in .webm)
  • "video/x-vnd.on2.vp9" - VP9 video (i.e. video in .webm)
  • "video/avc" - H.264/AVC video
  • "video/mp4v-es" - MPEG4 video
  • "video/3gpp" - H.263 video
  • "audio/3gpp" - AMR narrowband audio
  • "audio/amr-wb" - AMR wideband audio
  • "audio/mpeg" - MPEG1/2 audio layer III
  • "audio/mp4a-latm" - AAC audio (note, this is raw AAC packets, not packaged in LATM!)
  • "audio/vorbis" - vorbis audio
  • "audio/g711-alaw" - G.711 alaw audio
  • "audio/g711-mlaw" - G.711 ulaw audio

11 of 36

Codec?

Codec은 어떠한 데이터 스트림이나 신호에 대해, 인코딩이나 디코딩, 혹은 둘 다를 할 수 있는 하드웨어나 소프트웨어

일반적으로 코덱 이라고 하면 영상, 음향등 미디어 정보를 압축하는 기술

- 위키백과 : http://ko.wikipedia.org/wiki/%EC%BD%94%EB%8D%B1

12 of 36

인코딩/디코딩 이란?

  • 인코딩
    • 부호화라고 하며, 원본을 코덱에 따라 압축하는 것.

  • 디코딩
    • 복호화라고 하며, 압축한것을 다시 해제하는것.

13 of 36

H.264 인코딩/디코딩

디코딩

인코딩

14 of 36

Codec

  • "video/avc" - H.264/AVC video

  • "audio/mp4a-latm" - AAC audio (note, this is raw AAC packets, not packaged in LATM!)

15 of 36

H.264/AVC

16 of 36

2. H.264/AVC

  • ITU-T and MPEGJVT 에서 개발한 프로젝트

  • ITU-T : H.264
  • MPEG : MPEG-4 part 10/AVC(Advanced Video Coding)

17 of 36

2. H.264/AVC - 특징

  • 대부분의 Bit-Rate 에서 50% 이상의 압축률 고품질 영상
  • 에러 복원 기능
  • 높은 네트워크 이식성을 가짐

18 of 36

2. H.264/AVC - Profile

  • Profile : 기술적 요소를 규격화 한 것

  • Baseline : 저전력 단말기에 최적
  • Main : 방송 및 저장용
  • Extended : 고화질 스트리밍에 최적

19 of 36

2. H.264/AVC - Frame

  • I-Frame(Intra-frame)
  • P-Frame(Predictive-frame)
  • B-Frame(Bi-directionally-frame)

20 of 36

2. H.264/AVC - Frame

  • I-Frame(Intra-frame)
    • 가장 기본이 되는 프레임으로 Main에 해당

21 of 36

2. H.264/AVC - Frame

  • P-Frame(Predictive-frame)
    • 이전 프레임과 현재 프레임과의 차이 값 만을 가지는 프레임.
  • B-Frame(Bi-directionally-frame)
    • 순방향/역방향 예측과 잡음을 줄이기 위해 사용.
    • 연산량과 메모리가 많이 필요.

22 of 36

2. H.264/AVC - 색공간

  • H.264는 YUV420 색공간을 사용.
    • YUV밝기 신호, 색차신호를 분리하여 사용.
    • YUV를 사용하는 목적은 흑백 TV와의 호환성 때문.

23 of 36

2. H.264/AVC - YUV 색공간

  • Android는 2가지 YUV 색공간 사용.
    • I420, NV12
    • 사이즈 : width * height * 3 / 2
    • 참고 : YUV 색공간 문서
    • libyuv 를 사용하여 변경가능

24 of 36

2. AAC

  • 고급 오디오 부호화(Advanced Audio Coding, AAC, ISO/IEC 13818-7)
  • 디지털 오디오에서 쓰이는 표준적인 손실 데이터 압축방식

  • Sample rate (8~96 Khz)
  • channel count (1, 2 채널)
  • bitrate : Audio 초당 음질

  • 참고 : MPEG-4 Audio 문서

25 of 36

3. MediaRecorder

26 of 36

3. MediaCodec - MediaFormat

  • Video 인코딩
    • mediaFormat.setInteger(MediaFormat.KEY_COLOR_FORMAT, MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420Planar);
  • 색상값 초기화 참고 : http://thdev.net/576

  • Audio 디코딩
    • format.setByteBuffer("csd-0", csd);
  • Audio byte를 직접 디코딩 할경우 참고 : http://thdev.net/567

27 of 36

3. MediaCodec - 참고

  • H.264의 표준인 16 배수로 처리할 것.
  • 색상값을 직접 처리하기 보다는 Surface를 사용할 것.
  • 색공간 변경시 libYUV 추천(NDK를 이용하여 처리)
  • 인/디코딩 시 Surface를 활용하면 쉽게 랜더링이 가능.

28 of 36

4. MediaMuxer

29 of 36

  • MPEG-4(MP4, ISO/IEC 14496)는 영상, 음성을 디지털 데이터로 전송, 저장하기 위한 규격.
  • MPEG-1, MPEG-2와 같이 시스템, 비주얼, 음향, 파일 포맷 규격으로 구성되어 있다.
  • 일반적으로 MPEG-4라고 할 때에는 동영상 인코딩 방식을 기술을 뜻한다.

  • 오디오와 비디오가 포함된 MPEG-4 파일들은 표준 .mp4
  • 오디오 전용 MPEG-4 파일들은 일반적으로 .m4a

30 of 36

MP4 파일 구성

  • mdat - 실제 데이터를 저장
  • moov - 비디오/오디오에 대한 head 정보
  • trak - 비디오/오디오에 각 대한 trak 정보
    • trak는 비디오/오디오/자막 등
    • 다수가 올 수 있음
  • 실제 코덱 정보는 stsd 에 저장

31 of 36

MediaMuxer

  • Android 4.3 에서 추가된 API
  • .MP4 파일 생성 가능
  • MediaCodec 과 함께 사용

  • 참고 : MediaCodec만 사용하는 경우 H.264와 AAC RAW 데이터가 출력

32 of 36

MediaMuxer - muxer stop

muxer.stop();

muxer.release();

muxer = null;

  • Muxer의 stop()을 호출하지 않으면 Head가 써지지 않음

33 of 36

MediaMuxer - 참고

  • Muxer 사용시 2GB 초과시 MP4 Head가 써지지 않음.
    • 4.4.4에서는 4GB까지 저장 가능.
    • 64bit의 L에서는 해당 부분의 용량 제한이 아닌 Head 정보의 사이즈 제한으로 수정.
  • Audio/Video를 함께 Muxer 하는 경우 1/2채널 사용
  • MediaCodec에서 동기화 시간을 작성

34 of 36

추천 사이트

  • MediaCodec 관련 모음 : http://bigflake.com/mediacodec/

  • MediaCodec Example :

https://github.com/taehwandev/MediaCodecExample

35 of 36

End

  • Taehwan (taehwan@thdev.net)

36 of 36

이 저작물에는 크리에이티브 커먼즈 저작자표시 4.0 국제 라이선스가 적용 되어 있습니다. 이 라이선스의 설명을 보고 싶으시면 http://creativecommons.org/licenses/by/4.0/ 을(를) 참조하세요.