android media codec 사용하기

45
Android MediaCodec! 인인인 / 인인인 인인인 ! Taehwan ([email protected])

Upload: taehwan-kwon

Post on 29-Jun-2015

5.566 views

Category:

Documents


10 download

TRANSCRIPT

Page 1: Android media codec 사용하기

Android MediaCodec!인코딩 / 디코딩 해보자 !

Taehwan ([email protected])

Page 2: Android media codec 사용하기

● 회사다닌지 1 년 5개월● 꿈 많은 개발자가 되자 ! 라는 블로그 운영 .

o http://thdev.net

● 아직은 초보 개발자 !● NDK 개발하는걸 좋아합니다 .

소개 ?

Page 3: Android media codec 사용하기

순 서1.인코딩 /디코딩이란 ?2. Codec이란 ?

a. H.264/AVCb. AAC

3. MediaCodec4. MediaMuxer5.추천사이트6. Q & A

Page 4: Android media codec 사용하기

MediaCodec? 안드로이드에서는음성 , 영상을녹화해주는

API(MediaRecord) 가있는데 ...

Page 5: Android media codec 사용하기

동영상 ? 동영상은움직이는 그림 !

Page 6: Android media codec 사용하기

인코딩 ? 디코딩 ?

Page 7: Android media codec 사용하기

● 인코딩o 부호화라고 하며 , 원본을 알고리즘에 따라 압축하는 것 .

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

1. 인코딩 / 디코딩이란 ?

Page 8: Android media codec 사용하기

1. H.264 인코딩 /디코딩

디코딩

인코딩

Page 9: Android media codec 사용하기

Codec?Codec 은 어떠한 데이터 스트림이나 신호에 대해 , 인코딩 이나 디코딩 , 혹은 둘

다를 할 수 있는 하드웨어나 소프트웨어

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

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

Page 10: Android media codec 사용하기

H.264/AVC

Page 11: Android media codec 사용하기

● ITU-T and MPEG 의 JVT 에서 개발한 프로젝트

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

2. H.264/AVC

Page 12: Android media codec 사용하기

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

2. H.264/AVC - 특징

Page 13: Android media codec 사용하기

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

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

2. H.264/AVC - Profile

Page 14: Android media codec 사용하기

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

2. H.264/AVC - Frame

Page 15: Android media codec 사용하기

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

2. H.264/AVC - Frame

Page 16: Android media codec 사용하기

● P-Frame(Predictive-frame)o 이전 프레임과 현재 프레임과의 차이 값 만을 가지는 프레임 .

● B-Frame(Bi-directionally-frame)o 순방향 / 역방향 예측과 잡음을 줄이기 위해 사용 .o 연산량과 메모리가 많이 필요 .

2. H.264/AVC - Frame

Page 17: Android media codec 사용하기

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

2. H.264/AVC - 색공간

Page 18: Android media codec 사용하기

● Android 는 2 가지 YUV 색공간 사용 .

o I420, NV12o 사이즈 : width * height * 3 / 2o 참고 : YUV 색공간 문서

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

Page 19: Android media codec 사용하기

● 특정 시간 단위마다 처리 bit 수 (bit/sec)● 이 bitrate 는 가변적으로 변한다 .

2. H.264/AVC - Bitrate

Page 20: Android media codec 사용하기

● FPS(Frame per second)o 1 초당 보여주어야 할 화면의 수를 말한다 .

● MediaCodec - Frame rate

2. H.264/AVC - Frame rate(FPS)

Page 21: Android media codec 사용하기

I-Frame 간의간격 (GOP : Group Of Picture)● I-Frame 과 I-Frame 사이의 간격

o I P P P P I : 5

● MediaCodec - I Frame Intervalo 초 단위로 지정이 되며 대략 5 초를 사용 .

2. H.264/AVC - I Frame Interval(GOP)

Page 22: Android media codec 사용하기

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

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

● 참고 : MPEG-4 Audio 문서

2. AAC

Page 23: Android media codec 사용하기

3. MediaCodec

Page 24: Android media codec 사용하기

● MediaCodec● MediaExtractor● MediaMuxer

● OpenGL ES● NDK

3. MediaCodec

Page 25: Android media codec 사용하기

● Audio/Video 를 인코딩 / 디코딩하는 API○ Android 4.1 에서 추가○ Surface 를 통한 비디오 디코딩 가능○ Audio 는 AudioTrack 을 이용하여 재생 가능

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

3. MediaCodec

Page 26: Android media 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

3. MediaCodec - 지원 codec

Page 27: Android media codec 사용하기

● MediaCodec codec = MediaCodec.createDecoderByType(type); // OR● MediaCodec codec = MediaCodec.createEncoderByType(type);

● codec.configure(format, …);o public void configure (MediaFormat format, Surface surface,

MediaCrypto crypto, int flags);

● codec.start();

3. MediaCodec - init

Page 28: Android media codec 사용하기

● Video 인코딩o mediaFormat.setInteger(MediaFormat.KEY_COLOR_FORMAT,

MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420Planar);➔ 색상값 초기화 참고 : http://thdev.net/576

● Audio 디코딩o format.setByteBuffer("csd-0", csd);

➔ Audio byte 를 직접 디코딩 할경우 참고 : http://thdev.net/567

3. MediaCodec - MediaFormat

Page 29: Android media codec 사용하기

ByteBuffer[] inputBuffers = codec.getInputBuffers(); ByteBuffer[] outputBuffers = codec.getOutputBuffers();

3. MediaCodec - Codec 사용

Page 30: Android media codec 사용하기

int inputBufferIndex = codec.dequeueInputBuffer(timeoutUs);if (inputBufferIndex >= 0) { // fill inputBuffers[inputBufferIndex] with valid data ... codec.queueInputBuffer(inputBufferIndex, ...);}

● public final void queueInputBuffer (int index, int offset, int size, long presentationTimeUs, int flags)

3. MediaCodec - Codec 사용

Page 31: Android media codec 사용하기

int outputBufferIndex = codec.dequeueOutputBuffer(BufferInfo, timeoutUs); if (outputBufferIndex >= 0) { // outputBuffer is ready to be processed or rendered. codec.releaseOutputBuffer(outputBufferIndex, true/false);

} else if (outputBufferIndex == MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED) { outputBuffers = codec.getOutputBuffers();

} else if (outputBufferIndex == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) { // Subsequent data will conform to new format. MediaFormat format = codec.getOutputFormat(); }

3. MediaCodec - Codec 사용

Page 32: Android media codec 사용하기

codec.stop();codec.release();codec = null;

3. MediaCodec - Codec 종료

Page 33: Android media codec 사용하기

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

3. MediaCodec - 참고

Page 34: Android media codec 사용하기

4. MediaMuxer

Page 35: Android media codec 사용하기

MP4??MPEG-4 Part 14 또는 MP4 ( 공식적으로 ISO/IEC 14496-14:2003) 는

MPEG-4 의 일부로 규정된 멀티미디어 컨테이너 포맷

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

Page 36: Android media codec 사용하기

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

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

4. MediaMuxer

Page 37: Android media codec 사용하기

● MediaMuxer muxer = new MediaMuxer("temp.mp4", OutputFormat.MUXER_OUTPUT_MPEG_4);

4. MediaMuxer - init

Page 38: Android media codec 사용하기

// More often, the MediaFormat will be retrieved from MediaCodec.getOutputFormat() // or MediaExtractor.getTrackFormat(). // MediaFormat audioFormat = new MediaFormat(...); // MediaFormat videoFormat = new MediaFormat(...);

if (outputBufferIndex == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) {

// Subsequent data will conform to new format. videoFormat = codec.getOutputFormat(); int videoTrackIndex = muxer.addTrack(videoFormat);

muxer.start(); }

4. MediaMuxer - muxer add

Page 39: Android media codec 사용하기

int outputBufferIndex = codec.dequeueOutputBuffer(BufferInfo, timeoutUs); if (outputBufferIndex >= 0) { ByteBuffer outputBuffer = outputBuffers[outputBufferIndex];

muxer.writeSampleData(TrackIndex, outputBuffer, bufferInfo);

codec.releaseOutputBuffer(outputBufferIndex,false);}

4. MediaMuxer - muxer write

Page 40: Android media codec 사용하기

muxer.stop();muxer.release();muxer = null;

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

4. MediaMuxer - muxer stop

Page 41: Android media codec 사용하기

● Muxer 사용시 2GB 초과시 MP4 Head 가 써지지 않음 .o 최신 코드에는 2GB 제한이 사라짐 . 다음 버전에 적용 될 듯 .

● Audio/Video 를 함께 Muxer 하는 경우 1/2 채널 사용● MediaCodec 에서 동기화 시간을 작성

4. MediaMuxer - 참고

Page 42: Android media codec 사용하기

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

● Android Example : https://android.googlesource.com/platform/cts/+/jb-mr2-release/tests/tests/media/src/android/media/cts

● MediaCodec Example : https://github.com/taehwandev/MediaCodecExample

5. 추천사이트

Page 43: Android media codec 사용하기

Taehwan ([email protected])

End

Page 44: Android media codec 사용하기

이 저작물에는 크리에이티브 커먼즈 저작자표시 4.0 국제 라이선스가 적용 되어있습니다 . 이 라이선스의 설명을 보고 싶으시면

http://creativecommons.org/licenses/by/4.0/ 을 (를 ) 참조하세요 .

Page 45: Android media codec 사용하기

● Google Drive : http://goo.gl/6pFI90

자료확인