コメント部///の内部のコードですが。"音ファイル全体のサイズ"と"音の自体のサイズ"を算出したいのですがどうすればいいのでしょうか?
チャンク情報の最後の40バイト目の値は波形サイズとということですがこれは?音自体のサイズなのでしょうか?となると音自体のサイズ+40 バイト(チャンクサイズ)なのでしょうか?
参考サイト: https://www.youfit.co.jp/archives/1418
cpp
1#include "stdio.h" 2#include "OpenAL/include/al.h" 3#include "OpenAL/include/alc.h" 4 5#define HEADER_SIZE ((int)44) 6 7int convInt(unsigned char* header, int start) 8{ 9 int ret = (header[start + 3] << 24) | (header[start + 2] << 16) | (header[start + 1] << 8) | (header[start + 0]); 10 11 return ret; 12} 13 14short convShort(unsigned char* header, int start) 15{ 16 int ret = (header[start + 1] << 8) | (header[start + 0]); 17 return ret; 18} 19 20char convChar(unsigned char* header, int start) 21{ 22 char ret = header[start]; 23 return ret; 24} 25 26 27int main() 28{ 29// const char* file = "sample2.wav"; //ファイル名指定 30 const char* file = "sample.wav"; //ファイル名指定 31 FILE* fp = NULL; 32 33 ALuint source; 34 ALuint buffer; 35 36 // デバイスを開く 37 ALCdevice* device = alcOpenDevice(NULL); 38 if (!device) 39 { 40 printf("デバイスを作成出来ません。\n"); 41 } 42 43 ALCcontext* context = alcCreateContext(device,NULL); 44 if (!context) 45 { 46 printf("コンテキストを作成出来ません。\n"); 47 } 48 49 alcMakeContextCurrent(context); // コンテキストを適用 50 51 alGenSources(1, &source); // 52 alGenBuffers(1, &buffer); // 53 54 //ファイルを開く 55 fopen_s(&fp, file, "rb"); 56 if (!fp) { 57 printf("ファイルが開けません。\n"); 58 59 } 60 61 // ########## チャンクデータ 62 char riff[5]; // "RIFF"(固定) 63 int chunk_size; //チャンクのサイズ 64 int format; //フォーマット 65 char fmt[5]; // "fmt"(固定) 66 int fmt_chunk_byte; //fmtチャンクのバイト数 67 short sound_format; //音フォーマット 68 short channel; //チャンネル数 69 int sample_rate; //サンプリング周波数 70 int byte_per_sec; //1秒あたりのバイトの平均 71 short block_size; //ブロックサイズ 72 short bit_per_sample; //1サンプルに必要なビット数 73 short extension_size; //拡張パラメーター サイズ 74 unsigned char* extension_data = nullptr; //拡張パラメーター 75 char sub_chunck[5]; // "data"(固定) 76 long long int Data_Size; //波形データのバイト数 77 78 unsigned char* Data;//音データーのサイズ 79 unsigned char header[HEADER_SIZE] = { 0 }; //ヘッダーサイズ 80 81 82 fread(header, 1, HEADER_SIZE, fp); //チャンクデータを読み込む 83 84 85 //riff識別子4バイト 86 riff[0] = convChar(header, 0); 87 riff[1] = convChar(header, 1); 88 riff[2] = convChar(header, 2); 89 riff[3] = convChar(header, 3); 90 riff[4] = '\0'; 91 92 chunk_size = convInt(header, 4); //チャンクサイズ 93 94 format = convInt(header, 8); //フォーマット 95 96 //fmt識別子 97 fmt[0] = convChar(header, 12); 98 fmt[1] = convChar(header, 13); 99 fmt[2] = convChar(header, 14); 100 fmt[3] = convChar(header, 15); 101 fmt[4] = '\0'; 102 103 fmt_chunk_byte = convInt(header, 16); //fmt識別子のチャンクバイト数 104 105 sound_format = convShort(header,20); //音フォーマット 106 channel = convShort(header, 22); //チャンネル数 107 108 sample_rate = convInt(header, 24); //サンプリング周波数 109 byte_per_sec = convInt(header, 28); //1秒あたりのバイトの平均 110 111 112 block_size = convShort(header, 32); //ブロックサイズ 113 bit_per_sample = convShort(header,34); //1サンプルに必要なビット数 114 115 116 if (sound_format != 1) { 117// printf("# 音声フォーマット 2 \n"); 118 119 extension_size = convShort(header, 36); //拡張パラメーター サイズ 120 extension_data = new unsigned char[extension_size] { '\0' }; //拡張パラメーター 121 int a = 36 + 2; 122 for (int i = 0; i < extension_size; i++) 123 { 124 extension_data[i] = convChar(header, a + i); 125 } 126 127 128 129 // "data"(固定) 130 sub_chunck[0] = convChar(header, a + extension_size + 1); 131 sub_chunck[1] = convChar(header, a + extension_size + 2); 132 sub_chunck[2] = convChar(header, a + extension_size + 3); 133 sub_chunck[3] = convChar(header, a + extension_size + 4); 134 sub_chunck[4] = '\0'; 135 136 Data_Size = convInt(header, a + extension_size + 4 ); //波形データのバイト数 (音データのサイズ) 137 138 } 139 else { 140 // 音声フォーマット1 141// printf("# 音声フォーマット 1 \n"); 142 143 144 // "data"(固定) 145 sub_chunck[0] = convChar(header, 36); 146 sub_chunck[1] = convChar(header, 37); 147 sub_chunck[2] = convChar(header, 38); 148 sub_chunck[3] = convChar(header, 39); 149 sub_chunck[4] = '\0'; 150 151 Data_Size = convInt(header, 40); //波形データのバイト数(音データのサイズ) 152 153 } 154 155 156 printf("### チャンク情報 ###\n\n"); 157 printf("# チャンク識別子: %s\n", riff); 158 printf("# チャンクサイズ: %d\n", chunk_size); 159 printf("# フォーマット: %d\n", format); 160 printf("# fmt識別子: %s\n", fmt); 161 printf("# fmtチャンクのバイト数: %d\n", fmt_chunk_byte); 162 printf("# 音フォーマット: %d\n", sound_format); 163 printf("# チャンネル数: %d\n", channel); 164 printf("# サンプリング周波数: %d\n", sample_rate); 165 printf("# 1秒あたりバイト数の平均: %d\n", byte_per_sec); 166 printf("# ブロックサイズ: %d\n", block_size); 167 printf("# 1サンプルに必要なビット数: %d\n\n\n", bit_per_sample); 168 169 if (sound_format == 1) 170 { 171 printf("# 拡張パラメーター サイズ: 未使用 \n"); 172 printf("# 拡張パラメーター: 未使用 \n"); 173 }else 174 { 175 printf("# 拡張パラメーター サイズ: %d\n", extension_size); 176 printf("# 拡張パラメーター: 存在する。\n"); 177 } 178 179///////////////////////////////////////////////////////////////////////////////////////////////////////////////// 180// int time_playback = (int)((float)Data_Size / (float)(4 * sample_rate)); // 時間を取得 181 182 printf("# サブチャンク識別子: %s\n", sub_chunck); // "data"(固定) 183 printf("# 音データのサイズ: %llld\n", Data_Size + 40); // 音データ 184 185 //ファイル情報を表示 186 printf("### ファイル情報 ###\n\n"); 187///////////////////////////////////////////////////////////////////////////////////////////////////////////////// 188 189 return 0; 190}
自分で参考サイト貼ってるのに、内容を読んでいないのですか?
波形データのバイト数(総ファイルサイズ – 126)
ここの部分がわからないのですが総ファイルサイズ - 126の126とはどういう意味意味なのでしょうか?
残念ながら元記事の内容は誤っているようです(というか126はどこから湧いてきたんでしょうね)
波形データのバイト数は "data" チャンクヘッダ直後の4byte列 10 B1 02 00 であり、値として解釈すると 0x0002B110 == 176400 となります。ファイルサイズは 176444 ですから、差分は 44 とちょうどRIFFチャンク全体のサイズ(44byte)と一致します。
あなたの回答
tips
プレビュー