/* * myLib - https://github.com/taktod/myLib * Copyright (c) 2014 ttProject. All rights reserved. * * Licensed under The MIT license. */ package com.ttProject.media.flv; /** * コーデック処理 * @author taktod * h263の場合のサイズをとる方法の部分、先頭の部分にデータがはいっているみたい・・・ 00 00 84 00 81 40 00 B4 12 0000 0000 0000 0000 1000 0100 0000 0000 1000 0001 0100 0000 0000 0000 1011 0100 0001 0010 ... DDD = 000の場合 AAAA AAAA AAAA AAAA ABBB BBCC CCCC CCDD DEEE EEEE EFFF FFFF FGGH IIII I DDD = 001の場合 AAAA AAAA AAAA AAAA ABBB BBCC CCCC CCDD DEEE EEEE EEEE EEEE EFFF FFFF FFFF FFFF FGGH IIII I DDDそれ以外の場合 AAAA AAAA AAAA AAAA ABBB BBCC CCCC CCDD DGGH IIII I h263 http://hkpr.info/flash/swf/index.php?%E3%83%93%E3%83%87%E3%82%AA%2FSorenson%20H.263%20%E3%83%93%E3%83%83%E3%83%88%E3%82%B9%E3%83%88%E3%83%AA%E3%83%BC%E3%83%A0%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%83%E3%83%88 h264の場合nal構造のspsをみればいいみたい。 AACの情報 http://jongyeob.com/moniwiki/pds/upload/13818-7.pdf http://ee72078.moo.jp/chinsan/pc/Lab/index.php?AAC http://blog-imgs-18-origin.fc2.com/n/a/n/nanncyatte/aacfileheader.png */ public enum CodecType { NONE, // 映像用コーデック JPEG,H263,SCREEN,ON2VP6,ON2VP6_ALPHA,SCREEN_V2,AVC, // 音声用コーデック PCM,ADPCM,MP3,LPCM,NELLY_16,NELLY_8,NELLY,G711_A,G711_U,RESERVED,AAC,SPEEX,MP3_8,DEVICE_SPECIFIC; /** * 音声用コーデック判定 * @param tagByte * @return */ public static CodecType getAudioCodecType(byte tagByte) { switch((tagByte & 0xFF) >>> 4) { case 0: return PCM; case 1: return ADPCM; // 1byte startPos? 2byte or 4byte 16bit? case 2: return MP3; case 3: return LPCM; // little endian pcm case 4: return NELLY_16; case 5: return NELLY_8; case 6: return NELLY; case 7: return G711_A; case 8: return G711_U; case 9: return RESERVED; case 10: return AAC; case 11: return SPEEX; case 14: return MP3_8; case 15: return DEVICE_SPECIFIC; case 12: // 不明 case 13: // 未定義 default: throw new RuntimeException("判定不能なコーデック"); } } /** * 映像用コーデック判定 * @param tagByte * @return */ public static CodecType getVideoCodecType(byte tagByte) { switch(tagByte & 0x0F) { case 1: return JPEG; case 2: return H263; case 3: return SCREEN; case 4: return ON2VP6; case 5: return ON2VP6_ALPHA; case 6: return SCREEN_V2; case 7: return AVC; case 0: // 不明 default: throw new RuntimeException("判定不能なコーデック"); } } /** * コーデックデータから映像のtagByte用の数値を応答します。 * @param codec * @return * @throws Exception */ public static byte getVideoByte(CodecType codec) throws Exception { switch(codec) { case JPEG: return 1; case H263: return 2; case SCREEN: return 3; case ON2VP6: return 4; case ON2VP6_ALPHA: return 5; case SCREEN_V2: return 6; case AVC: return 7; case NONE: return 0; default: throw new Exception("映像コーデックではありません。"); } } }