Как записать метки / маркеры в файл WAV в.NET

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

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

1 ответ

Решение

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

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

Поскольку файл 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#.

Другие вопросы по тегам