Установите битовую глубину аудиосэмпла в Java

По умолчанию используется возврат неизмененного документа. Если вы хотите, чтобы новый, обновленный документ возвращался, вам нужно передать дополнительный аргумент: объект с свойством new, установленным на true.

http://mongoosejs.com /docs/api.html#model_Model.findOneAndUpdate

Запрос # findOneAndUpdate

function(error, doc) {
  // error: any errors that occurred
  // doc: the document before updates are applied if `new: false`, or after updates if `new = true`
}

Доступные опции

new: bool - если true, вернуть измененный документ, а не оригинал. defaults to false (изменено в 4.0)

Итак, если вы хотите обновленный результат в переменной doc:

Cat.findOneAndUpdate({age: 17}, {$set:{name:"Naomi"}}, {new: true}, function(err, doc){
    if(err){
        console.log("Something wrong when updating data!");
    }

    console.log(doc);
});

1
задан Slimmy Eightythree 15 January 2019 в 23:53
поделиться

1 ответ

Я подумал, что, возможно, вы могли бы преобразовать байты в их двоичное представление, а затем объединить 3 из них, чтобы получить 3 байта для диапазона 16 777 216, но эта теория неверна из того, что я могу сказать.

Не уверен, почему это не сработало для вас.

Каждый образец должен быть закодирован, либо с большим или прямым порядком байтов . Вот некоторые методы из библиотеки обработки аудио 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 <code>signed24bit</code> can
 * have, -2<sup>22</sup>.
 */
private static final int MIN_VALUE_24BIT = -2 << 22;

/**
 * A constant holding the maximum value a <code>signed24bit</code> can
 * have, 2<sup>22</sup>-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;
0
ответ дан hendrik 15 January 2019 в 23:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: