Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在给定一些参数的情况下,如何计算音频中的采样数?_C++_Qt_Audio_Signal Processing - Fatal编程技术网

C++ 在给定一些参数的情况下,如何计算音频中的采样数?

C++ 在给定一些参数的情况下,如何计算音频中的采样数?,c++,qt,audio,signal-processing,C++,Qt,Audio,Signal Processing,给定以下参数: Sample size: 16 Channel count: 2 Codec: audio/pcm Byte order: little endian Sample rate: 11025 Sample type: signed int 如何确定录制音频的N毫秒的采样数?我是音频处理方面的新手。编解码器是PCM,所以我猜它是未压缩的音频 我在Windows7Ultimate x64上使用Qt4.8 /** * Converts milliseconds to s

给定以下参数:

Sample size: 16
Channel count: 2
Codec: audio/pcm
Byte order: little endian
Sample rate: 11025
Sample type: signed int
如何确定录制音频的
N毫秒
的采样数?我是音频处理方面的新手。编解码器是PCM,所以我猜它是未压缩的音频

我在Windows7Ultimate x64上使用Qt4.8

   /**
     * 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);
    }

我认为理解这些术语的含义对您来说很重要,这样您就可以编写代码来满足您的需求

采样率是音频每秒的采样数,在您的情况下是11025(有时以KHz表示),与CD audio(44.1KHz)相比,这是相当低的,因此采样率为44100,并且有更高的标准,如48KHz、96KHz

接下来是每个样本使用的位数,通常为8/16/24/32位

接下来,您可以为每个采样设置任意数量的通道

因此,已经发布的代码示例展示了如何将这些数字组合在一起,得到采样的毫秒数,即将通道数乘以采样位,再乘以采样率,该采样率给出了一秒钟音频的数据大小,然后将这个数除以1000,得到毫秒数

当你开始将其应用于视频时,这可能会变得相当棘手,视频处理的帧要么是不错的数字,如每秒25/30/50/60帧,要么是基于NTSC的帧,即每秒23.98/29.97/59.94帧,在这种情况下,你必须进行可怕的计算,以确保它们正确对齐


希望这有帮助。

这里有一个伪代码解决方案:

鉴于

持续时间=20。。。以毫秒计& sr=11025。。。采样频率(Hz)

然后是样本数N

N=sr*dur/1000=220.5


您需要将其四舍五入到最接近的整数。

用户perreal提供了足够的代码示例,因此我认为最好不要重复。如果我理解正确,我认为公式应该是
(int)((long)ms)*sampleRate*channels/1000)/(sampleSize/8)
。我说的对吗?在计算样本数时,样本大小不相关,因为速率不是以字节定义的,而是以样本数定义的。看起来samplesToBytes在乘法中缺少通道数。