SlideShare a Scribd company logo
1 of 45
Android MediaCodec!
인코딩/디코딩 해보자!
Taehwan (taehwan@thdev.net)
● 회사다닌지 1년 5개월
● 꿈 많은 개발자가 되자! 라는 블로그 운영.
o http://thdev.net
● 아직은 초보 개발자!
● NDK 개발하는걸 좋아합니다.
소개?
순 서
1. 인코딩/디코딩이란?
2. Codec이란?
a. H.264/AVC
b. AAC
3. MediaCodec
4. MediaMuxer
5. 추천사이트
6. Q & A
MediaCodec?
안드로이드에서는 음성, 영상을 녹화해주는
API(MediaRecord)가 있는데 ...
동영상?
동영상은 움직이는 그림!
인코딩? 디코딩?
● 인코딩
o 부호화라고 하며, 원본을 알고리즘에 따라 압축하는 것.
● 디코딩
o 복호화라고 하며, 압축한것을 다시 해제하는것.
1. 인코딩/디코딩 이란?
1. H.264 인코딩/디코딩
디코딩
인코딩
Codec?
Codec은 어떠한 데이터 스트림이나 신호에 대해, 인코딩이나 디코딩, 혹은
둘 다를 할 수 있는 하드웨어나 소프트웨어
일반적으로 코덱 이라고 하면 영상, 음향등 미디어 정보를 압축하는 기술
- 위키백과 : http://ko.wikipedia.org/wiki/%EC%BD%94%EB%8D%B1
H.264/AVC
● ITU-T and MPEG의 JVT 에서 개발한 프로젝트
● ITU-T : H.264
● MPEG : MPEG-4 part 10/AVC(Advanced Video Coding)
2. H.264/AVC
● 대부분의 Bit-Rate 에서 50% 이상의 압축률 고품질 영상
● 에러 복원 기능
● 높은 네트워크 이식성을 가짐
2. H.264/AVC - 특징
➔Profile : 기술적 요소를 규격화 한 것
● Baseline : 저전력 단말기에 최적
● Main : 방송 및 저장용
● Extended : 고화질 스트리밍에 최적
2. H.264/AVC - Profile
● I-Frame(Intra-frame)
● P-Frame(Predictive-frame)
● B-Frame(Bi-directionally-frame)
2. H.264/AVC - Frame
● I-Frame(Intra-frame)
o 가장 기본이 되는 프레임으로 Main에 해당
2. H.264/AVC - Frame
● P-Frame(Predictive-frame)
o 이전 프레임과 현재 프레임과의 차이 값 만을 가지는 프레임.
● B-Frame(Bi-directionally-frame)
o 순방향/역방향 예측과 잡음을 줄이기 위해 사용.
o 연산량과 메모리가 많이 필요.
2. H.264/AVC - Frame
● H.264는 YUV420 색공간을 사용.
o YUV는 밝기 신호, 색차신호를 분리하여 사용.
o YUV를 사용하는 목적은 흑백 TV와의 호환성 때문.
2. H.264/AVC - 색공간
● Android는 2가지 YUV 색공
간 사용.
o I420, NV12
o 사이즈 : width * height * 3 / 2
o 참고 : YUV 색공간 문서
2. H.264/AVC - YUV 색공간
● 특정 시간 단위마다 처리 bit 수 (bit/sec)
● 이 bitrate는 가변적으로 변한다.
2. H.264/AVC - Bitrate
● FPS(Frame per second)
o 1초당 보여주어야 할 화면의 수를 말한다.
● MediaCodec - Frame rate
2. H.264/AVC - Frame rate(FPS)
I-Frame 간의 간격(GOP : Group Of Picture)
● I-Frame과 I-Frame 사이의 간격
o I P P P P I : 5
● MediaCodec - I Frame Interval
o 초 단위로 지정이 되며 대략 5초를 사용.
2. H.264/AVC - I Frame Interval(GOP)
● 고급 오디오 부호화(Advanced Audio Coding, AAC, ISO/IEC 13818-7)
● 디지털 오디오에서 쓰이는 표준적인 손실 데이터 압축방식
● Sample rate (8~96 Khz)
● channel count (1, 2 채널)
● bitrate : Audio 초당 음질
● 참고 : MPEG-4 Audio 문서
2. AAC
3. MediaCodec
● MediaCodec
● MediaExtractor
● MediaMuxer
● OpenGL ES
● NDK
3. MediaCodec
● Audio/Video를 인코딩/디코딩하는 API
○ Android 4.1에서 추가
○ Surface를 통한 비디오 디코딩 가능
○ Audio는 AudioTrack을 이용하여 재생 가능
● Android 4.3부터
○ Surface를 통한 인코딩 가능.(OpenGL ES, EGL)
○ MediaMuxer를 통한 MP4 파일 생성 가능
○ VP8, VP9 인코딩(.WebM)
3. MediaCodec
● "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
● 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
● 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
ByteBuffer[] inputBuffers = codec.getInputBuffers();
ByteBuffer[] outputBuffers = codec.getOutputBuffers();
3. MediaCodec - 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 사용
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 사용
codec.stop();
codec.release();
codec = null;
3. MediaCodec - Codec 종료
● 16 배수로 처리할 것.
● 색상값을 직접 처리하기 보다는 Surface를 사용할 것.
● 색공간 변경시 libYUV 추천(NDK를 이용하여 처리)
● 디코딩 시 Surface를 활용하면 쉽게 랜더링이 가능.
3. MediaCodec - 참고
4. MediaMuxer
MP4??
MPEG-4 Part 14 또는 MP4 (공식적으로 ISO/IEC 14496-14:2003)는
MPEG-4의 일부로 규정된 멀티미디어 컨테이너 포맷
오디오와 비디오가 포함된 MPEG-4 파일들은 표준 .mp4
오디오 전용 MPEG-4 파일들은 일반적으로 .m4a
● Android 4.3 에서 추가된 API
● .MP4 파일 생성 가능
● MediaCodec 과 함께 사용
● 참고 : MediaCodec만 사용하는 경우 H.264와 AAC RAW 데이터가 출력
4. MediaMuxer
● MediaMuxer muxer = new MediaMuxer("temp.mp4",
OutputFormat.MUXER_OUTPUT_MPEG_4);
4. MediaMuxer - init
// 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
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
muxer.stop();
muxer.release();
muxer = null;
● Muxer의 stop()을 호출하지 않으면 Head가 써지지 않음
4. MediaMuxer - muxer stop
● Muxer 사용시 2GB 초과시 MP4 Head가 써지지 않음.
o 최신 코드에는 2GB 제한이 사라짐. 다음 버전에 적용 될 듯.
● Audio/Video를 함께 Muxer 하는 경우 1/2채널 사용
● MediaCodec에서 동기화 시간을 작성
4. MediaMuxer - 참고
● 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. 추천 사이트
Taehwan (taehwan@thdev.net)
End
이 저작물에는 크리에이티브 커먼즈 저작자표시 4.0 국제 라이선스가 적용
되어 있습니다. 이 라이선스의 설명을 보고 싶으시면
http://creativecommons.org/licenses/by/4.0/ 을(를) 참조하세요.
● Google Drive : http://goo.gl/6pFI90
자료 확인

More Related Content

What's hot

Android Security Internals
Android Security InternalsAndroid Security Internals
Android Security InternalsOpersys inc.
 
High-Performance Networking Using eBPF, XDP, and io_uring
High-Performance Networking Using eBPF, XDP, and io_uringHigh-Performance Networking Using eBPF, XDP, and io_uring
High-Performance Networking Using eBPF, XDP, and io_uringScyllaDB
 
FrameGraph: Extensible Rendering Architecture in Frostbite
FrameGraph: Extensible Rendering Architecture in FrostbiteFrameGraph: Extensible Rendering Architecture in Frostbite
FrameGraph: Extensible Rendering Architecture in FrostbiteElectronic Arts / DICE
 
Android's HIDL: Treble in the HAL
Android's HIDL: Treble in the HALAndroid's HIDL: Treble in the HAL
Android's HIDL: Treble in the HALOpersys inc.
 
Android SDK Tutorial | Edureka
Android SDK Tutorial | EdurekaAndroid SDK Tutorial | Edureka
Android SDK Tutorial | EdurekaEdureka!
 
The Android graphics path, in depth
The Android graphics path, in depthThe Android graphics path, in depth
The Android graphics path, in depthChris Simmonds
 
Android Binder IPC for Linux
Android Binder IPC for LinuxAndroid Binder IPC for Linux
Android Binder IPC for LinuxYu-Hsin Hung
 
Introduction to eBPF and XDP
Introduction to eBPF and XDPIntroduction to eBPF and XDP
Introduction to eBPF and XDPlcplcp1
 
The TCP/IP Stack in the Linux Kernel
The TCP/IP Stack in the Linux KernelThe TCP/IP Stack in the Linux Kernel
The TCP/IP Stack in the Linux KernelDivye Kapoor
 
Android audio system(audio_hardwareinterace)
Android audio system(audio_hardwareinterace)Android audio system(audio_hardwareinterace)
Android audio system(audio_hardwareinterace)fefe7270
 
Inter-process communication of Android
Inter-process communication of AndroidInter-process communication of Android
Inter-process communication of AndroidTetsuyuki Kobayashi
 
Android Multimedia Framework
Android Multimedia FrameworkAndroid Multimedia Framework
Android Multimedia FrameworkPicker Weng
 
Android audio system(audioplicy_service)
Android audio system(audioplicy_service)Android audio system(audioplicy_service)
Android audio system(audioplicy_service)fefe7270
 

What's hot (20)

Android Internals
Android InternalsAndroid Internals
Android Internals
 
Android Security Internals
Android Security InternalsAndroid Security Internals
Android Security Internals
 
eBPF/XDP
eBPF/XDP eBPF/XDP
eBPF/XDP
 
High-Performance Networking Using eBPF, XDP, and io_uring
High-Performance Networking Using eBPF, XDP, and io_uringHigh-Performance Networking Using eBPF, XDP, and io_uring
High-Performance Networking Using eBPF, XDP, and io_uring
 
FrameGraph: Extensible Rendering Architecture in Frostbite
FrameGraph: Extensible Rendering Architecture in FrostbiteFrameGraph: Extensible Rendering Architecture in Frostbite
FrameGraph: Extensible Rendering Architecture in Frostbite
 
Android's HIDL: Treble in the HAL
Android's HIDL: Treble in the HALAndroid's HIDL: Treble in the HAL
Android's HIDL: Treble in the HAL
 
eBPF Basics
eBPF BasicseBPF Basics
eBPF Basics
 
Android SDK Tutorial | Edureka
Android SDK Tutorial | EdurekaAndroid SDK Tutorial | Edureka
Android SDK Tutorial | Edureka
 
The Android graphics path, in depth
The Android graphics path, in depthThe Android graphics path, in depth
The Android graphics path, in depth
 
Android presentation
Android presentationAndroid presentation
Android presentation
 
Android Binder IPC for Linux
Android Binder IPC for LinuxAndroid Binder IPC for Linux
Android Binder IPC for Linux
 
Quarkus k8s
Quarkus   k8sQuarkus   k8s
Quarkus k8s
 
Introduction to eBPF and XDP
Introduction to eBPF and XDPIntroduction to eBPF and XDP
Introduction to eBPF and XDP
 
The TCP/IP Stack in the Linux Kernel
The TCP/IP Stack in the Linux KernelThe TCP/IP Stack in the Linux Kernel
The TCP/IP Stack in the Linux Kernel
 
Android audio system(audio_hardwareinterace)
Android audio system(audio_hardwareinterace)Android audio system(audio_hardwareinterace)
Android audio system(audio_hardwareinterace)
 
Inter-process communication of Android
Inter-process communication of AndroidInter-process communication of Android
Inter-process communication of Android
 
Audio Drivers
Audio DriversAudio Drivers
Audio Drivers
 
CMake best practices
CMake best practicesCMake best practices
CMake best practices
 
Android Multimedia Framework
Android Multimedia FrameworkAndroid Multimedia Framework
Android Multimedia Framework
 
Android audio system(audioplicy_service)
Android audio system(audioplicy_service)Android audio system(audioplicy_service)
Android audio system(audioplicy_service)
 

Similar to Android media codec 사용하기

Android Screen Recorder
Android Screen RecorderAndroid Screen Recorder
Android Screen RecorderSooHwan Ok
 
Android mediacodec
Android mediacodecAndroid mediacodec
Android mediacodecTaehwan kwon
 
정보매체와 물리교육 동영상
정보매체와 물리교육 동영상정보매체와 물리교육 동영상
정보매체와 물리교육 동영상cineduke
 
OpenCR 아두이노 펌웨어개발
OpenCR 아두이노 펌웨어개발OpenCR 아두이노 펌웨어개발
OpenCR 아두이노 펌웨어개발chcbaram
 
강좌 07 ARM 프로세서용 아두이노
강좌 07 ARM 프로세서용 아두이노강좌 07 ARM 프로세서용 아두이노
강좌 07 ARM 프로세서용 아두이노chcbaram
 
디지털비디오
디지털비디오디지털비디오
디지털비디오Donghoi Kim
 
3D카툰메이커 완료세미나(복구됨)
3D카툰메이커 완료세미나(복구됨)3D카툰메이커 완료세미나(복구됨)
3D카툰메이커 완료세미나(복구됨)Daniel Shin
 
Kramer 회사소개 및 구축사례
Kramer 회사소개 및 구축사례Kramer 회사소개 및 구축사례
Kramer 회사소개 및 구축사례BI Ahn
 
HD-SDI /3G-SDI 를 이용한 디지털 영상 정보 시스템
HD-SDI /3G-SDI 를 이용한 디지털 영상 정보 시스템HD-SDI /3G-SDI 를 이용한 디지털 영상 정보 시스템
HD-SDI /3G-SDI 를 이용한 디지털 영상 정보 시스템Deok kyu Ahn
 
[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
 
MGS 툴세미나
MGS 툴세미나MGS 툴세미나
MGS 툴세미나Bonex Gu
 
Hm10 Research sheets
Hm10 Research sheetsHm10 Research sheets
Hm10 Research sheetsyyooooon
 
제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
 
처음부터 다시 배우는 HTML5 & CSS3 강의자료 6일차
처음부터 다시 배우는 HTML5 & CSS3 강의자료 6일차처음부터 다시 배우는 HTML5 & CSS3 강의자료 6일차
처음부터 다시 배우는 HTML5 & CSS3 강의자료 6일차Michael Yang
 
Encrypted media extention
Encrypted media extentionEncrypted media extention
Encrypted media extentionTaehyun Kim
 
Device interface (090721)
Device interface (090721)Device interface (090721)
Device interface (090721)대갑 김
 
전형규, 가성비 좋은 렌더링 테크닉 10선, NDC2012
전형규, 가성비 좋은 렌더링 테크닉 10선, NDC2012전형규, 가성비 좋은 렌더링 테크닉 10선, NDC2012
전형규, 가성비 좋은 렌더링 테크닉 10선, NDC2012devCAT Studio, NEXON
 
Android audio system(pcm데이터출력요청-서비스클라이언트)
Android audio system(pcm데이터출력요청-서비스클라이언트)Android audio system(pcm데이터출력요청-서비스클라이언트)
Android audio system(pcm데이터출력요청-서비스클라이언트)fefe7270
 
[조진현] [Kgc2011]direct x11 이야기
[조진현] [Kgc2011]direct x11 이야기[조진현] [Kgc2011]direct x11 이야기
[조진현] [Kgc2011]direct x11 이야기진현 조
 

Similar to Android media codec 사용하기 (20)

Android Screen Recorder
Android Screen RecorderAndroid Screen Recorder
Android Screen Recorder
 
Android mediacodec
Android mediacodecAndroid mediacodec
Android mediacodec
 
정보매체와 물리교육 동영상
정보매체와 물리교육 동영상정보매체와 물리교육 동영상
정보매체와 물리교육 동영상
 
OpenCR 아두이노 펌웨어개발
OpenCR 아두이노 펌웨어개발OpenCR 아두이노 펌웨어개발
OpenCR 아두이노 펌웨어개발
 
강좌 07 ARM 프로세서용 아두이노
강좌 07 ARM 프로세서용 아두이노강좌 07 ARM 프로세서용 아두이노
강좌 07 ARM 프로세서용 아두이노
 
디지털비디오
디지털비디오디지털비디오
디지털비디오
 
3D카툰메이커 완료세미나(복구됨)
3D카툰메이커 완료세미나(복구됨)3D카툰메이커 완료세미나(복구됨)
3D카툰메이커 완료세미나(복구됨)
 
Kramer 회사소개 및 구축사례
Kramer 회사소개 및 구축사례Kramer 회사소개 및 구축사례
Kramer 회사소개 및 구축사례
 
HD-SDI /3G-SDI 를 이용한 디지털 영상 정보 시스템
HD-SDI /3G-SDI 를 이용한 디지털 영상 정보 시스템HD-SDI /3G-SDI 를 이용한 디지털 영상 정보 시스템
HD-SDI /3G-SDI 를 이용한 디지털 영상 정보 시스템
 
[TECHCON 2019: MOBILE - Android]7.20분만에 만들어보는 라이브 방송 앱
[TECHCON 2019: MOBILE - Android]7.20분만에 만들어보는 라이브 방송 앱[TECHCON 2019: MOBILE - Android]7.20분만에 만들어보는 라이브 방송 앱
[TECHCON 2019: MOBILE - Android]7.20분만에 만들어보는 라이브 방송 앱
 
MGS 툴세미나
MGS 툴세미나MGS 툴세미나
MGS 툴세미나
 
Hm10 Research sheets
Hm10 Research sheetsHm10 Research sheets
Hm10 Research sheets
 
제2회 hello world 오픈세미나 Web Audio API-가능성엿보기
제2회 hello world 오픈세미나 Web Audio API-가능성엿보기제2회 hello world 오픈세미나 Web Audio API-가능성엿보기
제2회 hello world 오픈세미나 Web Audio API-가능성엿보기
 
처음부터 다시 배우는 HTML5 & CSS3 강의자료 6일차
처음부터 다시 배우는 HTML5 & CSS3 강의자료 6일차처음부터 다시 배우는 HTML5 & CSS3 강의자료 6일차
처음부터 다시 배우는 HTML5 & CSS3 강의자료 6일차
 
Encrypted media extention
Encrypted media extentionEncrypted media extention
Encrypted media extention
 
Device interface (090721)
Device interface (090721)Device interface (090721)
Device interface (090721)
 
전형규, 가성비 좋은 렌더링 테크닉 10선, NDC2012
전형규, 가성비 좋은 렌더링 테크닉 10선, NDC2012전형규, 가성비 좋은 렌더링 테크닉 10선, NDC2012
전형규, 가성비 좋은 렌더링 테크닉 10선, NDC2012
 
Android audio system(pcm데이터출력요청-서비스클라이언트)
Android audio system(pcm데이터출력요청-서비스클라이언트)Android audio system(pcm데이터출력요청-서비스클라이언트)
Android audio system(pcm데이터출력요청-서비스클라이언트)
 
2022 Portfolio Korean
2022 Portfolio Korean2022 Portfolio Korean
2022 Portfolio Korean
 
[조진현] [Kgc2011]direct x11 이야기
[조진현] [Kgc2011]direct x11 이야기[조진현] [Kgc2011]direct x11 이야기
[조진현] [Kgc2011]direct x11 이야기
 

Android media codec 사용하기

  • 2. ● 회사다닌지 1년 5개월 ● 꿈 많은 개발자가 되자! 라는 블로그 운영. o http://thdev.net ● 아직은 초보 개발자! ● NDK 개발하는걸 좋아합니다. 소개?
  • 3. 순 서 1. 인코딩/디코딩이란? 2. Codec이란? a. H.264/AVC b. AAC 3. MediaCodec 4. MediaMuxer 5. 추천사이트 6. Q & A
  • 4. MediaCodec? 안드로이드에서는 음성, 영상을 녹화해주는 API(MediaRecord)가 있는데 ...
  • 7. ● 인코딩 o 부호화라고 하며, 원본을 알고리즘에 따라 압축하는 것. ● 디코딩 o 복호화라고 하며, 압축한것을 다시 해제하는것. 1. 인코딩/디코딩 이란?
  • 9. Codec? Codec은 어떠한 데이터 스트림이나 신호에 대해, 인코딩이나 디코딩, 혹은 둘 다를 할 수 있는 하드웨어나 소프트웨어 일반적으로 코덱 이라고 하면 영상, 음향등 미디어 정보를 압축하는 기술 - 위키백과 : http://ko.wikipedia.org/wiki/%EC%BD%94%EB%8D%B1
  • 11. ● ITU-T and MPEG의 JVT 에서 개발한 프로젝트 ● ITU-T : H.264 ● MPEG : MPEG-4 part 10/AVC(Advanced Video Coding) 2. H.264/AVC
  • 12. ● 대부분의 Bit-Rate 에서 50% 이상의 압축률 고품질 영상 ● 에러 복원 기능 ● 높은 네트워크 이식성을 가짐 2. H.264/AVC - 특징
  • 13. ➔Profile : 기술적 요소를 규격화 한 것 ● Baseline : 저전력 단말기에 최적 ● Main : 방송 및 저장용 ● Extended : 고화질 스트리밍에 최적 2. H.264/AVC - Profile
  • 14. ● I-Frame(Intra-frame) ● P-Frame(Predictive-frame) ● B-Frame(Bi-directionally-frame) 2. H.264/AVC - Frame
  • 15. ● I-Frame(Intra-frame) o 가장 기본이 되는 프레임으로 Main에 해당 2. H.264/AVC - Frame
  • 16. ● P-Frame(Predictive-frame) o 이전 프레임과 현재 프레임과의 차이 값 만을 가지는 프레임. ● B-Frame(Bi-directionally-frame) o 순방향/역방향 예측과 잡음을 줄이기 위해 사용. o 연산량과 메모리가 많이 필요. 2. H.264/AVC - Frame
  • 17. ● H.264는 YUV420 색공간을 사용. o YUV는 밝기 신호, 색차신호를 분리하여 사용. o YUV를 사용하는 목적은 흑백 TV와의 호환성 때문. 2. H.264/AVC - 색공간
  • 18. ● Android는 2가지 YUV 색공 간 사용. o I420, NV12 o 사이즈 : width * height * 3 / 2 o 참고 : YUV 색공간 문서 2. H.264/AVC - YUV 색공간
  • 19. ● 특정 시간 단위마다 처리 bit 수 (bit/sec) ● 이 bitrate는 가변적으로 변한다. 2. H.264/AVC - Bitrate
  • 20. ● FPS(Frame per second) o 1초당 보여주어야 할 화면의 수를 말한다. ● MediaCodec - Frame rate 2. H.264/AVC - Frame rate(FPS)
  • 21. I-Frame 간의 간격(GOP : Group Of Picture) ● I-Frame과 I-Frame 사이의 간격 o I P P P P I : 5 ● MediaCodec - I Frame Interval o 초 단위로 지정이 되며 대략 5초를 사용. 2. H.264/AVC - I Frame Interval(GOP)
  • 22. ● 고급 오디오 부호화(Advanced Audio Coding, AAC, ISO/IEC 13818-7) ● 디지털 오디오에서 쓰이는 표준적인 손실 데이터 압축방식 ● Sample rate (8~96 Khz) ● channel count (1, 2 채널) ● bitrate : Audio 초당 음질 ● 참고 : MPEG-4 Audio 문서 2. AAC
  • 24. ● MediaCodec ● MediaExtractor ● MediaMuxer ● OpenGL ES ● NDK 3. MediaCodec
  • 25. ● Audio/Video를 인코딩/디코딩하는 API ○ Android 4.1에서 추가 ○ Surface를 통한 비디오 디코딩 가능 ○ Audio는 AudioTrack을 이용하여 재생 가능 ● Android 4.3부터 ○ Surface를 통한 인코딩 가능.(OpenGL ES, EGL) ○ MediaMuxer를 통한 MP4 파일 생성 가능 ○ VP8, VP9 인코딩(.WebM) 3. MediaCodec
  • 26. ● "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
  • 27. ● 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
  • 28. ● 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
  • 29. ByteBuffer[] inputBuffers = codec.getInputBuffers(); ByteBuffer[] outputBuffers = codec.getOutputBuffers(); 3. MediaCodec - Codec 사용
  • 30. 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 사용
  • 31. 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 사용
  • 33. ● 16 배수로 처리할 것. ● 색상값을 직접 처리하기 보다는 Surface를 사용할 것. ● 색공간 변경시 libYUV 추천(NDK를 이용하여 처리) ● 디코딩 시 Surface를 활용하면 쉽게 랜더링이 가능. 3. MediaCodec - 참고
  • 35. MP4?? MPEG-4 Part 14 또는 MP4 (공식적으로 ISO/IEC 14496-14:2003)는 MPEG-4의 일부로 규정된 멀티미디어 컨테이너 포맷 오디오와 비디오가 포함된 MPEG-4 파일들은 표준 .mp4 오디오 전용 MPEG-4 파일들은 일반적으로 .m4a
  • 36. ● Android 4.3 에서 추가된 API ● .MP4 파일 생성 가능 ● MediaCodec 과 함께 사용 ● 참고 : MediaCodec만 사용하는 경우 H.264와 AAC RAW 데이터가 출력 4. MediaMuxer
  • 37. ● MediaMuxer muxer = new MediaMuxer("temp.mp4", OutputFormat.MUXER_OUTPUT_MPEG_4); 4. MediaMuxer - init
  • 38. // 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
  • 39. 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
  • 40. muxer.stop(); muxer.release(); muxer = null; ● Muxer의 stop()을 호출하지 않으면 Head가 써지지 않음 4. MediaMuxer - muxer stop
  • 41. ● Muxer 사용시 2GB 초과시 MP4 Head가 써지지 않음. o 최신 코드에는 2GB 제한이 사라짐. 다음 버전에 적용 될 듯. ● Audio/Video를 함께 Muxer 하는 경우 1/2채널 사용 ● MediaCodec에서 동기화 시간을 작성 4. MediaMuxer - 참고
  • 42. ● 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. 추천 사이트
  • 44. 이 저작물에는 크리에이티브 커먼즈 저작자표시 4.0 국제 라이선스가 적용 되어 있습니다. 이 라이선스의 설명을 보고 싶으시면 http://creativecommons.org/licenses/by/4.0/ 을(를) 참조하세요.
  • 45. ● Google Drive : http://goo.gl/6pFI90 자료 확인

Editor's Notes

  1. 안녕하세요 MediaCodec 사용법을 발표하게 된 권태환입니다. 저는 꿈 많은 개발자가 되자!라는 블로그를 운영중입니다. 1년 5개월째 회사를 다니고 있고, 거의 FFMpeg와 MediaCodec을 다뤄볼 일이 많았습니다. 그간 했던것을 정리하고자 발표를 하게 되었습니다.
  2. 목차 이번 발표는 인코딩/디코딩이 무슨 뜻인지, 일반적으로 MP4라고 하는 컨테이너는 무엇인지 코덱 중 H.264, AAC가 무엇인지를 살펴보고, 이번 발표의 주제인 Android API MediaCodec을 이야기 해보겠습니다.
  3. 안드로이드에서는 음성, 영상을 녹화해주는 API가 있는데 이걸 사용해야 할 이유가 있을까요? MediaCodec이 API로 공개된 이유는 하드웨어 성능 향상이 큽니다. 기존에는 동영상을 찍고, 재생하는 정도의 역활을 하였다면, 단말기의 동영상을 실시간 인코딩하여 실시간 스트리밍을 한다거나, 음악을 실시간으로 디코딩한다거나 하는 byte 단위 처리가 가능한 MediaCodec API 입니다.
  4. 동영상은 움직이는 그림을 연속적으로 보여주는 것을 동영상이라고 합니다. 아래 한번쯤은 접해보았던 이미지가 보이실 겁니다. 연속으로 보여주게 되면 마치 움직이는 사진처럼 보여지게 되는것! 그냥 그 자체가 동영상입니다.
  5. 그렇다면 인코딩 디코딩은 뭘 말할까요?
  6. 사전적으로는 부호화라고 표현하더군요. 원본을 특정 알고리즘에 따라서 압축하는 것을 말합니다. 반대로 디코딩이란 복호화 라고하고, 압축을 해제하는 것을 말합니다.
  7. 코덱을 알기 전에 인코딩과 디코딩에 가장 간단한 개념을 살펴보겠습니다. 디코딩은 1장 1장의 완벽한 가이미지의 형태를 가지며, 인코딩은 첫장과 2번째 장의 차이값만을 가집니다.
  8. 정리하면 어떠한 데이터 스트림이나 신호에 대해, 인코딩과 디코딩, 혹은 둘 다를 할 수 있는 하드웨어나 소프트웨어를 일컷는 말입니다. 일반적으로 코덱이라고 하면 영상, 음성 등 미디어 정보를 압축하는 기술을 말합니다.
  9. 그러면 Android에서 주로 사용되는 H.264와 AAC를 살펴보겠습니다.
  10. ITU-T의 VCEG(Video Coding Expert Group)와 ISO/IEC의 MPEG(Moving Picture Expert Group)의 JVT(Joint Video Team)에서 개발한 프로젝트로 ITU-T에서는 H.264라는 이름을 사용하며, MPEG 에서는 MPEG-4 part 10/AVC라는 이름을 사용합니다. 일반적으로 H.264라는 이름을 더 많이 쓰는것 같습니다.
  11. 1) H.263에 비해서 H.264는 대부분의 Bit-Rates에서 50% 이상의 압축 효율을 보여주게 됩니다. 새로 나올 H.265나 VP9 역시 H.264에 비해서 50% 이상의 압축 효율을 보여준다고 합니다. 2) 고품질의 영상 제공 3) 에러 복원 기능 4) 네트워크 전송에 유리한 코덱입니다.
  12. 동영상은 하나의 이미지를 프레임이라고 합니다. H.264에는 아래와 같이 3가지의 Frame이 있습니다. 바트가 자고있는 사진을 이용하여 프레임을 구분해보겠습니다.
  13. I-Frame은 Intra-frame으로 원본 이미지라고 보시면 됩니다. 일명 키프레임이라는 말도 사용하고 있는데, 다음 프레임인 B, P-Frame을 디코딩하는데 있어서는 필수적인 요소가 됩니다.
  14. P-Frame은 Predictive-frame으로 이전 프레임과의 차이 값을 가지게 됩니다. 3번째 사진을 보시면 바트가 일 부분만 표시되는 것을 보실 수 있습니다. 이런 이미지를 P-Frame이라고 표현합니다. B-Frame은 Bi-directionally-frame으로 프레임간 이동 성능을 향상시키기 위하여 예측 정보와 잡음을 줄이는데 주로 사용하게 됩니다. 연산량이 많이 필요하여 Baseline 프로파일에서는 사용되지 않는 프레임입니다.
  15. 기본 프레임정보를 알았으니 이 Frame을 구성하는 색상값을 알아합니다. H.264는 YUV420 색공간을 사용합니다. YUV는 밝기 신호, 색차신호를 분리하여 인코딩하게 됩니다. YUV는 흑백 TV가 존재하던 시대에 호환성을 위해서 만들어진 색상입니다. 과거 흑백 TV와 컬러 TV가 함께 존재하던 시기에 만들어지다보니 YUV 색상값이 기본으로 사용됩니다.
  16. Android에서는 I420과 NV12 2가지 색상값으로 인코딩을 하게 되는데, I420, NV12의 사이즈는 가로x세로x3/2의 사이즈로 왼쪽 2번째 이미지와 같은 사이즈가 됩니다. UV는 색상값에 따라서 위치가 달라지게 됩니다.
  17. 동영상 인코딩에 사용되는 간단한 몇가지 용어를 MediaCodec을 초기화할때 사용하는 것 위주로 살펴보겠습니다. Bitrate는 특정 시간 단위마다 처리하는 비트의 수를 말합니다. H.264에서는 이 bitrate가 가변적으로 변하게 됩니다.
  18. FPS라고 하며 Frame Per Second 의 약자로 1초동안 보여주는 화면의 수를 말합니다. 예를 들어 30 FPS라면 초당 약 30장의 이미지가 표시된다고 생각 하시면 됩니다. MediaCodec에서는 Frame rate를 지정하면 최대 FPS로 설정되고 실제 FPS는 동적으로 계산되어 설정됩니다.
  19. I-Frame 간의 간격을 GOP라고하며, 특정 프레임이 아래와 같다면 I-Frame에서 I-Frame 이전의 간격을 수로 나타내면 5가 됩니다. 이말은 5 frame 마다 매번 I-Frame을 생성하겠다는 의미가 됩니다. 5프레임 마다 한번씩 생성하면 용량이 늘어나는 효과를 보실 수 있겠지만. 안드로이드에서는 이 I-Frame 간격을 대략 초 단위로 지정하다보니 1초 또는 5초를 사용하시면 됩니다. FPS가 유동적이다보니 1초라고해서 30장이 GOP가 되는 것은 아닙니다.
  20. 사운드 코덱인 AAC 입니다. AAC는 Advanced Audio Coding의 약자로 고음질 오디오를 압축하는 코덱으로 ISO/IEC의 표준문서에 따라 정의됩니다. 디지털 오디오에서 쓰이는 표준적인 손실데이터 압축 방식을 말합니다. MP3 대비 샘플 주파수가 8~96 Khz로 확장되었으며, 최대 48채널을 사용가능합니다. Android에서는 1, 2채널 정도를 사용하고 있으며, 고정 비트레이트의 경우는 필요에 따라서 가변적으로 생성되기도 합니다. AAC에 대해서는 http://wiki.multimedia.cx/index.php?title=MPEG-4_Audio 사이트에 접속하시면 상세하게 설명을 보실 수 있습니다.
  21. 안드로이드에서는 음성, 영상을 녹화해주는 API가 있는데 이걸 사용해야 할 이유가 있을까요? MediaCodec이 API로 공개된 이유는 하드웨어 성능 향상이 큽니다. 기존에는 동영상을 찍고, 재생하는 정도의 역활을 하였다면, 단말기의 동영상을 실시간 인코딩하여 실시간 스트리밍을 한다거나, 음악을 실시간으로 디코딩한다거나 하는 byte 단위 처리가 가능한 MediaCodec API 입니다.
  22. MediaCodec을 사용하기 위한 API와 도구? 입니다. MediaCodec을 이용하여 디코딩을 하기위해서는 MediaExtractor를 사용하여야 합니다. 인코딩시에는 MediaMuxer를 사용이 가능합니다. 그외 OpenGL ES와 NDK 정도를 이해하시면 더 좋은 방법의 인/디코딩이 가능합니다.
  23. 그럼 MediaCodec을 이용하여 인코딩/디코딩 하는 방법을 살펴보기 전에 각 파트별로 나누어 보겠습니다. 우선 Android 4.1부터 추가되었고, Surface를 통한 디코딩을 제공합니다. 디코딩을 byte 단위로 직접 처리할 일이 있으시다면 추천하는 API 입니다. Android 4.3부터 인코딩 기능이 추가되어 Surface를 통한 인코딩이 가능하며, MediaMuxer를 사용할 수 있게 되었습니다. VP8, VP9 인코딩 기능이 추가되었습니다.
  24. MediaCodec을 사용하기 위해서는 Decoder와 Encoder를 초기화 해주어야 합니다. Type은 앞서 소개한 코덱 이름이 되겠고, 이 코덱에 맞는 Decoder와 Encoder를 자동으로 검색하여 초기화 합니다. 좀 더 좋은 코드는 Github와 블로그에 등록해두었으니 추후 참고하시면 되겠습니다. 코덱 생성이 끝났으면 configure를 해주어야 합니다. Configure는 디코딩/인코딩에 따라서 종류가 많습니다. 각각 부분을 살펴보기전에 configure의 원문을 보시면 설정해주어야 하는 값이 많이 있습니다. MediaFormat과 Surface, 그리고 암호화도 지원하고 있습니다. 마지막 flags는 인코딩과 디코딩에 따라서 설정값이 다른데 Encoder는 1이 됩니다. 설정이 끝나면 start()를 호출하면 MediaCodec 사용 준비가 끝이 나는것입니다.
  25. MediaFormat 설정은 인코딩/디코딩에 따라서 설정이 모두 다릅니다. 그 정보를 다 설명할수는 없고, 이 중 다음과 같이 2가지 정도만 설명하겠습니다. 인코딩을 할때에는 단말기의 색상값을 확인해야 합니다. 앞서 소개한것 처럼 I420, NV12를 사용한다고 하더라도 단말기 마다 정확한 색상값 명칭은 5가지 정도가 됩니다. 이를 고정으로 설정하면 당연히 인코딩이 불가능합니다. 관련 예제를 참고하셔서 사용하시면 되겠습니다. Audio 를 byte를 받아와 직접 디코딩할 때에는 csd-0 값을 추가로 넣어야 합니다. MediaExtractor를 이용하면 자동으로 받아지지만 byte를 직접 디코딩해야 할 경우에는 필수요소입니다. 2 byte의 코드로 작성되어야 하는데 여기에는 채널, samplerate, audioProfile 정보입니다. 조합하는 코드는 블로그에 올려두었으니 참고하시면 되겠습니다.
  26. 초기화와 start를 호출하였으니 InputBuffer와 outputBuffer를 생성해야 합니다. 각 buffer는 framework에서 자동으로 생성되니 몇개가 생성될지는 알 수 없습니다.
  27. 생성된 Buffer를 이용하여 데이터를 채워주고, 받아오면 되는 것입니다. 먼저 채워 주는 부분은 아래와 같습니다. dequeueInputBuffer를 통해 index를 받아오고, 해당 buffer에 데이터를 채어넣어 queueInputBuffer를 호출하여 주면 됩니다. 참고로 Muxer를 사용할 때는 public final void queueInputBuffer (int index, int offset, int size, long presentationTimeUs, int flags) 에 4번째 변수인 long을 채워주어야 합니다. 시간은 마이크로 초를 넣어주시면 됩니다.
  28. OutputBuffer를 사용하는 방법입니다. inputbuffer를 하면 인코딩 또는 디코딩을 자동으로 진행하게 됩니다. 진행이 완료되면 outputBuffer에 bufferInfo와 함께 실제 인/디코딩 된 byte가 출력됩니다. 디코딩시에는 Surface에 바로 그려서 사용이 가능하도록 함수가 제공되고 있는데, releaseOutputBuffer()에outputIndex와 boolean 값을 통해 바로 Surface에 Rendering을 할 수 있습니다. 이 코드는 outputBufferIndex는 0 보다 커야 데이터가 출력되는 것으로, 처음 실행시에는 BufferChanged와 OutputFormat changed가 우선 호출됩니다.
  29. 다음 코드로 코덱 사용을 종료하면 MediaCodec 사용법 설명은 끝이 납니다. 실제 코드로 적용할 부분은 더 많이 있는데 간단하게 MediaCodec 사용법을 설명해보았습니다.
  30. 이제 진짜 중요한 부분을 간단하게 설명하고 MediaMuxer를 설명하도록 하겠습니다. Video 인코딩을 원하시는 분이라면 꼭 필요한 정보입니다. 우선 H.264는 넓이가 16의 배수여야 합니다. 1920x1080의 16의 배수는 1920x1088 입니다. MediaCodec의 경우 실제 인코딩시 1920x1080으로 인코딩이 안될 수도 있습니다. 가지고 있으신 단말기에서는 되더라도 다른 폰에서는 안될 수 있으니 16의 배수로 꼭 설정해주셔야 합니다. 색상값을 직접 처리하시기 부담스러우시다면 Surface를 사용하여 인코딩하는게 좋습니다. 단점이라면 OpenGL ES를 알아야 사용이 가능합니다. 디코딩 시에는 Surface를 사용하여 화면 랜더링이 가능합니다.
  31. MediaMuxer는 안드로이드 4.3 이상에서 사용가능합니다. MediaCodec과 함께 사용해야 하며, MP4 파일 생성이 가능합니다. MediaCodec의 경우 순수 데이터로의 H.264와 AAC가 나오게 되며, 모든 프로그램에서 재생이 불가능합니다. 이를 MP4라는 파일 컨테이너에 추가하여야 파일 재생이 가능합니다.
  32. MediaCodec의 return 값 중 MediaCodec.INFO_OUTPUT_FORMAT_CHANGED 에서 다음을 실행하면 됩니다. 각 트랙에 Audio, Video를 순서대로 넣으면 Audio의 track 번호와 Video의 track 번호가 return 됩니다.
  33. Muxer를 초기화 하고, track번호가 return 되었다면 실제 byte를 써주면 됩니다. MediaCodec의 outputIndex가 0보다 큰 부분에서 해당 코드를 짧게 넣어주시면 됩니다. byte와 BufferInfo를 받아오고, 이를 Muxer에 넘겨주기만 하면 됩니다.
  34. 마지막으로 Muxer를 살펴보았습니다. Muxer를 사용할 경우 주의사항은 아래와 같습니다. - MediaMuxer는 파일쓰기 용량이 최대 2GB를 초과하면 안된다. - 기기마다 차이가 나겠지만 Audio는 1또는 2채널로 설정하여야 한다. - Muxer를 사용할 경우 Video/Audio의 동기화 시간을 적어주어야 한다.