#include "MainWidget.h" #include #include #include #include #include #include #include #include #include #include #include "core/AudioPlot.h" #include "core/AudioAxis.h" #include #include #include "core/AudioPlotData.h" #include "core/AudioPlottable.h" #include #include QVBoxLayout* createVBoxLayout(const QVector& widgets) { auto layout = new QVBoxLayout; for (auto widget : widgets) { layout->addWidget(widget); } return layout; } QHBoxLayout* createHBoxLayout(const QVector& widgets) { auto layout = new QHBoxLayout; for (auto widget : widgets) { layout->addWidget(widget); } return layout; } MainWidget::MainWidget() { auto layout = new QVBoxLayout; setLayout(layout); QAudioEncoderSettings audioSettings; audioSettings.setCodec("audio/pcm"); // 使用PCM编码 audioSettings.setSampleRate(44100); // 设置采样率 audioSettings.setChannelCount(1); // 设置为单声道 audioSettings.setQuality(QMultimedia::HighQuality); // 设置音质 audioSettings.setEncodingMode(QMultimedia::ConstantBitRateEncoding); // 设置编码模式 audioSettings.setBitRate(16); // 设置比特率 QString container = "audio/wav"; mAudioPlot = new AudioPlot; mAudioPlot->init(); mAudioPlot->mObjectName = "AudioPlot"; mAudioPlot->bindRenderThread("AudioPlotThread"); connect(mAudioPlot, &AudioPlot::audioChanged, [this](Audio* oldAudio, Audio* newAudio) { if(newAudio) { QString filePath = newAudio->fullPath(); if (!QFileInfo::exists(filePath)) { qDebug() << "File does not exist:" << filePath; return; } mPlayer->setMedia(QUrl::fromLocalFile(filePath)); mPlayer->setVolume(50); mPlayer->play(); } if(!newAudio && oldAudio) { mPlayer->pause(); } }); mPlayer = new QMediaPlayer; { mAudioPlotTimer = new QTimer(this); mAudioPlotTimer->setTimerType(Qt::PreciseTimer); auto selectLine = new QHBoxLayout; selectLine->addWidget(new QLabel("选择线:")); mSelectLineIndex = new QComboBox; int n = mAudioPlot->mAudioPlotData->mLines.size(); for(int i = 0; i < n; ++i) { mSelectLineIndex->addItem(QString::number(i)); } selectLine->addWidget(mSelectLineIndex); layout->addLayout(selectLine); auto back = new QPushButton("回到起点"); selectLine->addWidget(back); connect(back, &QPushButton::clicked, [this]() { mAudioPlot->xAxis->setAX(mAudioPlot->mAudioPlotData->startPixel() -mAudioPlot->width()); mAudioPlot->update(); }); auto play = new QPushButton("播放"); selectLine->addWidget(play); connect(play, &QPushButton::clicked, [this]() { mAudioPlot->mAudioPlotData->curLine = mAudioPlot->mAudioPlotData->mLines[mSelectLineIndex->currentText().toInt()]; mAudioPlot->mAudioPlottable->setInit(); mAudioPlotTimer->start(30); }); QObject::connect(mAudioPlotTimer, &QTimer::timeout, [this]() { mAudioPlot->mAudioPlottable->move(mAudioPlotTimer->interval()); mAudioPlot->update(); if(mAudioPlot->mAudioPlottable->isStop()) { mAudioPlotTimer->stop(); } }); auto pause = new QPushButton("暂停"); selectLine->addWidget(pause); connect(pause, &QPushButton::clicked, [this]() { mAudioPlotTimer->stop(); }); } { auto selectTime = new QHBoxLayout; selectTime->addWidget(new QLabel("输入返回的时间:")); auto inputBackTime = new QLineEdit; selectTime->addWidget(inputBackTime); auto confirm = new QPushButton("确定"); selectTime->addWidget(confirm); layout->addLayout(selectTime); connect(confirm, &QPushButton::clicked, [this, inputBackTime]() { int milliseconds = inputBackTime->text().toInt(); int pixel = mAudioPlot->xAxis->millisecondToPixel(milliseconds, YSG::SRC::Cache); mAudioPlot->xAxis->setAX(pixel); mAudioPlot->update(); }); } layout->addWidget(mAudioPlot); connect(mPlayer, &QMediaPlayer::durationChanged, [this](qint64 duration) { if (mPlayer->error() != QMediaPlayer::NoError || duration < 1000) return; setWindowTitle(tr("Recorded %1 sec").arg(duration / 1000)); }); connect(mPlayer, QOverload::of(&QMediaPlayer::error), [this](QMediaPlayer::Error error) { qDebug() << "Error occurred:" << mPlayer->errorString(); }); }