我想用C#向WAV文件寫入提示(即基於時間的標記,而不是類ID3標記)。似乎免費的.NET音頻庫,如NAudio和Bass.NET不支持這一點。如何在.NET中將線索/標記寫入WAV文件
我發現了Cue Tools的來源,但它完全沒有記錄,也比較複雜。任何替代品?
我想用C#向WAV文件寫入提示(即基於時間的標記,而不是類ID3標記)。似乎免費的.NET音頻庫,如NAudio和Bass.NET不支持這一點。如何在.NET中將線索/標記寫入WAV文件
我發現了Cue Tools的來源,但它完全沒有記錄,也比較複雜。任何替代品?
下面是解釋了cue
塊的WAV文件格式的鏈接:
http://www.sonicspot.com/guide/wavefiles.html#cue
因爲WAV文件使用RIFF格式,你可以在cue
塊簡單地附加的結束現有的WAV文件。要在.Net中執行此操作,您需要使用構造函數打開System.IO.FileStream
對象,該構造函數採用路徑和FileMode
(爲此目的,您將使用FileMode.Append
)。然後,您將從FileStream
中創建一個BinaryWriter
,並使用它來編寫提示塊本身。
這裏是一個粗略的代碼示例到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#中編寫這個代碼的粗略想法。
謝謝,+1。該方法按預期工作,除了基於一些實驗,樣本偏移量應該只是樣本而不是字節。 – 2009-10-21 19:03:56
這很有道理。我鏈接到的聲音文章將所有東西都稱爲「字節偏移量」,所以我只是假定它是以字節爲單位而不是樣本。很高興知道 - 我最終可能會自己使用此代碼。 – MusiGenesis 2009-10-21 19:37:42
你有閱讀標記的一些代碼嗎? – Basj 2013-12-04 20:21:36
你還有一些閱讀標記的代碼嗎? – Basj 2013-12-04 20:21:59