1
/*
WaveAccess
2
* 提供wav文件头的访问
3
* 和文件写入相关操作
4
*/
5
6
class
WaveAccess
7
{
8
9
private
byte
[] riff;
//
4
10
private
byte
[] riffSize;
//
4
11
private
byte
[] waveID;
//
4
12
private
byte
[] fmtID;
//
4
13
private
byte
[] notDefinition;
//
4
14
private
byte
[] waveType;
//
2
15
private
byte
[] channel;
//
2
16
private
byte
[] sample;
//
4
17
private
byte
[] send;
//
4
18
private
byte
[] blockAjust;
//
2
19
private
byte
[] bitNum;
//
2
20
private
byte
[] unknown;
//
2
21
private
byte
[] dataID;
//
4
22
private
byte
[] dataLength;
//
4
23
24
short
[] data;
25
private
string
longFileName;
26
27
public
string
LongFileName
28
{
29
get
{
return
longFileName; }
30
}
31
32
public
string
ShortFileName
33
{
34
get
35
{
36
int
pos
=
LongFileName.LastIndexOf(
"
\\
"
);
37
return
LongFileName.Substring(pos
+
1
);
38
}
39
}
40
41
public
short
[] Data
42
{
43
get
{
return
data; }
44
set
{ data
=
value; }
45
}
46
47
public
string
Riff
48
{
49
get
{
return
Encoding.Default.GetString(riff); }
50
set
{ riff
=
Encoding.Default.GetBytes(value); }
51
}
52
53
public
uint
RiffSize
54
{
55
get
{
return
BitConverter.ToUInt32(riffSize,
0
); }
56
set
{ riffSize
=
BitConverter.GetBytes(value); }
57
}
58
59
60
public
string
WaveID
61
{
62
get
{
return
Encoding.Default.GetString(waveID); }
63
set
{ waveID
=
Encoding.Default.GetBytes(value); }
64
}
65
66
67
public
string
FmtID
68
{
69
get
{
return
Encoding.Default.GetString(fmtID); }
70
set
{ fmtID
=
Encoding.Default.GetBytes(value); }
71
}
72
73
74
public
int
NotDefinition
75
{
76
get
{
return
BitConverter.ToInt32(notDefinition,
0
); }
77
set
{ notDefinition
=
BitConverter.GetBytes(value); }
78
}
79
80
81
public
short
WaveType
82
{
83
get
{
return
BitConverter.ToInt16(waveType,
0
); }
84
set
{ waveType
=
BitConverter.GetBytes(value); }
85
}
86
87
88
public
ushort
Channel
89
{
90
get
{
return
BitConverter.ToUInt16(channel,
0
); }
91
set
{ channel
=
BitConverter.GetBytes(value); }
92
}
93
94
95
public
uint
Sample
96
{
97
get
{
return
BitConverter.ToUInt32(sample,
0
); }
98
set
{ sample
=
BitConverter.GetBytes(value); }
99
}
100
101
102
public
uint
Send
103
{
104
get
{
return
BitConverter.ToUInt32(send,
0
); }
105
set
{ send
=
BitConverter.GetBytes(value); }
106
}
107
108
109
public
ushort
BlockAjust
110
{
111
get
{
return
BitConverter.ToUInt16(blockAjust,
0
); ; }
112
set
{ blockAjust
=
BitConverter.GetBytes(value); }
113
}
114
115
116
public
ushort
BitNum
117
{
118
get
{
return
BitConverter.ToUInt16(bitNum,
0
);}
119
set
{ bitNum
=
BitConverter.GetBytes(value); }
120
}
121
122
123
public
ushort
Unknown
124
{
125
get
126
{
127
if
(unknown
==
null
)
128
{
129
return
1
;
130
}
131
else
132
return
BitConverter.ToUInt16(unknown,
0
);
133
}
134
135
set
{ unknown
=
BitConverter.GetBytes(value); }
136
}
137
138
139
public
string
DataID
140
{
141
get
{
return
Encoding.Default.GetString(dataID); }
142
set
{ dataID
=
Encoding.Default.GetBytes(value); }
143
}
144
145
public
uint
DataLength
146
{
147
get
{
return
BitConverter.ToUInt32(dataLength,
0
); }
148
set
{ dataLength
=
BitConverter.GetBytes(value); }
149
}
150
151
152
public
WaveAccess() { }
153
154
public
WaveAccess(
string
filepath)
155
{
156
try
157
{
158
riff
=
new
byte
[
4
];
159
riffSize
=
new
byte
[
4
];
160
waveID
=
new
byte
[
4
];
161
fmtID
=
new
byte
[
4
];
162
notDefinition
=
new
byte
[
4
];
163
waveType
=
new
byte
[
2
];
164
channel
=
new
byte
[
2
];
165
sample
=
new
byte
[
4
];
166
send
=
new
byte
[
4
];
167
blockAjust
=
new
byte
[
2
];
168
bitNum
=
new
byte
[
2
];
169
unknown
=
new
byte
[
2
];
170
dataID
=
new
byte
[
4
];
//
52
171
dataLength
=
new
byte
[
4
];
//
56 个字节
172
173
longFileName
=
filepath;
174
175
176
FileStream fs
=
new
FileStream(filepath,FileMode.Open);
177
BinaryReader bread
=
new
BinaryReader(fs);
178
riff
=
bread.ReadBytes(
4
);
179
riffSize
=
bread.ReadBytes(
4
);
180
waveID
=
bread.ReadBytes(
4
);
181
fmtID
=
bread.ReadBytes(
4
);
182
notDefinition
=
bread.ReadBytes(
4
);
183
waveType
=
bread.ReadBytes(
2
);
184
channel
=
bread.ReadBytes(
2
);
185
sample
=
bread.ReadBytes(
4
);
186
send
=
bread.ReadBytes(
4
);
187
blockAjust
=
bread.ReadBytes(
2
);
188
bitNum
=
bread.ReadBytes(
2
);
189
if
(BitConverter.ToUInt32(notDefinition,
0
)
==
18
)
190
{
191
unknown
=
bread.ReadBytes(
2
);
192
}
193
dataID
=
bread.ReadBytes(
4
);
194
dataLength
=
bread.ReadBytes(
4
);
195
uint
length
=
DataLength
/
2
;
196
data
=
new
short
[length];
197
for
(
int
i
=
0
; i
<
length; i
++
)
198
{
199
data[i]
=
bread.ReadInt16();
//
读入2字节有符号整数
200
}
201
fs.Close();
202
bread.Close();
203
}
204
catch
(System.Exception ex)
205
{
206
Console.Write(ex.Message);
207
}
208
}
209
210
public
short
[] GetData(
uint
begin,
uint
end )
211
{
212
if
((end
-
begin)
>=
Data.Length)
213
return
Data;
214
else
215
{
216
uint
temp
=
end
-
begin
+
1
;
217
short
[] dataTemp
=
new
short
[temp];
218
uint
j
=
begin;
219
for
(
int
i
=
0
; i
<
temp; i
++
)
220
{
221
dataTemp[i]
=
Data[j];
222
j
++
;
223
}
224
return
dataTemp;
225
}
226
227
}
228
229
///
<summary>
230
///
生成wav文件到系统
231
///
</summary>
232
///
<param name="fileName">
要保存的文件名
</param>
233
///
<returns></returns>
234
public
bool
bulidWave(
string
fileName)
235
{
236
try
237
{
238
FileInfo fi
=
new
FileInfo(fileName);
239
if
(fi.Exists)
240
fi.Delete();
241
FileStream fs
=
new
FileStream(fileName, FileMode.CreateNew);
242
BinaryWriter bwriter
=
new
BinaryWriter(fs);
//
二进制写入
243
bwriter.Seek(
0
, SeekOrigin.Begin);
244
bwriter.Write(Encoding.Default.GetBytes(
this
.Riff));
//
不可以直接写入string类型的字符串,字符串会有串结束符,比原来的bytes多一个字节
245
bwriter.Write(
this
.RiffSize);
246
bwriter.Write(Encoding.Default.GetBytes(
this
.WaveID));
247
bwriter.Write(Encoding.Default.GetBytes(
this
.FmtID));
248
bwriter.Write(
this
.NotDefinition);
249
bwriter.Write(
this
.WaveType);
250
bwriter.Write(
this
.Channel);
251
bwriter.Write(
this
.Sample);
252
bwriter.Write(
this
.Send);
253
bwriter.Write(
this
.BlockAjust);
254
bwriter.Write(
this
.BitNum);
255
if
(
this
.Unknown
!=
0
)
256
bwriter.Write(
this
.Unknown);
257
bwriter.Write(Encoding.Default.GetBytes(
this
.DataID));
258
bwriter.Write(
this
.DataLength);
259
260
for
(
int
i
=
0
; i
<
this
.Data.Length; i
++
)
261
{
262
bwriter.Write(
this
.Data[i]);
263
}
264
265
266
bwriter.Flush();
267
fs.Close();
268
bwriter.Close();
269
fi
=
null
;
270
return
true
;
271
}
272
catch
(System.Exception ex)
273
{
274
Console.Write(ex.Message);
275
return
false
;
276
}
277
}
278
279
}