如何将RIFF块数据写入WAV文件的端?是的,这是正确的,到WAV文件的端。为什么?因为这就是我正在替换它的旧程序的方式,并且集成程序是按照这种方式准备的,并且它们不能被修改。
答案 0 :(得分:1)
我个人会使用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 BASS.NET是最好的.NET音频库,特别是低级的东西,实际上是唯一的: - )
答案 1 :(得分:0)
好的,所以最后它并不是真正的标准格式。我们发现,通过利用CueWaveFileWriter
像Mark Heath所说的那样。格式实际上是非常习惯的,看起来更像是这样:
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))
,因为每个标记名称都需要以偶数偏移量开始。老实说,我不知道为什么,我只是知道它。
我不得不说,我现在很有可能对任何文件格式进行逆向工程。但真的,那有什么用呢?!?