質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

0回答

1396閲覧

.wavファイルの音自体のサイズとファイル全体のサイズを知りたい。

退会済みユーザー

退会済みユーザー

総合スコア0

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2021/01/16 00:21

コメント部///の内部のコードですが。"音ファイル全体のサイズ"と"音の自体のサイズ"を算出したいのですがどうすればいいのでしょうか?
チャンク情報の最後の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}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/01/16 00:31

自分で参考サイト貼ってるのに、内容を読んでいないのですか?
退会済みユーザー

退会済みユーザー

2021/01/16 00:33

波形データのバイト数(総ファイルサイズ – 126) ここの部分がわからないのですが総ファイルサイズ - 126の126とはどういう意味意味なのでしょうか?
yohhoy

2021/01/29 05:51

残念ながら元記事の内容は誤っているようです(というか126はどこから湧いてきたんでしょうね) 波形データのバイト数は "data" チャンクヘッダ直後の4byte列 10 B1 02 00 であり、値として解釈すると 0x0002B110 == 176400 となります。ファイルサイズは 176444 ですから、差分は 44 とちょうどRIFFチャンク全体のサイズ(44byte)と一致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問