2

如何将 RIFF 块数据写入WAV 文件的末尾?是的,没错,就是一个WAV文件的结尾。为什么?因为这就是我要替换的旧程序的方式,并且集成程序是为它准备的,它们不能被修改。

4

2 回答 2

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 的最佳音频库,尤其是低级的东西,实际上这是唯一的 :-)

于 2013-04-05T01:46:28.640 回答
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)),因为每个标签名称都需要以偶数偏移量开始。老实说,我不知道为什么,我只知道确实如此。

不过我不得不说,我现在很有可能可以对任何文件格式进行逆向工程。但说真的,这有什么好处?!?

于 2013-04-05T15:15:12.817 回答