質問編集履歴

2

参考サイトを追加

2021/01/16 07:30

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
 
4
4
 
5
-
5
+ 参考サイト: https://www.youfit.co.jp/archives/1418
6
6
 
7
7
  再生時間5秒です
8
8
 

1

文章を修正しました。

2021/01/16 07:30

投稿

退会済みユーザー
test CHANGED
@@ -1 +1 @@
1
- 音声ファイルの再生時間を算出する際の4 * sample_rateの4の理由が知りたい
1
+ 音声ファイルの再生時間を算出たい
test CHANGED
@@ -1,210 +1,448 @@
1
- 提示コードの//ここで時間を取得部のコードですが
2
-
3
- int time_playback =(int) ( (float)wavSize / (float)(4 * wavSamplingrate) ); // 時間を取得
1
+ 提示コードの///////内部のコードですが。再生時間を取得する方法が知りたいです。どうすればいいのでしょか?
2
+
3
+
4
+
5
+
6
+
4
-
7
+ 再生時間5秒です
8
+
5
- ド部の * 4 は一体なんのためにやっているのでしょうか?
9
+ ![イメジ説明](aeef15fa5d26b2500cd02f4c2a7146b4.jpeg)
6
-
7
-
8
-
9
-
10
-
11
-
12
10
 
13
11
 
14
12
 
15
13
  ```cpp
16
14
 
17
-
18
-
19
- /**
15
+ #include "stdio.h"
16
+
20
-
17
+ #include "OpenAL/include/al.h"
18
+
19
+ #include "OpenAL/include/alc.h"
20
+
21
+
22
+
21
- * main
23
+ #define HEADER_SIZE ((int)44)
22
-
23
- */
24
+
24
-
25
+
26
+
27
+
28
+
25
- //int main(int argc, char** argv)
29
+ // ########## チャンクデータ
30
+
26
-
31
+ struct Chunk_Data {
32
+
33
+
34
+
35
+ public:
36
+
37
+
38
+
39
+ char riff[5]; // "RIFF"(固定)
40
+
41
+ int chunk_size; //チャンクのサイズ
42
+
43
+ int format; //フォーマット
44
+
45
+ char fmt[5]; // "fmt"(固定)
46
+
47
+ int fmt_chunk_byte; //fmtチャンクのバイト数
48
+
49
+ short sound_format; //音フォーマット
50
+
51
+ short channel; //チャンネル数
52
+
53
+ int sample_rate; //サンプリング周波数
54
+
55
+ int byte_per_sec; //1秒あたりのバイトの平均
56
+
57
+ short block_size; //ブロックサイズ
58
+
59
+ short bit_per_sample; //1サンプルに必要なビット数
60
+
61
+
62
+
63
+ short extension_size; //拡張パラメーター サイズ
64
+
65
+ unsigned char* extension_data = nullptr; //拡張パラメーター
66
+
67
+
68
+
69
+ char sub_chunck[5]; // "data"(固定)
70
+
71
+ int DataSize; //波形データのバイト数
72
+
73
+ int all_DataSize; //ファイル全体のサイズ
74
+
27
- int main ()
75
+ int playTime;
76
+
77
+
78
+
79
+ };
80
+
81
+
82
+
83
+
84
+
85
+ // バイナリを各型に変換
86
+
87
+ int convInt(unsigned char* header, int start)
28
88
 
29
89
  {
30
90
 
91
+ int ret = (header[start + 3] << 24) | (header[start + 2] << 16) | (header[start + 1] << 8) | (header[start + 0]);
92
+
93
+
94
+
95
+ return ret;
96
+
97
+ }
98
+
99
+
100
+
101
+ short convShort(unsigned char* header, int start)
102
+
103
+ {
104
+
105
+ int ret = (header[start + 1] << 8) | (header[start + 0]);
106
+
107
+ return ret;
108
+
109
+ }
110
+
111
+
112
+
113
+ char convChar(unsigned char* header, int start)
114
+
115
+ {
116
+
117
+ char ret = header[start];
118
+
119
+ return ret;
120
+
121
+ }
122
+
123
+
124
+
125
+ // 拡張パラメータを処理する。
126
+
127
+ void extention_process(unsigned char* header,const int &size,unsigned char* data,const int &format)
128
+
129
+ {
130
+
131
+
132
+
133
+ }
134
+
135
+
136
+
137
+ int main()
138
+
139
+ {
140
+
141
+ // const char* file = "sample2.wav"; //ファイル名指定
142
+
31
- char argv[] = "sample.wav";
143
+ const char* file = "sample.wav"; //ファイル名指定
144
+
32
-
145
+ FILE* fp = NULL; //ファイルポインタ
146
+
147
+
148
+
149
+ struct Chunk_Data chunk;
150
+
151
+
152
+
153
+
154
+
33
- ALuint source;
155
+ ALuint source;
34
-
156
+
35
- ALuint buffer;
157
+ ALuint buffer;
158
+
159
+
160
+
161
+ // デバイスを開く
162
+
163
+ ALCdevice* device = alcOpenDevice(NULL);
164
+
165
+ if (!device)
166
+
167
+ {
168
+
169
+ printf("デバイスを作成出来ません。\n");
170
+
171
+ }
36
172
 
37
173
 
38
174
 
39
- ///////////////////////////////////////////////////////////////////////////////
40
-
41
- printf("Usage: %s <wavFile> \n", argv);
42
-
43
-
44
-
45
- char *input = argv;
46
-
47
-
48
-
49
-
50
-
51
- //デバイスを開く
52
-
53
- ALCdevice *device = alcOpenDevice(NULL);
175
+ ALCcontext* context = alcCreateContext(device,NULL);
54
-
176
+
55
- if (!device){
177
+ if (!context)
178
+
56
-
179
+ {
180
+
57
- printf("alcOpenDevice Faild \n");
181
+ printf("コンテキストを作成出来ません。\n");
58
-
59
- return EXIT_FAILURE;
182
+
60
-
61
- }
183
+ }
62
-
63
-
64
-
65
- //コンテキストを作成
184
+
66
-
67
- ALCcontext *context = alcCreateContext(device, NULL);
185
+
68
-
69
- if (!context){
186
+
70
-
71
- printf("alcCreateContext Faild \n");
72
-
73
- return EXIT_FAILURE;
74
-
75
- }
76
-
77
-
78
-
79
- alcMakeContextCurrent(context); //コンテキストを適用
187
+ alcMakeContextCurrent(context); // コンテキストを適用
80
-
188
+
189
+
190
+
81
- ////////////////////////////////////////////////////////////////////////////////
191
+ alGenSources(1, &source); //
192
+
82
-
193
+ alGenBuffers(1, &buffer); //
194
+
195
+
196
+
83
- // ファイルを開く
197
+ //ファイルを開く
84
-
85
- FILE* fp = NULL;
198
+
86
-
87
- fopen_s(&fp, input, "rb");
199
+ fopen_s(&fp, file, "rb");
88
200
 
89
201
  if (!fp) {
90
202
 
91
- printf("fopen Faild: %s\n", input);
203
+ printf("ファイルが開けません。\n");
92
-
93
- return EXIT_FAILURE;
204
+
94
-
205
+
206
+
95
- }
207
+ }
208
+
209
+
210
+
96
-
211
+ //////////////////////////////////////////////////////////////////////////////////
212
+
213
+
214
+
97
-
215
+ unsigned char* Data;//音データーのサイズ
216
+
98
-
217
+ unsigned char header[HEADER_SIZE] = { 0 }; //ヘッダーサイズ
218
+
219
+
220
+
221
+
222
+
99
- alGenSources (1, &source); //
223
+ fread(header, 1, HEADER_SIZE, fp); //チャンクデタを読み込む
224
+
225
+
226
+
227
+
228
+
100
-
229
+ //riff識別子4バイト
230
+
231
+ chunk.riff[0] = convChar(header, 0);
232
+
233
+ chunk.riff[1] = convChar(header, 1);
234
+
235
+ chunk.riff[2] = convChar(header, 2);
236
+
237
+ chunk.riff[3] = convChar(header, 3);
238
+
239
+ chunk.riff[4] = '\0';
240
+
241
+
242
+
243
+ chunk.chunk_size = convInt(header, 4); //チャンクサイズ
244
+
245
+
246
+
101
- alGenBuffers(1, &buffer); //バッ
247
+ chunk.format = convInt(header, 8); //フマット
102
-
103
-
104
248
 
105
249
 
106
250
 
107
- printf("fopen : %s\n", input);
108
-
109
-
110
-
111
- // ヘッダーを読み込む
112
-
113
- int wavChannels, wavBit, wavSize, wavSamplingrate;
114
-
115
- int ret = readWavHeader(fp, &wavChannels, &wavBit, &wavSize, &wavSamplingrate);
116
-
117
- if (ret != 0){
118
-
119
- printf("NOT wav format \n");
120
-
121
- return EXIT_FAILURE;
122
-
123
- }
124
-
125
-
126
-
127
- printf("wavChannels: %d \n", wavChannels);
128
-
129
- printf("wavBit: %d \n", wavBit);
130
-
131
- printf("wavSize: %d \n", wavSize);
132
-
133
- printf("wavSamplingrate: %d \n", wavSamplingrate);
134
-
135
-
136
-
137
- int time_playback =(int) ( (float)wavSize / (float)(4 * wavSamplingrate) ); // 時間を取得
138
-
139
- printf("time_playback: %d sec \n", time_playback);
140
-
141
-
142
-
143
-
144
-
145
- // read pcm data
146
-
147
- unsigned char * data = new unsigned char[wavSize];
148
-
149
-
150
-
151
- int rsize = fread(data, 1, wavSize, fp);
152
-
153
- if(rsize != wavSize){
154
-
155
- printf("fread faild \n");
156
-
157
- }
158
-
159
-
160
-
161
- ALenum format = getFormat(wavChannels, wavBit);
162
-
163
- alBufferData(buffer, format, data, wavSize, wavSamplingrate);
164
-
165
-
166
-
167
- alSourcei (source, AL_BUFFER, buffer);
168
-
169
-
170
-
171
- alSourcePlay (source);
172
-
173
- printf("alSourcePlay \n");
174
-
175
-
176
-
177
- int time_count = 0;
178
-
179
-
180
-
181
- Sleep(1000);
182
-
183
-
184
-
185
- // cleanup
186
-
187
- alDeleteBuffers(1, &buffer);
188
-
189
- alDeleteSources(1, &source);
251
+ //fmt識別子
252
+
253
+ chunk.fmt[0] = convChar(header, 12);
254
+
255
+ chunk.fmt[1] = convChar(header, 13);
256
+
257
+ chunk.fmt[2] = convChar(header, 14);
258
+
259
+ chunk.fmt[3] = convChar(header, 15);
260
+
261
+ chunk.fmt[4] = '\0';
262
+
263
+
264
+
265
+ chunk.fmt_chunk_byte = convInt(header, 16); //fmt識別子のチャンクバイト数
266
+
267
+
268
+
269
+ chunk.sound_format = convShort(header,20); //音フォーマット
270
+
271
+ chunk.channel = convShort(header, 22); //チャンネル数
272
+
273
+
274
+
275
+ chunk.sample_rate = convInt(header, 24); //サンプリング周波数
276
+
277
+ chunk.byte_per_sec = convInt(header, 28); //1秒あたりのバイトの平均
278
+
279
+
280
+
281
+
282
+
283
+ chunk.block_size = convShort(header, 32); //ブロックサイズ
284
+
285
+ chunk.bit_per_sample = convShort(header,34); //1サンプルに必要なビット数
286
+
287
+
190
288
 
191
289
 
192
290
 
193
-
194
-
195
- delete [] data;
291
+ //PCMかどうかを判定
292
+
196
-
293
+ if ((int)chunk.sound_format != 1)
294
+
197
-
295
+ {
296
+
198
-
297
+ printf("PCMデータではありません。フォーマット処理未実装: 0x%x \n", chunk.sound_format);
298
+
299
+ chunk.extension_size = convShort(header, 36); //拡張サイズ
300
+
301
+ chunk.extension_data = nullptr; //拡張データ
302
+
303
+
304
+
305
+ extention_process(header, chunk.extension_size, chunk.extension_data, chunk.sound_format); //フォーマット処理
306
+
307
+ }
308
+
199
- fclose(fp);
309
+ else {
310
+
200
-
311
+ // PCMの場合
312
+
201
-
313
+ // chunk.extension_size = convShort(header,36); //拡張サイズ
314
+
202
-
315
+ chunk.extension_data = nullptr; //拡張データ
316
+
317
+
318
+
319
+ chunk.sub_chunck[0] = convChar(header, 36);
320
+
321
+ chunk.sub_chunck[1] = convChar(header, 37);
322
+
323
+ chunk.sub_chunck[2] = convChar(header, 38);
324
+
325
+ chunk.sub_chunck[3] = convChar(header, 39);
326
+
327
+ chunk.sub_chunck[4] = '\0';
328
+
329
+
330
+
331
+ chunk.DataSize = convInt(header,40);
332
+
333
+ chunk.all_DataSize = chunk.DataSize + 40;
334
+
335
+
336
+
337
+ }
338
+
339
+
340
+
341
+
342
+
343
+
344
+
345
+ printf("### チャンク情報 ###\n\n");
346
+
347
+ printf("# チャンク ID: 0x%x%x%x%x\n", chunk.riff[0], chunk.riff[1], chunk.riff[2], chunk.riff[3]);
348
+
349
+ printf("# チャンクサイズ: %d\n", chunk.chunk_size);
350
+
351
+ printf("# フォーマット: %d\n", chunk.format);
352
+
353
+
354
+
355
+ printf("# fmt ID: 0x%x%x%x%x\n", chunk.fmt[0], chunk.fmt[1], chunk.fmt[2], chunk.fmt[3]);
356
+
357
+
358
+
359
+ printf("# fmtチャンクのバイト数: %d\n", chunk.fmt_chunk_byte);
360
+
361
+ printf("# 音フォーマット: 0x%x\n", chunk.sound_format);
362
+
363
+ printf("# チャンネル数: %d\n", (int)chunk.channel);
364
+
365
+ printf("# サンプリング周波数: %d\n", chunk.sample_rate);
366
+
367
+ printf("# 1秒あたりバイト数の平均: %d\n", chunk.byte_per_sec);
368
+
369
+ printf("# ブロックサイズ: %d\n", chunk.block_size);
370
+
371
+ printf("# 1サンプルに必要なビット数: %d\n\n\n", chunk.bit_per_sample);
372
+
373
+
374
+
375
+ if (chunk.sound_format == 1)
376
+
377
+ {
378
+
379
+ printf("# 拡張パラメーター サイズ: 未使用 \n");
380
+
381
+ printf("# 拡張パラメーター: 未使用 \n");
382
+
383
+
384
+
385
+
386
+
387
+ }else
388
+
389
+ {
390
+
391
+ printf("# 拡張パラメーター サイズ: %d\n", chunk.extension_size);
392
+
393
+ printf("# 拡張パラメーター: 存在する。\n");
394
+
395
+ }
396
+
397
+
398
+
399
+ printf("# サブチャンク識別子: 0x%x%x%x%x\n", chunk.sub_chunck[0], chunk.sub_chunck[1], chunk.sub_chunck[2], chunk.sub_chunck[3]); // "data"(固定)
400
+
401
+
402
+
403
+
404
+
405
+ ///////////////////////////////////////////////////////////////////////////////////////////////
406
+
407
+ //ファイル情報を表示
408
+
409
+ int r2 = chunk.DataSize / (chunk.sample_rate * chunk.bit_per_sample * chunk.channel);
410
+
411
+
412
+
203
- printf("end \n");
413
+ printf("r2: %d \n", r2);
414
+
204
-
415
+ ///////////////////////////////////////////////////////////////////////////////////////////////
416
+
417
+
418
+
419
+
420
+
421
+
422
+
423
+
424
+
425
+
426
+
205
-
427
+ int time = (chunk.sample_rate * chunk.bit_per_sample * chunk.channel); //再生時間
428
+
429
+
430
+
206
-
431
+ printf("### ファイル情報 ###\n\n");
432
+
433
+
434
+
435
+ printf("# 音データのサイズ: %d\n", chunk.DataSize); // 音データ
436
+
437
+ printf("# ファイルのサイズ: %d\n", chunk.all_DataSize); // ファイルデータ
438
+
439
+ printf("# 再生時間: %d\n", time); // ファイルデータ
440
+
441
+
442
+
443
+
444
+
207
- return EXIT_SUCCESS;
445
+ return 0;
208
446
 
209
447
  }
210
448