如果使用libsox将wav文件转换为:
&in->encoding.encoding = SOX_ENCODING_UNSIGNED;
&in->encoding.bits_per_sample = 8;使用上面的代码?
输入文件的bits_per_sample = 16。
发布于 2009-02-06 05:55:58
所以你是说你告诉SOX把一个16位的WAV样本文件作为一个8位的示例文件来读取?我对SOX一无所知,我希望它能把每个16位样本读成两个8位样本.高阶字节和低阶字节,如:...HLHLHLHLHL.
为了简单起见,我们将把高阶字节样本称为'A‘样本。A‘样本携带的原始声音的动态范围较小,因为具有额外精度的低阶字节已被截断。
我们将把低阶字节样本称为"B样本“。这些将是粗略的随机和编码噪音。
因此,我们将有一个原始的声音,'A‘样本,移动的频率下降了一半。这是因为每一个'A‘样本之间都有一个'B’样本,使'A‘样本的比率减半。“B”样本增加了原始声音的噪音。所以我们会有原始的声音,向下移动一半,带有噪音。
你听到的是这个吗?
编辑嘉宾评论说,目标是将WAV转换为8位音频。读取SoX手册后,SoX似乎总是在内存中使用32位音频,这是sox_read()的结果。传递一个格式只会使它尝试从该格式中读取。
要在内存中向下转换,请使用sox.h中的SOX_SAMPLE_TO_SIGNED_8BIT或SOX_SAMPLE_TO_UNSIGNED_8BIT,即:
sox_format_t ft = sox_open_read("/file/blah.wav", NULL, NULL);
if( ft ) {
sox_ssample_t buffer[100];
sox_size_t amt = sox_read(ft, buffer, sizeof(buffer));
char 8bitsample = SOX_SAMPLE_TO_SIGNED_8BIT(buffer[0], ft->clips);
}若要输出向下转换的文件,请在写入时使用8位格式而不是在读取时使用。
https://stackoverflow.com/questions/519188
复制相似问题