MainWindow.cpp 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. #include "MainWindow.h"
  2. #include "ui_MainWindow.h"
  3. #include <QDebug>
  4. #include "AppConfig.h"
  5. #include "Base/FunctionTransfer.h"
  6. MainWindow::MainWindow(QWidget *parent) :
  7. QMainWindow(parent),
  8. ui(new Ui::MainWindow)
  9. {
  10. ui->setupUi(this);
  11. FunctionTransfer::init(QThread::currentThreadId());
  12. mShowProgressLabel = new QLabel(this);
  13. mShowProgressLabel->hide();
  14. mShowProgressLabel->setStyleSheet("background-color: rgb(255, 0, 4);");
  15. ///创建图表
  16. auto createView = [=](const QString &name, bool isShowTime)
  17. {
  18. QChart *chart = new QChart();
  19. QChartView *chartView = new QChartView();
  20. chartView->setChart(chart);
  21. // chartView->show();
  22. QLineSeries *series = new QLineSeries();
  23. chart->addSeries(series);
  24. QAbstractAxis *axisX = nullptr;
  25. if (isShowTime)
  26. {
  27. QDateTimeAxis *axis = new QDateTimeAxis;
  28. axis->setRange(QDateTime::currentDateTime(), QDateTime::currentDateTime().addDays(1));
  29. axis->setTickCount(8);
  30. axis->setFormat("mm:ss");
  31. axisX = axis;
  32. }
  33. else
  34. {
  35. QValueAxis *axis = new QValueAxis;
  36. axis->setRange(0, 20000);
  37. axis->setLabelFormat("%g");
  38. // axis->setTitleText("Samples");
  39. axisX = axis;
  40. }
  41. QValueAxis *axisY = new QValueAxis;
  42. axisY->setRange(-1, 1);
  43. // axisY->setTitleText("Audio level");
  44. chart->setAxisX(axisX, series);
  45. chart->setAxisY(axisY, series);
  46. chart->legend()->hide();
  47. chart->setTitle(name);
  48. return chartView;
  49. };
  50. mChartView_Left = createView(QStringLiteral("左声道"), true);
  51. mChartView_Right = createView(QStringLiteral("右声道"), true);
  52. mCurrentChartView_Left = createView("left channel(one frame)", false);
  53. mCurrentChartView_Right = createView("right channel(2 seconds)", false);
  54. ui->horizontalLayout_left->addWidget(mChartView_Left);
  55. ui->horizontalLayout_right->addWidget(mChartView_Right);
  56. ui->horizontalLayout_current_left->addWidget(mCurrentChartView_Left);
  57. ui->horizontalLayout_current_right->addWidget(mCurrentChartView_Right);
  58. #if 1
  59. mReadAACFileThread = new ReadAACFileThread();
  60. mReadAACFileThread->setVideoPlayerCallBack(this);
  61. mReadAACFileThread->startRead((char*)"../data/test.aac");
  62. std::list<AudioDevice> deviceList = mReadAACFileThread->getAudiDeviceList();
  63. #else
  64. mReadAudioFileThread = new ReadAudioFileThread();
  65. mReadAudioFileThread->setVideoPlayerCallBack(this);
  66. mReadAudioFileThread->startRead((char*)"../data/test.mp3");
  67. std::list<AudioDevice> deviceList = mReadAudioFileThread->getAudiDeviceList();
  68. #endif
  69. for (const AudioDevice & device : deviceList)
  70. {
  71. ui->comboBox_audioDevice->addItem(QString::fromStdString(device.deviceName));
  72. }
  73. }
  74. MainWindow::~MainWindow()
  75. {
  76. delete ui;
  77. }
  78. void MainWindow::onGetPcmWaveValues(const std::list<float> &leftChannelValues, const std::list<float> &rightChannelValues)
  79. {
  80. qDebug()<<__FUNCTION__<<leftChannelValues.size();
  81. FunctionTransfer::runInMainThread([=]()
  82. {
  83. auto showDbValues = [=](QChartView *chartView, const std::list<float> &channelValues)
  84. {
  85. /// 将横坐标换算成时间
  86. /// 这里一帧音频的采样是1024,音频的采样率是一秒钟44100次。
  87. /// 当然也可以通过直接计算数据大小,原理都是类似。
  88. qint64 oneFrameTime = 1024.0 / 44100 * 1000; //一帧音频时间(秒)
  89. QList<QPointF> valueList;
  90. int i=0;
  91. for(const float value : channelValues)
  92. {
  93. valueList.append(QPointF(QDateTime(QDate::currentDate(), QTime(0,0,0).addMSecs(oneFrameTime*i)).toMSecsSinceEpoch(), value));
  94. i++;
  95. }
  96. ((QDateTimeAxis*)chartView->chart()->axisX())->setRange(QDateTime(QDate::currentDate(), QTime(0,0,0)),
  97. QDateTime(QDate::currentDate(), QTime(0,0,0).addMSecs(channelValues.size()*oneFrameTime)));
  98. ((QLineSeries*)chartView->chart()->series().first())->replace(valueList);
  99. };
  100. showDbValues(mChartView_Left, leftChannelValues);
  101. showDbValues(mChartView_Right, rightChannelValues);
  102. });
  103. }
  104. void MainWindow::onGetPcmFrame(PCMFramePtr pcmFramePtr)
  105. {
  106. }
  107. void MainWindow::onUpdatePlayingValue(const float &leftChannel,
  108. const float &rightChannel,
  109. const std::list<float> &leftChannelDbValues,
  110. const std::list<float> &rightChannelDbValues,
  111. const float &progress)
  112. {
  113. ///以下图表显示仅做demo展示,效率并未优化
  114. mLeftChannelDbValueList.append(leftChannelDbValues);
  115. mRightChannelDbValueList.append(rightChannelDbValues);
  116. if (mLeftChannelDbValueList.size() >= 2)
  117. {
  118. mLeftChannelDbValueList.removeFirst();
  119. }
  120. ///右声道展示2秒数据
  121. if (mRightChannelDbValueList.size() >= 43 * 2)
  122. {
  123. mRightChannelDbValueList.removeFirst();
  124. }
  125. auto showDbValues = [=](QChartView *chartView, const QList<std::list<float>> &channelDbValueList)
  126. {
  127. QList<QPointF> valueList;
  128. int i=0;
  129. for (const std::list<float> &channelDbValues : channelDbValueList)
  130. {
  131. for(const float &value : channelDbValues)
  132. {
  133. valueList.append(QPointF(i, value));
  134. i++;
  135. }
  136. }
  137. FunctionTransfer::runInMainThread([=]()
  138. {
  139. chartView->chart()->axisX()->setRange(0, i);
  140. ((QLineSeries*)chartView->chart()->series().first())->replace(valueList);
  141. });
  142. };
  143. showDbValues(mCurrentChartView_Left, mLeftChannelDbValueList);
  144. showDbValues(mCurrentChartView_Right, mRightChannelDbValueList);
  145. FunctionTransfer::runInMainThread([=]()
  146. {
  147. ui->progressBar_left->setValue(leftChannel*100);
  148. ui->progressBar_right->setValue(rightChannel*100);
  149. ///设置进度
  150. {
  151. QChart *chart = mChartView_Left->chart();
  152. int w = chart->plotArea().width();
  153. int x = chart->plotArea().x() + ui->widget_charViewContainer->x() + chart->plotArea().width() * progress;
  154. int y = ui->widget_charViewContainer->y();
  155. mShowProgressLabel->show();
  156. mShowProgressLabel->move(x, y);
  157. mShowProgressLabel->resize(2, ui->widget_charViewContainer->height());
  158. }
  159. });
  160. }
  161. void MainWindow::onUpdatePlayingTime(const uint32_t &totalTime, const uint32_t &currentTime)
  162. {
  163. FunctionTransfer::runInMainThread([=]()
  164. {
  165. QString str = QString("%1/%2")
  166. .arg(QTime(0,0,0).addMSecs(totalTime).toString("hh:mm:ss"))
  167. .arg(QTime(0,0,0).addMSecs(currentTime).toString("hh:mm:ss.zzz"));
  168. ui->label_time->setText(str);
  169. });
  170. }