Android media codec ????2. ¢ ????? 1? 5??
¢ ? ?? ???? ??! ?? ??? ??.
o http://thdev.net
¢ ??? ?? ???!
¢ NDK ????? ?????.
???
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
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
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
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/ ?(?) ?????.
Editor's Notes #3: ????? MediaCodec ???? ???? ? ??????. ?? ? ?? ???? ??!?? ???? ??????. 1? 5??? ??? ??? ??, ?? FFMpeg? MediaCodec? ??? ?? ?????. ?? ???? ????? ??? ?? ?????.
#4: ??
?? ??? ???/???? ?? ???, ????? MP4?? ?? ????? ???? ?? ? H.264, AAC? ????? ????,
?? ??? ??? Android API MediaCodec? ??? ??????.#5: ???????? ??, ??? ????? API? ??? ?? ???? ? ??? ?????
MediaCodec? API? ??? ??? ???? ?? ??? ???. ???? ???? ??, ???? ??? ??? ????, ???? ???? ??? ????? ??? ????? ????, ??? ????? ??????? ?? byte ?? ??? ??? MediaCodec API ???.#6: ???? ???? ??? ????? ???? ?? ?????? ???.
?? ???? ????? ???? ??? ???. ???? ???? ?? ?? ???? ???? ???? ???! ?? ? ??? ??????.#7: ???? ??? ???? ? ?????#8: ?????? ????? ??????. ??? ?? ????? ??? ???? ?? ????. ??? ????? ??? ????, ??? ???? ?? ????.#9: ??? ?? ?? ???? ???? ?? ??? ??? ???????. ???? 1? 1?? ??? ????? ??? ???, ???? ??? 2?? ?? ????? ????.#10: ???? ??? ??? ????? ??? ??, ???? ???, ?? ? ?? ? ? ?? ????? ?????? ??? ????. ????? ????? ?? ??, ?? ? ??? ??? ???? ??? ????.#11: ??? Android?? ?? ???? H.264? AAC? ???????.
#12: 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?? ??? ? ?? ??? ????.#13: 1) H.263? ??? H.264? ???? Bit-Rates?? 50% ??? ?? ??? ???? ???. ?? ?? H.265? VP9 ?? H.264? ??? 50% ??? ?? ??? ????? ???.
2) ???? ?? ??
3) ?? ?? ??
4) ???? ??? ??? ?????.#15: ???? ??? ???? ?????? ???. H.264?? ??? ?? 3??? Frame? ????. ??? ???? ??? ???? ???? ????????.#16: I-Frame? Intra-frame?? ?? ????? ??? ???. ?? ??????? ?? ???? ???, ?? ???? B, P-Frame? ?????? ???? ???? ??? ???.
#17: P-Frame? Predictive-frame?? ?? ????? ?? ?? ??? ???. 3?? ??? ??? ??? ? ??? ???? ?? ?? ? ????. ?? ???? P-Frame??? ?????.
B-Frame? Bi-directionally-frame?? ???? ?? ??? ????? ??? ?? ??? ??? ???? ?? ???? ???. ???? ?? ???? Baseline ??????? ???? ?? ??????.#18: ?? ?????? ???? ? Frame? ???? ???? ?????. H.264? YUV420 ???? ?????. YUV? ?? ??, ????? ???? ????? ???.
YUV? ?? TV? ???? ??? ???? ??? ???? ?????. ?? ?? TV? ?? TV? ?? ???? ??? ??????? YUV ???? ???? ?????.#19: Android??? I420? NV12 2?? ????? ???? ?? ???, I420, NV12? ???? ??x??x3/2? ???? ?? 2?? ???? ?? ???? ???. UV? ???? ??? ??? ???? ???.#20: ??? ???? ???? ??? ??? ??? MediaCodec? ????? ???? ? ??? ???????.
Bitrate? ?? ?? ???? ???? ??? ?? ????. H.264??? ? bitrate? ????? ??? ???.#21: FPS?? ?? Frame Per Second ? ??? 1??? ???? ??? ?? ????. ?? ?? 30 FPS?? ?? ? 30?? ???? ????? ?? ??? ???.
MediaCodec??? Frame rate? ???? ?? FPS? ???? ?? FPS? ???? ???? ?????.#22: I-Frame ?? ??? GOP????, ?? ???? ??? ??? I-Frame?? I-Frame ??? ??? ?? ???? 5? ???. ??? 5 frame ?? ?? I-Frame? ?????? ??? ???. 5??? ?? ??? ???? ??? ???? ??? ?? ? ????. ???????? ? I-Frame ??? ?? ? ??? ?????? 1? ?? 5?? ????? ???. FPS? ??????? 1????? 30?? GOP? ?? ?? ????.#23: ??? ??? 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 ???? ????? ???? ??? ?? ? ????.#24: ???????? ??, ??? ????? API? ??? ?? ???? ? ??? ?????
MediaCodec? API? ??? ??? ???? ?? ??? ???. ???? ???? ??, ???? ??? ??? ????, ???? ???? ??? ????? ??? ????? ????, ??? ????? ??????? ?? byte ?? ??? ??? MediaCodec API ???.#25: MediaCodec? ???? ?? API? ??? ???. MediaCodec? ???? ???? ?????? MediaExtractor? ????? ???. ?????? MediaMuxer? ??? ?????. ?? OpenGL ES? NDK ??? ????? ? ?? ??? ?/???? ?????.#26: ?? MediaCodec? ???? ???/??? ?? ??? ???? ?? ? ???? ??? ?????. ?? Android 4.1?? ?????, Surface? ?? ???? ?????. ???? byte ??? ?? ??? ?? ????? ???? API ???.
Android 4.3?? ??? ??? ???? Surface? ?? ???? ????, MediaMuxer? ??? ? ?? ?????. VP8, VP9 ??? ??? ???????.#28: MediaCodec? ???? ???? Decoder? Encoder? ??? ???? ???. Type? ?? ??? ?? ??? ???, ? ??? ?? Decoder? Encoder? ???? ???? ??? ???. ? ? ?? ??? Github? ???? ??????? ?? ????? ?????.
?? ??? ???? configure? ???? ???. Configure? ???/???? ??? ??? ????. ?? ??? ?????? configure? ??? ??? ?????? ?? ?? ?? ????. MediaFormat? Surface, ??? ???? ???? ????. ??? flags? ???? ???? ??? ???? ??? Encoder? 1? ???. ??? ??? start()? ???? MediaCodec ?? ??? ?? ??????.#29: MediaFormat ??? ???/???? ??? ??? ?? ????. ? ??? ? ????? ??, ? ? ??? ?? 2?? ??? ???????.
???? ???? ???? ???? ???? ???. ?? ???? ?? I420, NV12? ????? ???? ??? ?? ??? ??? ??? 5?? ??? ???. ?? ???? ???? ??? ???? ??????. ?? ??? ????? ????? ?????.
Audio ? byte? ??? ?? ???? ??? csd-0 ?? ??? ??? ???. MediaExtractor? ???? ???? ????? byte? ?? ????? ? ???? ???????. 2 byte? ??? ????? ??? ???? ??, samplerate, audioProfile ?????. ???? ??? ???? ?????? ????? ?????.#30: ???? start? ?????? InputBuffer? outputBuffer? ???? ???. ? buffer? framework?? ???? ???? ??? ????? ? ? ????.#31: ??? Buffer? ???? ???? ????, ???? ?? ????. ?? ?? ?? ??? ??? ????. dequeueInputBuffer? ?? index? ????, ?? buffer? ???? ???? queueInputBuffer? ???? ?? ???.
??? Muxer? ??? ?? public final void queueInputBuffer (int index, int offset, int size, long presentationTimeUs, int flags) ? 4?? ??? long? ????? ???. ??? ???? ?? ????? ???.
#32: OutputBuffer? ???? ?????. inputbuffer? ?? ??? ?? ???? ???? ???? ???. ??? ???? outputBuffer? bufferInfo? ?? ?? ?/??? ? byte? ?????. ?????? Surface? ?? ??? ??? ????? ??? ???? ???, releaseOutputBuffer()?outputIndex? boolean ?? ?? ?? Surface? Rendering? ? ? ????.
? ??? outputBufferIndex? 0 ?? ?? ???? ???? ???, ?? ????? BufferChanged? OutputFormat changed? ?? ?????.
#33: ?? ??? ?? ??? ???? MediaCodec ??? ??? ?? ???. ?? ??? ??? ??? ? ?? ??? ???? MediaCodec ???? ????????.#34: ?? ?? ??? ??? ???? ???? MediaMuxer? ????? ?????.
Video ???? ???? ???? ? ??? ?????.
?? H.264? ??? 16? ???? ???. 1920x1080? 16? ??? 1920x1088 ???. MediaCodec? ?? ?? ???? 1920x1080?? ???? ?? ?? ????. ??? ??? ?????? ???? ?? ???? ?? ? ??? 16? ??? ? ?????? ???.
???? ?? ????? ???????? Surface? ???? ?????? ????. ????? OpenGL ES? ??? ??? ?????.
??? ??? Surface? ???? ?? ???? ?????.#37: MediaMuxer? ????? 4.3 ???? ???????. MediaCodec? ?? ???? ??, MP4 ?? ??? ?????.
MediaCodec? ?? ?? ????? H.264? AAC? ??? ??, ?? ?????? ??? ??????. ?? MP4?? ?? ????? ????? ?? ??? ?????.
#39: MediaCodec? return ? ? MediaCodec.INFO_OUTPUT_FORMAT_CHANGED ?? ??? ???? ???.
? ??? Audio, Video? ???? ??? Audio? track ??? Video? track ??? return ???.#40: Muxer? ??? ??, track??? return ???? ?? byte? ??? ???. MediaCodec? outputIndex? 0?? ? ???? ?? ??? ?? ????? ???.
byte? BufferInfo? ????, ?? Muxer? ????? ?? ???.#42: ????? Muxer? ???????. Muxer? ??? ?? ????? ??? ????.
- MediaMuxer? ???? ??? ?? 2GB? ???? ???.
- ???? ??? ???? Audio? 1?? 2??? ????? ??.
- Muxer? ??? ?? Video/Audio? ??? ??? ????? ??.