Как рассчитать количество сэмплов в аудио при заданных параметрах? - PullRequest
5 голосов
/ 06 марта 2012

Даны следующие параметры:

Sample size: 16
Channel count: 2
Codec: audio/pcm
Byte order: little endian
Sample rate: 11025
Sample type: signed int

Как определить количество семплов для N miliseconds записанного звука? Я новичок в обработке звука. Кодек PCM, так что я думаю, что это несжатый звук.

Я использую Qt 4.8 на Windows 7 Ultimate x64.

Ответы [ 3 ]

10 голосов
/ 06 марта 2012
   /**
     * Converts milliseconds to samples of buffer.
     * @param ms the time in milliseconds
     * @return the size of the buffer in samples
     */
    int msToSamples( int ms, int sampleRate, int channels ) {
        return (int)(((long) ms) * sampleRate * channels / 1000);
    }

    /* get size of a buffer to hold nSamples */
    int samplesToBytes(int nSamples, int sampleSizeBits) {
        return nSamples * (sampleSizeBits / 8);
    }

Ссылка

9 голосов
/ 06 марта 2012

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

Частота дискретизации - это количество выборок в секунду аудио, в вашем случае 11025 (иногда это выражается в КГц), это довольно низкое значение по сравнению с чем-то вроде аудио CD, которое составляет 44,1 КГц, поэтому частота дискретизации 44100 и выше стандарты, такие как 48 кГц, 96 кГц.

Далее у вас есть количество битов, используемых для каждой выборки, обычно это может быть 8/16/24/32 бит.

Далее вы можете иметь произвольное количество каналов для каждой выборки.

Итак, пример кода, уже опубликованный, показывает, как применять каждое из этих чисел вместе, чтобы получить ваши миллисекунды для выборок, которые просто умножают количество каналов на биты выборки на частоту выборки, что дает вам размер данных на одну секунду. аудио, затем разделите это число на 1000, чтобы получить миллисекунды.

Это может быть довольно сложно, когда вы начнете применять это к видео, которое имеет дело с кадрами, которые являются либо хорошими числами, такими как 25/30/50/60 кадров в секунду, чем основанные на NTSC, которые составляют 23,98 / 29,97 / 59,94 кадров в секунду в этом случае вы должны выполнить ужасные вычисления, чтобы убедиться в их правильном выравнивании.

Надеюсь, это поможет.

1 голос
/ 18 февраля 2013

Здесь решение в псевдокоде:

Учитывая

длительность = 20 ... в миллисекундах & sr = 11025 ... частота дискретизации в Гц

, затем числовыборок N

N = ср * дур / 1000 = 220,5

Вам нужно округлить это до ближайшего целого числа.

...