6

我正在编写一个用于编辑 Wav 音频文件的 C 程序。我已将所有文件数据加载到一个无符号整数值数组 (UINT16_T) 中。

现在,我想减少文件的体积。我认为减少单个值的值(一定百分比)就足够了。但如果我这样做,我会得到一个带有噪音的音频文件(我想我理解称为“静态”或“点击噪音”)

为什么?哪个是正确的程序?

谢谢你!

这是受影响的一段代码:

    FILE* fp;
    FILE* fp2;

    /*Size of my file*/
    #define BUFFER_SIZE 28242852

    /*Array with file data*/
    unsigned char *buffer;

    /*Array used for converting two bytes in an unsigned int*/
    unsigned char uintBytes[2];

    /*The unsigned int obtained*/
    uint16_t * conv;

    /*The new value calculated*/
    uint16_t nuovoValore;

    /*Array used for the reverse conversion, form UINT to bytes*/
    unsigned char* nuovoValArray;



    for(i=44; i<BUFFER_SIZE;i++){

    if(i%2==0){

        /*I read 2 bytes form the array and "convert" it in an unsigned int*/
        uintBytes[0]=buffer[i];
        uintBytes[1]=buffer[i+1];

        conv=(uint16_t *) &uintBytes[0];

          /*Calculate the new value (-30%) to write in the new file*/

        nuovoValore= *conv - ((float)*conv*30/100);
                  if(nuovoValore<0) nuovoValore=0;

                     nuovoValArray=malloc(2);
         memset(nuovoValArray,'\0',2);
        nuovoValArray=(unsigned char*)&nuovoValore;


            /*Write the two bytes of the new file*/
        fwrite(&nuovoValArray[0], 1, 1, fp2); 
        fwrite(&nuovoValArray[1], 1, 1, fp2);


    }
}
4

1 回答 1

4

为简单起见,请在编译程序之前检查音频文件的所有规格。普通.wav文件具有以下属性:

  • 无压缩(音频格式为 PCM)
  • 16 位样本
  • 单声道(尽管您的程序可能适用于立体声)

因此,请确保您正在解析的音频文件包含这些属性。一旦您确认这些属性对您的音频文件是通用的,您就可以开始测试了。如果您的文件不包含这些属性,您可能需要考虑获取Audacity或类似的东西来制作测试.wav文件。

你的代码有点奇怪。首先将数据转换为 a char,然后转换为int,然后转换为float。这会给你一些严重的错误。所有这些数据类型的大小都不同。Float也有完全不同的二进制格式。A intof value65可能是 a floatof -34564.23(或类似的东西)。只需使用 int16_t.

我还看到您已经为您的代码打开了两个文件 - 不要打扰,因为它会使代码更大。让您的代码尽可能简单,直到它完成您想要的 - 然后添加辅助属性。

另外,在你fwrites写的fwrite (&nuovoValArray[0], 1, 1, fp2),但它应该是fwrite (&nuovoValArray[0], 2, 1, fp2)因为大小int16_t是 2 个字节而不是 1。

当谈到减少文件的体积时,这里有一个应该有效的通用方法:

  • 获取样本samp[i](16 位或 2 字节)
  • 降低音量:samp[i] -= (int16_t) (samp[i] * percent);
  • 增量i
  • 重复

这是一段可能有帮助的代码:

// open file
// read into char * fileBuffer

int sampleCount = ((fileSize - dataOffset) / sizeof (int16_t)); 
int16_t * samp  = (int16_t *) &fileBuffer[dataOffset];
float percent   = 0.6f;

for (int i = 0; i < sampleCount; i++){
    samp[i] -= (int16_t) (samp[i] * percent); // Should work +/- values
}

// save file

我之前编写了一个应用程序,它.wav可以为波形分析绘制图形文件。为了学习文件格式,我只需要阅读这个页面——它也应该对你有所帮助。

于 2013-06-03T22:05:06.213 回答