android media codec 사용하기
Post on 29-Jun-2015
5.583 Views
Preview:
TRANSCRIPT
Android MediaCodec!인코딩 / 디코딩 해보자 !
Taehwan (taehwan@thdev.net)
● 회사다닌지 1 년 5개월● 꿈 많은 개발자가 되자 ! 라는 블로그 운영 .
o http://thdev.net
● 아직은 초보 개발자 !● NDK 개발하는걸 좋아합니다 .
소개 ?
순 서1.인코딩 /디코딩이란 ?2. Codec이란 ?
a. H.264/AVCb. AAC
3. MediaCodec4. MediaMuxer5.추천사이트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, NV12o 사이즈 : width * height * 3 / 2o 참고 : 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 Intervalo 초 단위로 지정이 되며 대략 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/ 을 (를 ) 참조하세요 .
top related