Я подумал, что, возможно, вы могли бы преобразовать байты в их двоичное представление, а затем объединить 3 из них, чтобы получить 3 байта для диапазона 16 777 216, но эта теория неверна из того, что я могу сказать.
blockquote>Не уверен, почему это не сработало для вас.
Каждый образец должен быть закодирован, либо с большим или прямым порядком байтов . Вот некоторые методы из библиотеки обработки аудио jipes , которые показывают, как вы можете декодировать байты в сэмплы от младшего или старшего до
int
:private static int byteToIntLittleEndian(final byte[] buf, final int offset, final int bytesPerSample) { int sample = 0; for (int byteIndex = 0; byteIndex < bytesPerSample; byteIndex++) { final int aByte = buf[offset + byteIndex] & 0xff; sample += aByte << 8 * (byteIndex); } return sample; } private static int byteToIntBigEndian(final byte[] buf, final int offset, final int bytesPerSample) { int sample = 0; for (int byteIndex = 0; byteIndex < bytesPerSample; byteIndex++) { final int aByte = buf[offset + byteIndex] & 0xff; sample += aByte << (8 * (bytesPerSample - byteIndex - 1)); } return sample; }
Как только значение будет декодировано Вы все еще должны привести к вашему целевому интервалу. Если вы заинтересованы в 2-байтовом формате, то есть глубине 16 бит, вы просто сделаете это:
final int sample = byteToIntLittleEndian(buf, sampleOffset, bytesPerChannel); final short shortSample = (short)sample;
Приведение заботится о переполнении.
1113 С 3 байтами все немного сложнее. Вы должны знать диапазон значений в первую очередь. Обратите внимание, что поскольку вы заинтересованы в знаковых значениях, это не[0,2^24]
, а:
/** * A constant holding the minimum value a
signed24bit
can * have, -222. */ private static final int MIN_VALUE_24BIT = -2 << 22; /** * A constant holding the maximum value asigned24bit
can * have, 222-1. */ private static final int MAX_VALUE_24BIT = -MIN_VALUE_24BIT-1;Затем вы используете это для преобразования в знаковое значение образца, например:
final int sample = byteToIntLittleEndian(bud, sampleOffset, bytesPerChannel); final int threeByteSample = sample > MAX_VALUE_24BIT ? sample + MIN_VALUE_24BIT + MIN_VALUE_24BIT : sample;
Получите текущую матрицу преобразования через CGContextGetCTM, инвертируйте его с CGAffineTransformInvert и умножьте текущую матрицу на инвертированную (это важно!) с CGContextConcatCTM. CTM является теперь идентификационными данными.