Russian Qt Forum
Ноябрь 22, 2024, 17:31 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: работа с wav файлами  (Прочитано 4340 раз)
korul1
Гость
« : Март 03, 2014, 20:50 »

Здравствуйте, у меня такая задача :  Есть структура WAV файла и я хочу по нажатию кнопки в кьют из созданного заголовка достать необходимые данные (частота дискр , кол байтов ) и вывести их на lineEdit формы , далее доставать по N отсчетов (для начала пусть будет const 1024 ) и делать с ними дальнейшие преобразования по нажатию уже другой кнопки
вот структура

В конец mainwindow.cpp добавляю
Код:
struct chunk
 {
     char        id[4];
     quint32     size;
 };
 
struct RIFFHeader
 {
     chunk       descriptor;     // "RIFF"
     char        type[4];        // "WAVE"
 };
 
 struct WAVEHeader
 {
     chunk       descriptor;
     quint16     audioFormat;
     quint16     numChannels;
     quint32     sampleRate;
     quint32     byteRate;
     quint16     blockAlign;
     quint16     bitsPerSample;
 };
 
 struct DATAHeader
 {
     chunk       descriptor;
 };
 
 struct CombinedHeader
 {
     RIFFHeader  riff;
     WAVEHeader  wave;
 };
 
 /*WavFile::WavFile(QObject *parent)
     : QFile(parent)
     , m_headerLength(0)
 {
 
 }
*/
 bool WavFile::open(const QString &fileName)           
 
// по идее эту функцию должен вызвать в кнопке
 
 
 {
     close();
     setFileName(fileName);
     return QFile::open(QIODevice::ReadOnly) && readHeader();
 }
 
 const QAudioFormat &WavFile::fileFormat() const
 {
     return m_fileFormat;
 }
 
 qint64 WavFile::headerLength() const
 {
 return m_headerLength;
 }
 
 bool WavFile::readHeader()
 {
     seek(0);
     CombinedHeader header;
     bool result = read(reinterpret_cast<char *>(&header), sizeof(CombinedHeader)) == sizeof(CombinedHeader);
     if (result) {
         if ((memcmp(&header.riff.descriptor.id, "RIFF", 4) == 0
             || memcmp(&header.riff.descriptor.id, "RIFX", 4) == 0)
             && memcmp(&header.riff.type, "WAVE", 4) == 0
             && memcmp(&header.wave.descriptor.id, "fmt ", 4) == 0
             && (header.wave.audioFormat == 1 || header.wave.audioFormat == 0)) {
 
             // Read off remaining header information
             DATAHeader dataHeader;
 
             if (qFromLittleEndian<quint32>(header.wave.descriptor.size) > sizeof(WAVEHeader)) {
                 // Extended data available
                 quint16 extraFormatBytes;
                 if (peek((char*)&extraFormatBytes, sizeof(quint16)) != sizeof(quint16))
                     return false;
                 const qint64 throwAwayBytes = sizeof(quint16) + qFromLittleEndian<quint16>(extraFormatBytes);
                 if (read(throwAwayBytes).size() != throwAwayBytes)
                     return false;
             }
 
             if (read((char*)&dataHeader, sizeof(DATAHeader)) != sizeof(DATAHeader))
                 return false;
 
         /*   // Establish format
             if (memcmp(&header.riff.descriptor.id, "RIFF", 4) == 0)
                 m_fileFormat.setByteOrder(QAudioFormat::LittleEndian);
             else
                 m_fileFormat.setByteOrder(QAudioFormat::BigEndian);
 
             //int bps = qFromLittleEndian<quint16>(header.wave.bitsPerSample);
          /*   m_fileFormat.setChannels(qFromLittleEndian<quint16>(header.wave.numChannels));
             m_fileFormat.setCodec("audio/pcm");
             m_fileFormat.setFrequency(qFromLittleEndian<quint32>(header.wave.sampleRate));
             m_fileFormat.setSampleSize(qFromLittleEndian<quint16>(header.wave.bitsPerSample));
             m_fileFormat.setSampleType(bps == 8 ? QAudioFormat::UnSignedInt : QAudioFormat::SignedInt);
         } else {
             result = false;
         }*/
     }
     m_headerLength = pos();
     return result;
 }
 }

Далее есть filewave.h ,который подключен к mainwindow.cpp
Код:
#ifndef WAVFILE_H
 #define WAVFILE_H

 #include <QtCore/qobject.h>
 #include <QtCore/qfile.h>
 #include <QtMultimedia/qaudioformat.h>

 class WavFile : public QFile
 {
 public:
     WavFile(QObject *parent = 0);

     bool open(const QString &fileName);
     const QAudioFormat &fileFormat() const;
     qint64 headerLength() const;

 private:
     bool readHeader();

 private:
     QAudioFormat m_fileFormat;
     qint64 m_headerLength;

 };

 #endif



И сам вопрос!

У меня кнопка вызывает функцию loadfile() : Задача состоит в том , чтобы из кнопки вызвать   
 bool WavFile::open(const QString &fileName)   
я пытаюсь вот так,но выдает ошибку
Код:
void MainWindow::LoadFile()
 {
 
     QString str = QFileDialog::getOpenFileName(0,"Load","","*.wav*");
 
     if (!str.isEmpty())
     {
         ui->lineEdit->setText(str);
 
       WavFile::open( QString &str);     // ЗДЕСЬ ошибка, как вызвать эту функцию именно в LoadFile()   ?
 
     }
 
   /*  QFile audio_file(str);
         if(audio_file.open(QIODevice::ReadOnly))
         {
             audio_file.seek(44); // skip wav header
             QByteArray audio_data = audio_file.readAll();
             audio_file.close();
 
             QBuffer* audio_buffer = new QBuffer(&audio_data);
             audio_buffer->size();
         }
 */
 }
Записан
korul1
Гость
« Ответ #1 : Март 03, 2014, 20:52 »

цель этого ,чтобы информацию из заголовка при нажатии кнопки повставлять в LineEdit ы
 а после при нажатии другой кнопки достать сэмплы и делать с ними дальнейшие преобразования
Записан
OKTA
Гость
« Ответ #2 : Март 03, 2014, 21:01 »

Советую начать с форматирования кода и вытащить из mainwindow определение класса  Шокированный
И все же написать, что за ошибка-то возникает  В замешательстве
Записан
korul1
Гость
« Ответ #3 : Март 03, 2014, 21:08 »

ошибка C:2275
идентификатор" : использование этого типа в качестве выражения не допускается
В выражении используется оператор -> с идентификатором typedef.
либо C:2664, если вот так
Код:
WavFile::open(  &str);
« Последнее редактирование: Март 03, 2014, 21:19 от korul1 » Записан
korul1
Гость
« Ответ #4 : Март 03, 2014, 21:13 »

вытащил определение класса, но серавно не знаю как вызвать ту функцию из loadFile()


попытался вот так
Код:
 WavFile::open(  str);

тогда ошибка
"класс::функция" : недопустимый вызов нестатической функции-члена
Функция-член, объявленная с модификатором static, осуществила вызов нестатической функции-члена. Нестатическая функция-член также могла быть вызвана извне класса в качестве статической.
Следующий пример приводит к возникновению ошибки C2352:
« Последнее редактирование: Март 03, 2014, 21:18 от korul1 » Записан
korul1
Гость
« Ответ #5 : Март 03, 2014, 22:07 »

незнаю правильно или нет,скорее всего нет,но пробовал вот так,серавно ошибка
Код:
void MainWindow::LoadFile()
 {
 
     QString str = QFileDialog::getOpenFileName(0,"Load","","*.wav*");
 
     if (!str.isEmpty())
     {
         ui->lineEdit->setText(str);
         QFile sourceFile;
         sourceFile.setFileName(str);
         sourceFile.open(QIODevice::ReadOnly);
 
         QAudioFormat format;
         ui->lineEdit_2->setText(format.wave.sampleRate);
Записан
korul1
Гость
« Ответ #6 : Март 06, 2014, 18:33 »

ВСЕМ СПАСИБО
РАЗОБРАЛСЯ! Можно закрывать тему!

сделал чуть подругому
сверху в мэйнвиндов добавил структуры
и по нажатию кнопки
Код:
bool MainWindow::openFile(const QString &str)
{

    QFile file(str);
    file.open(QIODevice::ReadOnly);
    file.seek(0);

        CombinedHeader header;

    bool result = file.read(reinterpret_cast<char *>(&header), sizeof(CombinedHeader)) == sizeof(CombinedHeader);

    if (result) {
        if ((memcmp(&header.riff.descriptor.id, "RIFF", 4) == 0
            || memcmp(&header.riff.descriptor.id, "RIFX", 4) == 0)
            && memcmp(&header.riff.type, "WAVE", 4) == 0
            && memcmp(&header.wave.descriptor.id, "fmt ", 4) == 0
            && (header.wave.audioFormat == 1 || header.wave.audioFormat == 0)) {

          /*  // Read off remaining header information
            DATAHeader dataHeader;

            if (qFromLittleEndian<quint32>(header.wave.descriptor.size) > sizeof(WAVEHeader)) {
                // Extended data available
                quint16 extraFormatBytes;
                if (file.peek((char*)&extraFormatBytes, sizeof(quint16)) != sizeof(quint16))
                    return false;
                const qint64 throwAwayBytes = sizeof(quint16) + qFromLittleEndian<quint16>(extraFormatBytes);
                if (file.read(throwAwayBytes).size() != throwAwayBytes)
                    return false;
            }

            file.read((char*)&dataHeader, sizeof(DATAHeader)); */
           // ui->lcdNumber->display(header.wave.sampleRate);
        return result;
    }
    }
}
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.068 секунд. Запросов: 21.