Какой Тип Данных Использовать Для Сэмплов Файла Wav, Если В Дальнейшем

Статус
Закрыто для дальнейших ответов.

Niaden

New member
29.10.2012
1
0
#1
Добрый день. Начал изучать формат .wav. Хочу прочитать его заголовок, ну и, собсно, данные. С заголовками все ясно.
А какой тип данных мне использовать для сэмплов, чтобы был доступ к каждому сэмплу?
или доступ к каждому сэмплу не нужен? и достаточно будет двухбайтового short int?
Начал юзать прогу 010 Editor - реадер двоичных файлов. там представляется структура читаемого файла. Эта прога написана на Си и вот там для хранения сэмплов используется short.


Вот прога для считывания данных с файла .wav. Считываю данные и проверяю, правильно ли считалось методом вывода прочитанного на консоль и сверки с байтами файла аааа.wav в проге 010 Editor. В конце проги динамически выделяю массив short. Прога работает, но насчет типа данных для сэмплов я не уверен. нужен ли доступ к 1му сэмплу? или можно обойтись к доступу к паре сэмплов?

В дальнейшем планирую считанные дата закодировать хаффманом и перегнать в другой формат аудио. мб lossless.

Используемая среда - Visual Studio 2010 C++

#include <iostream>

using namespace std;

struct Wav_Header
{
char Wav_ChunkId[4];
int Wav_ChunkSize;
char Wav_Format[4];
char Wav_SubChunkId[4];
int Wav_SubChunkSize;
short int Wav_AudioFormat;
short int Wav_NumChannels;
int Wav_SampleRate;
int Wav_ByteRate;
short int Wav_BlockAlign;
short int Wav_BitPerSample;
char Wav_SubChunk2Id[4];
int Wav_SubChunk2Size;
};

int main()
{
FILE *rd_wav;
Wav_Header ob1;
cout << sizeof(short) << endl;
if ( ( rd_wav = fopen("c:\\aaaa.wav", "rb") ) == NULL)
{
fprintf( stderr, "owibka otkritiya faila dlya 4teniya" );
return 1;
}

fread(&ob1, sizeof(ob1), 1, rd_wav);
cout << ob1.Wav_ChunkSize << endl;
for (int i = 0; i<4; i++)
cout << ob1.Wav_ChunkId;
cout << '\n';
for (int i = 0; i<4; i++)
cout << ob1.Wav_Format;
cout << '\n';
for (int i = 0; i<4; i++)
cout << ob1.Wav_SubChunkId;
cout << '\n';
cout << ob1.Wav_SubChunkSize << endl;
cout << ob1.Wav_AudioFormat << endl;
cout << ob1.Wav_NumChannels << endl;
cout << ob1.Wav_SampleRate << endl;
cout << ob1.Wav_ByteRate << endl;
cout << ob1.Wav_BlockAlign << endl;
cout << ob1.Wav_BitPerSample << endl;
for (int i = 0; i<4; i++)
cout << ob1.Wav_SubChunk2Id;
cout << '\n';
cout << ob1.Wav_SubChunk2Size << endl;
short* buffer = new short [ob1.Wav_SubChunk2Size/2];
fread(buffer, 2, ob1.Wav_SubChunk2Size/2, rd_wav);
cout << "buffer1=" << buffer[0] << endl;
cout << "buffer2=" << buffer[1] << endl;
delete [] buffer;
fclose(rd_wav);
return 0;
}
 

Niaden

New member
29.10.2012
1
0
#2
тупанул)
дело в поле BitPerSample и в том, что в базовых кодерах-декодерах идет 16 бит на сэмпл) поэтому и юзают везде short.
 
Статус
Закрыто для дальнейших ответов.