0. 代码
extern "C"
{
#ifdef __cplusplus
#define __STDC_CONSTANT_MACROS
#endif
}
extern "C" {
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
}
/**
* Convert PCM-16 data to PCM-8 data.
* @param url Location of PCM file.
*/
int simplest_pcm16le_to_pcm8(const char* url) {
FILE* fp = fopen(url, "rb+");
FILE* fp1 = fopen("output_8.pcm", "wb+");
int cnt = 0;
unsigned char* sample = (unsigned char*)malloc(4);
while (!feof(fp)) {
short* samplenum16 = NULL;
char samplenum8 = 0;
unsigned char samplenum8_u = 0;
fread(sample, 1, 4, fp);
//(-32768-32767)
samplenum16 = (short*)sample;
//存储左声道数据(低位两个字节数据)
//2^16=65536,存储范围-32768-32767
samplenum8 = (*samplenum16) >> 8;
//2^8=256,范围-128-127
//(0-255)
samplenum8_u = samplenum8 + 128;
//L
fwrite(&samplenum8_u, 1, 1, fp1);
samplenum16 = (short*)(sample + 2);
//存储右声道数据(高位两个字节数据)
samplenum8 = (*samplenum16) >> 8;
//获取高8位数据,低8位是高分辨率的部分
samplenum8_u = samplenum8 + 128;
//R
fwrite(&samplenum8_u, 1, 1, fp1);
cnt++;
}
printf("Sample Cnt:%d\n", cnt);
free(sample);
fclose(fp);
fclose(fp1);
return 0;
}
int main()
{
simplest_pcm16le_to_pcm8("NocturneNo2inEflat_44.1k_s16le.pcm");
return 0;
}
1. 效果
原始音频文件,采样范围-32768-32767
处理之后的音频文件,采样范围:0-255,仔细听会发现音质变差了,能听到一点底噪;