gpt4 book ai didi

将 PCM 16 位 LE 转换为 WAV

转载 作者:太空狗 更新时间:2023-10-29 16:13:22 25 4
gpt4 key购买 nike

我正在尝试用 C 编写一个程序,将捕获的 Raw 16kHz PCM 16 位 文件转换为 16 位 WAV

我读过一些帖子,人们推荐使用 libsox。安装了它,现在我真的很难理解 man-page .

到目前为止(通过阅读源 dist 中的示例)我已经发现 structs:

  • sox_format_t
  • sox_signalinfo_t

大概可以用来描述我正在输入的数据。如果有必要,我也知道我正在处理多少信息(时间)?

一些指导表示赞赏!

最佳答案

好吧,当问题得到回答时,它就成功了。不过,我会在此处发布代码,以便人们对其进行分析或仅在他们自己的项目中使用它。

“simonc”和“Nickolay O”提供的链接。被使用了。在网络上搜索有关各个字段的更多信息。

struct wavfile
{
char id[4]; // should always contain "RIFF"
int totallength; // total file length minus 8
char wavefmt[8]; // should be "WAVEfmt "
int format; // 16 for PCM format
short pcm; // 1 for PCM format
short channels; // channels
int frequency; // sampling frequency, 16000 in this case
int bytes_per_second;
short bytes_by_capture;
short bits_per_sample;
char data[4]; // should always contain "data"
int bytes_in_data;
};

//Writes a header to a file that has been opened (take heed that the correct flags
//must've been used. Binary mode required, then you should choose whether you want to
//append or overwrite current file
void write_wav_header(char* name, int samples, int channels){
struct wavfile filler;
FILE *pFile;
strcpy(filler.id, "RIFF");
filler.totallength = (samples * channels) + sizeof(struct wavfile) - 8; //81956
strcpy(filler.wavefmt, "WAVEfmt ");
filler.format = 16;
filler.pcm = 1;
filler.channels = channels;
filler.frequency = 16000;
filler.bits_per_sample = 16;
filler.bytes_per_second = filler.channels * filler.frequency * filler.bits_per_sample/8;
filler.bytes_by_capture = filler.channels*filler.bits_per_sample/8;
filler.bytes_in_data = samples * filler.channels * filler.bits_per_sample/8;
strcpy(filler.data, "data");
pFile = fopen(name, "wb");
fwrite(&filler, 1, sizeof(filler), pFile);
fclose(pFile);
}

关于将 PCM 16 位 LE 转换为 WAV,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13881574/

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