Название: работа с wav файлами
Отправлено: 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(); } */ }
Название: Re: работа с wav файлами
Отправлено: korul1 от Марта 03, 2014, 20:52
цель этого ,чтобы информацию из заголовка при нажатии кнопки повставлять в LineEdit ы а после при нажатии другой кнопки достать сэмплы и делать с ними дальнейшие преобразования
Название: Re: работа с wav файлами
Отправлено: OKTA от Марта 03, 2014, 21:01
Советую начать с форматирования кода и вытащить из mainwindow определение класса :o И все же написать, что за ошибка-то возникает :-\
Название: Re: работа с wav файлами
Отправлено: korul1 от Марта 03, 2014, 21:08
ошибка C:2275 идентификатор" : использование этого типа в качестве выражения не допускается В выражении используется оператор -> с идентификатором typedef. либо C:2664, если вот так
Название: Re: работа с wav файлами
Отправлено: korul1 от Марта 03, 2014, 21:13
вытащил определение класса, но серавно не знаю как вызвать ту функцию из loadFile() попытался вот так тогда ошибка "класс::функция" : недопустимый вызов нестатической функции-члена Функция-член, объявленная с модификатором static, осуществила вызов нестатической функции-члена. Нестатическая функция-член также могла быть вызвана извне класса в качестве статической. Следующий пример приводит к возникновению ошибки C2352:
Название: Re: работа с wav файлами
Отправлено: korul1 от Марта 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);
Название: Re: работа с wav файлами
Отправлено: korul1 от Марта 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; } } }
|