Russian Qt Forum

Qt => Мультимедиа => Тема начата: Hrundel от Март 27, 2013, 23:10



Название: [РЕШЕНО] Чтение самплов из wav файла в массив
Отправлено: Hrundel от Март 27, 2013, 23:10
Всем привет!!!

Ситуация такая:
Заголовок успешно читаю. Хочу получить массив с самплами.
Проблема: Не понимаю как преобразовать битовое представление.
Цель: Необходимость выводить в виде звуковой волны с последующими трансформациями и записью в файл. (Задание курсовой.)

Пока выглядит так:

Это структура:

Код:
typedef struct  WAV_HEADER{
        char                RIFF[4];        // RIFF Header      Magic header
        unsigned long       ChunkSize;      // RIFF Chunk Size
        char                WAVE[4];        // WAVE Header
        char                fmt[4];         // FMT header
        unsigned long       Subchunk1Size;  // Size of the fmt chunk
        unsigned short      AudioFormat;    // Audio format 1=PCM,6=mulaw,7=alaw, 257=IBM Mu-Law, 258=IBM A-Law, 259=ADPCM
        unsigned short      NumOfChan;      // Number of channels 1=Mono 2=Sterio
        unsigned long       SamplesPerSec;  // Sampling Frequency in Hz
        unsigned long       bytesPerSec;    // bytes per second
        unsigned short      blockAlign;     // 2=16-bit mono, 4=16-bit stereo
        unsigned short      bitsPerSample;  // Number of bits per sample
        char                Subchunk2ID[4]; // "data"  string
        unsigned long       Subchunk2Size;  // Sampled data length
 
    }wav_hdr;

Это читалка заголовка в конструкторе:

Код:
wav_hdr wavHeader;
 
     FILE *wavFile;
 
     int headerSize = sizeof(wav_hdr), filelength = 0;
 
     wavFile = fopen( FileName.toAscii().data() , "r" );
 
         if(wavFile == NULL){
             std::cout << "ERROR READ FILE" << std::endl;
         }
         else
         {
             std::cout << "FILE IS OPEN TO READ" << std::endl;
 
         fread(&wavHeader,headerSize,1,wavFile);
         filelength = getFileSize(wavFile);
 
         for (int i = 0; i < wavHeader.Subchunk2Size; i++)
         {
             audioData[i] = // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!
                            // А что тут теперь делать ???
                            // Как читать данные ???
                            // И в каком формате они должны быть представленны ???
                            // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!
         }
 
         fclose(wavFile);

Буду благодарен за объяснения и примеры кодов!


Название: Re: Чтение самплов из wav файла в массив
Отправлено: carrygun от Март 28, 2013, 07:48
Я на таком уровне с аудио не ковырялся, но помоему в 5й версии в QtMultimedia есть для этого инструменты. Может стоит посмотреть туда?


Название: Re: Чтение самплов из wav файла в массив
Отправлено: alex312 от Март 28, 2013, 08:21
Буду благодарен за объяснения и примеры кодов!
Когда-то делал подобное. Вот прикладываю ограниченную читалку wav. (читает первую дорожку)
C записью не сложилось.

Описание формата - http://www.sonicspot.com/guide/wavefiles.html


Название: Re: Чтение самплов из wav файла в массив
Отправлено: Hrundel от Март 28, 2013, 14:04
Всем привет, ответ нашелся здесь:

http://www.prog.org.ru/topic_23003_0.html