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

Тема в разделе "Общие вопросы по С и С++", создана пользователем Niaden, 30 окт 2012.

Статус темы:
Закрыта.
  1. Niaden

    Niaden New Member

    Регистрация:
    29 окт 2012
    Сообщения:
    1
    Симпатии:
    0
    Добрый день. Начал изучать формат .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;
    }
     
  2. Niaden

    Niaden New Member

    Регистрация:
    29 окт 2012
    Сообщения:
    1
    Симпатии:
    0
    тупанул)
    дело в поле BitPerSample и в том, что в базовых кодерах-декодерах идет 16 бит на сэмпл) поэтому и юзают везде short.
     
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей