我如何将RIFF块数据写入使用NAudio制作的WAV文件
本文关键字:NAudio 文件 WAV RIFF 数据 | 更新日期: 2023-09-27 18:07:22
如何将RIFF块数据写入WAV文件的端?是的,没错,到WAV文件的结尾。为什么?因为我要替换的旧程序就是这样做的集成程序就是这样准备的它们不能被修改
我个人会用BASS。. NET,它确实处理RIFF ICMT标签。
EncoderWAV类提供了一个允许它的WAV_AddRiffInfo属性。
// re-encodes a file and adds a comment to it.
var init = Bass.BASS_Init(-1, 44100, BASSInit.BASS_DEVICE_DEFAULT, IntPtr.Zero);
if (init)
{
int channel = Bass.BASS_StreamCreateFile("filename", 0, 0, BASSFlag.BASS_STREAM_DECODE);
var tagInfo = new TAG_INFO { comment = "your comment" };
var encoderWav = new EncoderWAV(channel);
encoderWav.WAV_AddRiffInfo = true;
encoderWav.TAGs = tagInfo;
encoderWav.OutputFile = "output.wav";
var start = encoderWav.Start(null, IntPtr.Zero, false);
Bass.Free();
}
注意:不要忘记把bass.dll放在。exe所在的位置
(首先BASS是一个C库,BASS。. NET为它提供了一个包装器,但也提供了许多原始库中没有的很酷的东西,如编码器,可视化器等。
IMO低音。.NET是。NET最好的音频库,尤其是底层的东西,实际上这是唯一的一个:-)
好的,所以最后它不是一个真正的标准格式。正如马克·希思所说,我们通过利用CueWaveFileWriter
发现了这一点。格式实际上是非常自定义的,看起来更像这样:
LIST - this is a one-time blurb of text.
Tag Name (e.g. ICOP for copyright)
4 bytes indicating the length of the following value + 1. The 1 was a (byte)0 terminator.
Value
所以一个例子可能看起来像这样:
ICOP<bh:15><bh:00><bh:00><bh:00>4/5/2013 10:48:40 AM<bh:00>
所以,为了完成这个,我们创建了一个BinaryWriter
,并直接像这样写出来:
using (BinaryWriter bw = new BinaryWriter(writer))
{
foreach (var item in RIFFChunks)
{
if (!(bw.BaseStream.Position % 2 == 0))
{
bw.Write((byte)0);
}
bw.Write(Encoding.Default.GetBytes(item.Key));
bw.Write(item.Value.Length + 1);
bw.Write(Encoding.Default.GetBytes(item.Value));
bw.Write((byte)0);
}
}
,你可能要注意这行if (!(bw.BaseStream.Position % 2 == 0))
,这需要存在,因为每个标签名称需要在一个偶数偏移开始。我真的不知道为什么,我只知道它确实发生了。
我不得不说,我现在很有可能对任何文件格式进行逆向工程。但说真的,这有什么好处?