ОБСУЖДЕНИЕ

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

1 ответов 3,6 тыс.
AI-выжимка обсуждения скоро

Краткие тезисы обсуждения со ссылками на ключевые ответы появятся здесь.

Статус
Закрыто для дальнейших ответов.
Автор темы
Добрый день. Начал изучать формат .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;
}
 
тупанул)
дело в поле BitPerSample и в том, что в базовых кодерах-декодерах идет 16 бит на сэмпл) поэтому и юзают везде short.
 
Статус
Закрыто для дальнейших ответов.