gpt4 book ai didi

c - 如何更改 .wav 文件的音量?

转载 作者:行者123 更新时间:2023-12-03 02:29:19 27 4
gpt4 key购买 nike

我的代码只是复制标题,但不会在第二个循环中改变音量。

// TODO: Copy header from the input file to the output file

uint8_t header[HEADER_SIZE];
uint8_t* header_p=malloc(HEADER_SIZE * sizeof(uint8_t));
while(fread(&header_p,sizeof(header[HEADER_SIZE]),1,input))
{
fwrite(&header_p,sizeof(header[HEADER_SIZE]),1,output);
}

// TODO: Read samples from the input file and write updated data to the output file

int16_t buffer;

while(fread(&buffer,sizeof(buffer),1,input))
{
buffer =(int16_t)(buffer*factor);
fwrite(&buffer,sizeof(buffer),1,output);
}

最佳答案

如果一个特定的 WAV 文件仅包含一个 header ,后跟代表声音数据的 16 位有符号值,那么您的错误将出现在第一个 while 循环中。此循环继续复制 sizeof(header[HEADER_SIZE]) (实际上是 header 中一个元素的大小为 1)从输入到输出的 block ,直到到达文件末尾,第二个 while 循环将不会进入。
只需复制一次 header ,然后使用更合适的缩放算法来解决其他一些问题。例如:

uint8_t header[HEADER_SIZE];
/* There is only one header, so parse it just once */
if (fread(&header[0], sizeof(header), 1, input)) {
fwrite(&header[0], sizeof(header), 1, output);
}

/* Assuming 16-bit signed integer PCM payload */
int16_t sample;
while(fread(&sample, sizeof(sample), 1, input)) {
/* Round value to nearest number */
double scaledValue = floor((sample * factor) + 0.5);

/* Clamp new value */
if (scaledValue >= INT16_MAX) {
sample = INT16_MAX;
} else if (scaledValue <= INT16_MIN) {
sample = INT16_MIN;
} else {
sample = (int16_t)scaledValue;
}
fwrite(&sample, sizeof(sample), 1, output);
}
然而 .wav 文件格式并没有那么简单,并且有多种变体,16 位带符号的 PCM 值只是其中之一。示例数据的大小和格式也在标题中给出,您需要仔细解析标题并采取相应措施。有关 .wav 文件格式的更多信息,我想这些是一个很好的起点:
  • https://en.wikipedia.org/wiki/WAV
  • http://www-mmsp.ece.mcgill.ca/Documents/AudioFormats/WAVE/WAVE.html
  • http://soundfile.sapp.org/doc/WaveFormat/
  • 关于c - 如何更改 .wav 文件的音量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64134168/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com