Как записать метки / маркеры в файл WAV в .NET - PullRequest
3 голосов
/ 11 октября 2009

Я хотел бы написать реплики (то есть временные маркеры, а не ID3-подобные теги) в файл WAV с C #. Кажется, что бесплатные аудио библиотеки .NET, такие как NAudio и Bass.NET, не поддерживают это.

Я нашел источник Cue Tools , но он полностью недокументирован и относительно сложен. Есть альтернативы?

1 Ответ

3 голосов
/ 11 октября 2009

Вот ссылка, которая объясняет формат фрагмента cue в файле WAV:

http://www.sonicspot.com/guide/wavefiles.html#cue

Поскольку файл WAV использует формат RIFF, вы можете просто добавить блок cue в конец существующего файла WAV. Чтобы сделать это в .Net, вы должны открыть объект System.IO.FileStream, используя конструктор, который принимает путь, и FileMode (для этой цели вы будете использовать FileMode.Append). Затем вы должны создать BinaryWriter из вашего FileStream и использовать его для написания самого фрагмента битов.

Вот пример грубого кода для добавления фрагмента cue с одной точкой разметки в конец файла WAV:

System.IO.FileStream fs = 
    new System.IO.FileStream(@"c:\sample.wav", 
    System.IO.FileMode.Append);
System.IO.BinaryWriter bw = new System.IO.BinaryWriter(fs);
char[] cue = new char[] { 'c', 'u', 'e', ' ' };
bw.Write(cue, 0, 4); // "cue "
bw.Write((int)28); // chunk size = 4 + (24 * # of cues)
bw.Write((int)1); // # of cues
// first cue point
bw.Write((int)0); // unique ID of first cue
bw.Write((int)0); // position
char[] data = new char[] { 'd', 'a', 't', 'a' };
bw.Write(data, 0, 4); // RIFF ID = "data"
bw.Write((int)0); // chunk start
bw.Write((int)0); // block start
bw.Write((int)500); // sample offset - in a mono, 16-bits-per-sample WAV
// file, this would be the 250th sample from the start of the block
bw.Close();
fs.Dispose();

Примечание : я никогда не использовал и не тестировал этот код, поэтому не уверен, что он работает правильно. Он предназначен для того, чтобы дать вам общее представление о том, как написать это на C #.

...