找回密码
 立即注册
收起左侧

关于QAudioOutput的问题,为啥会崩溃?

2
回复
8416
查看
[复制链接]
累计签到:1 天
连续签到:1 天
来源: 2015-11-21 20:38:16 显示全部楼层 |阅读模式
5Qter豆
学校任务要做一个音频分析的软件,我是学语音音频的所以算法没问题,但是cpp和qt却是新手,求各位大神帮忙
问题是这样的,我想用QAudioOutput播放一个本地音乐文件。我但是我发现把播放的相关代码写到main里就没事。
但是写到其他函数里只要一调用播放的start函数程序就会崩溃。
求助!
下面是代码
main.cpp
  1. #include "MyWidget.h"
  2. #include<QApplication>
  3. int main(int argc,char**argv)
  4. {
  5.   QApplication app(argc,argv);
  6.   MyWidget w;
  7.   w.show();
  8. #if 0
  9.   QFile inputFile;
  10.   inputFile.setFileName("c:\\CBenhanced_CH01F049-white+5dB.raw");
  11.   inputFile.open(QIODevice::ReadOnly);
  12.   QAudioFormat format;
  13.   format.setSampleRate(8000);
  14.   format.setSampleSize(16);
  15.   format.setSampleType(QAudioFormat::SignedInt);
  16.   format.setCodec("audio/pcm");
  17.   format.setByteOrder(QAudioFormat::LittleEndian);
  18.   format.setChannelCount(1);
  19.   format.setSampleType(QAudioFormat::UnSignedInt);
  20.   QAudioOutput* audio = new QAudioOutput(format);
  21. #endif
  22. //    connect(audio, SIGNAL(stateChanged(QAudio::State)), this, SLOT(handleStateChanged(QAudio::State)));
  23. //  audio->start(&inputFile);
  24.   return app.exec();
  25. }
复制代码
MyWidget.cpp
  1. #include "MyWidget.h"
  2. #include<QApplication>
  3. #include<QLayout>
  4. #include<QPushButton>
  5. #include<QGroupBox>
  6. #include<QFileDialog>
  7. #include<QMainWindow>

  8. #include <QAudioOutput>
  9. #include <QAudioFormat>
  10. #include <QFile>
  11. #include<QAudio>
  12. #include<QDebug>
  13. MyWidget::MyWidget(QWidget *parent) :
  14.     QWidget(parent)
  15. {
  16.     //UI布局设计
  17.     QGridLayout* layoutmain=new QGridLayout(this);
  18.     QVBoxLayout* layoutleft,*layoutright;
  19.     QPushButton *button1,*button2;
  20.     QGroupBox *groupboxleft,*groupboxright;
  21.     layoutmain->addWidget(groupboxleft=new QGroupBox("语谱图"),0,0,1,2);
  22.     layoutmain->addWidget(groupboxright=new QGroupBox("选项"),0,2,1,1);
  23.     groupboxleft->setLayout(layoutleft=new QVBoxLayout);
  24.     groupboxright->setLayout(layoutright=new QVBoxLayout);
  25.     layoutleft->addWidget(button1=new QPushButton("button1"));
  26.     layoutright->addWidget(button2=new QPushButton("button2"));

  27.     //slots函数
  28.     connect(button1,SIGNAL(clicked()),this,SLOT(AddFiles()));
  29.     connect(button2,SIGNAL(clicked()),this,SLOT(Playfiles()));

  30. }
复制代码
AddFiles.cpp
  1. #include"MyWidget.h"
  2. #include<QApplication>
  3. #include<QWidget>
  4. #include<QString>
  5. #include<QFileDialog>
  6. #include<QDebug>
  7. #include <QAudioOutput>
  8. #include <QAudioFormat>
  9. #include <QFile>
  10. #include<QAudio>
  11. #include<QCoreApplication>
  12. #include<QApplication>
  13. void MyWidget::AddFiles()
  14. {
  15.     //可以同时打开多个音频文件
  16.     QString filename = QFileDialog::getOpenFileName(this, tr("打开音乐文件"));
  17.   //  QFile file(filename);
  18.     QFile file("c:\\CBenhanced_CH01F049-white+5dB.raw");
  19.     if(!file.open(QFile::ReadOnly))
  20.     {
  21.         qDebug() << "open file error";
  22.         exit(0);
  23.     }

  24. }
  25. void MyWidget::Playfiles()
  26. {
  27.     /*
  28.      *  qDebug() <<   format.sampleRate();
  29.       qDebug() <<  format.sampleSize();
  30.      qDebug() <<   format.sampleType();
  31.       qDebug() <<  format.codec();
  32.       qDebug() <<  format.byteOrder();
  33.      qDebug() <<   format.channelCount();

  34. 8000
  35. 8
  36. SignedInt
  37. "audio/pcm"
  38. LittleEndian
  39. 1
  40. */
  41.     QFile inputFile;
  42.     inputFile.setFileName("c:\\CBenhanced_CH01F049-white+5dB.raw");
  43.     inputFile.open(QIODevice::ReadOnly);
  44.     QAudioFormat format;
  45.     format.setSampleRate(8000);
  46.     format.setSampleSize(16);
  47.     format.setSampleType(QAudioFormat::SignedInt);
  48.     format.setCodec("audio/pcm");
  49.     format.setByteOrder(QAudioFormat::LittleEndian);
  50.     format.setChannelCount(1);
  51.     format.setSampleType(QAudioFormat::UnSignedInt);
  52.     QAudioOutput* audio = new QAudioOutput(format, this);
  53. //    connect(audio, SIGNAL(stateChanged(QAudio::State)), this, SLOT(handleStateChanged(QAudio::State)));
  54.     audio->start(&inputFile);
  55. }
复制代码
MyWidget.h
  1. #ifndef MYWIDGET_H
  2. #define MYWIDGET_H

  3. #include <QWidget>
  4. #include<QAudioInput>
  5. #include<QAudioOutput>
  6. #include<QFile>

  7. class MyWidget : public QWidget
  8. {
  9.     Q_OBJECT
  10. public:
  11.     explicit MyWidget(QWidget *parent = 0);
  12. signals:

  13. private slots:
  14.     void AddFiles();
  15.     void Playfiles();
  16. private:
  17.     QFile file;
  18. };

  19. #endif // MYWIDGET_H
复制代码
附件: 您需要 登录 才可以下载或查看,没有帐号?立即注册

最佳答案

查看完整内容

这样直接贴代码,很少有人可以一眼看出来哪里的问题。建议先把程序简化,从最简单的功能开始测试,然后再一点一点添加功能,看是哪里出错了。现在看来应该是程序有问题。
回复

使用道具 举报

累计签到:1568 天
连续签到:1 天
2015-11-21 20:38:17 显示全部楼层
这样直接贴代码,很少有人可以一眼看出来哪里的问题。建议先把程序简化,从最简单的功能开始测试,然后再一点一点添加功能,看是哪里出错了。现在看来应该是程序有问题。
回复

使用道具 举报

累计签到:1 天
连续签到:1 天
2015-11-23 17:43:07 显示全部楼层
yafeilinux 发表于 2015-11-22 20:33
这样直接贴代码,很少有人可以一眼看出来哪里的问题。建议先把程序简化,从最简单的功能开始测试,然后再一 ...

谢谢你,我下次会改进的。另外我的问题已经解决了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了