C++ 使用c/c+将Lame wav连接到阵列并返回到wav+;

C++ 使用c/c+将Lame wav连接到阵列并返回到wav+;,c++,c,encoding,wav,lame,C++,C,Encoding,Wav,Lame,我可以将wav文件转换为简单的c double或int数组并转换回新的wav文件吗?我想在wav文件中使用一些c过滤器。我认为这是可能的。但我不知道怎么做。有人可以链接一些文档或代码片段吗?我如何使用它 wav文件->数组->某些操作->wav文件 谢谢你的回答。这与Lame无关。Lame是一种用于编码MP3文件的工具 有许多用于读取和写入WAV文件的库。您甚至可以自己编写,但这很不方便,因为WAV文件有很多不同的样本格式:8位、16位、24位、浮点、ADPCM、µlaw等 您可以使用读取WAV

我可以将wav文件转换为简单的c double或int数组并转换回新的wav文件吗?我想在wav文件中使用一些c过滤器。我认为这是可能的。但我不知道怎么做。有人可以链接一些文档或代码片段吗?我如何使用它

wav文件->数组->某些操作->wav文件


谢谢你的回答。

这与Lame无关。Lame是一种用于编码MP3文件的工具

有许多用于读取和写入WAV文件的库。您甚至可以自己编写,但这很不方便,因为WAV文件有很多不同的样本格式:8位、16位、24位、浮点、ADPCM、µlaw等

您可以使用读取WAV文件

WAV文件中的字段没有固定偏移量
粗体+大型的原因是很多人认为WAV文件中的数据总是以44字节开始。这根本不是事实。WAV文件是RIFF文件,可以包含任意数量的数据块,其中一个或多个包含示例数据。您无法处理深奥的WAV文件是可以原谅的,但如果您对文件中的数据位置进行假设,则最终可能会产生垃圾。

是的,这是可能的。Wav格式是非常明确的,它通常使用2个通道的16位样本。它们可以精确地表示为整数、浮点数和双精度数

正如simonc在评论中所说的那样,典型的格式非常简单,学习使用图书馆是不值得的。如果wav的长度不变,则可通过以下方式进行转换/过滤:

fread(header,1,44,in_file); fwrite(header,1,44,out_file);
short int block[1024];  // left and right channel will be interleaved.
while (c=fread(block, 2, 1024, fp))
{  
    filter_in_place(block,c); 
    fwrite(block, 2,c, out_file);
}

谢谢你的快速回答,我尝试libsndfile。Lame从同一种源生成的Wav中的字段将具有完全相同的标题。我可以在mac中使用libsndfile吗?@akishuihkonen:当Lame开发人员决定将ID3标记复制到Wav文件时会发生什么?对不起,我不明白假设一个固定的偏移量如何使事情变得更容易,因为使用一个库已经很容易了,而且不涉及对其他软件的假设。@DietrichEpp:对谁来说容易?您确定该库在OP的系统上可用,并且易于安装,并且解决了所有依赖关系吗?总之,在了解了wav格式的波动性之后,做一些非常简单的测试来检查“数据”或“fmt”标记是否在假设的位置并不是一个大的步骤,这也是一个过程,这是任何初学者学习更多有价值的课程都必须学习的。方法非常简单——在前44个字节之后的所有内容都是原始pcm数据,所以复制到数组中非常简单。NumChannels(字节偏移量22)和BitsPerSample(偏移量34)可能是标题中最有趣的部分。@simonc:WAV文件非常简单是一种常见的误解。数据并不总是显示在44字节处。其他字段也可以以不同的偏移量出现。这是一个怪兽。有很多可选块。这些数据可以以几十种不同的格式出现,可以,但是如果输出是由lame制作的,并且这些数据不必具有商业质量;考虑到这显然是为初学者准备的,为什么要建议一些太复杂、太“正确”的东西呢?@DietrichEpp听起来我读错了医生,你能给我指一下说明书吗?如果你知道任何以其他形式输出WAV的应用程序,我也会很感兴趣。@simonc:我不知道从哪里获得规范。如果有帮助的话,你也可以搜索RIFF规范。任何在文件中放入比样本数据更多内容的程序都会添加额外的块。例如,我刚刚启动了“Amadeus Lite”,录制了一个简短的音频文件,添加了一个标记,并保存了它。标记显示为一个“提示”块,数据块在文件中被推得更远。我可以再次打开文件,但标记仍在那里。事实上,据我所知,甚至可以把信息块放在数据块之后,这真的把事情搞砸了。