#include "mainwindow.h" #include "ui_mainwindow.h" #include #include #if _MSC_VER >= 1600 #pragma execution_character_set("utf-8") #endif MainWindow::MainWindow(QWidget *parent) : QssMainWindow(parent,0,1.5), ui(new Ui::MainWindow), m_bCameraOpen(false), mCamera(nullptr), m_bRtmpPushing(false), mPlayerWidget(nullptr), mVideoCoder(nullptr), mPusher(nullptr), mAudioCapture(nullptr), mTimer(nullptr), mChart(nullptr), mChartView(nullptr), mSeries(nullptr), mScreenCap(nullptr), mCapScreen(false), mScreenshot(nullptr) { ui->setupUi(this); this->move(50,50); int i(0); QDesktopWidget* desktopWidget = QApplication::desktop(); QRect clientRect = desktopWidget->availableGeometry(); QRect applicationRect = desktopWidget->screenGeometry(); qDebug()<pos()<m_frame->geometry()<centralWidget()->geometry(); std::vector cameras = Camera::EnumAllCamera(); for(std::wstring x : cameras){ ui->comboBox->addItem(QString::fromWCharArray(x.c_str(),x.size()), QString::fromWCharArray(x.c_str(),x.size())); } mAudioCapture = new CaptureAudioFfmpeg(44100, 2); mMic = mAudioCapture->EnumSpeakers(); qDebug()<<"capture "<::iterator itr = mMic.begin();itr != mMic.end();itr++){ qDebug()<name)<index; ui->comboBox_2->addItem(QString::fromWCharArray(itr->name.c_str(),itr->name.size()), QString::fromWCharArray(itr->name.c_str(),itr->name.size())); } mTimer = new QTimer(this); connect(mTimer, SIGNAL(timeout()), this, SLOT(DetectDpi())); mTimer->start(500); mChart = new QChart(); mSeries = new QLineSeries(this); mSeries->setUseOpenGL(true); mSeries->append(0, 0); mChart->addSeries(mSeries); mChart->createDefaultAxes(); mChart->axisX()->setMax(2000); mChart->axisY()->setMax(2000); mChart->axisY()->setMin(-2000); mChartView = new QChartView(this); ui->verticalLayout->addWidget(mChartView); mChartView->setChart(mChart); ui->verticalLayout->setStretch(0,2); ui->verticalLayout->setStretch(1,8); ui->verticalLayout->setStretch(2,4); } MainWindow::~MainWindow(){ delete ui; } void MainWindow::OnAudioData(const void *frameaddress, uint32_t framelen) { if(mBufferAudio.size() > 1) { delete frameaddress; return; } qDebug()<SetDataType(CPlayWidget::IMG_TYPE::TYPE_RGB32); qDebug()<comboBox->currentText().size()<comboBox->currentText(); wchar_t *opencamera = new wchar_t[ui->comboBox->currentText().size()]; ui->comboBox->currentText().toWCharArray(opencamera); wstring ss = wstring(opencamera,ui->comboBox->currentText().size()); if(nullptr == mCamera){ this->mCamera = new Camera(ss); } GUIDToAvFormat(mCamera->MediaType()); mPlayerWidget->SetImgSize(mCamera->GetWidth(),mCamera->GetHeight()); this->mCamera->SetObserver(mPlayerWidget); qDebug()<comboBox->currentText(); ui->pushButton->setText("关闭摄像头"); m_bCameraOpen = true; mPlayerWidget->show(); ui->verticalLayout->insertWidget(2,mPlayerWidget,9); qDebug()<verticalLayout->layout(); ui->verticalLayout->setStretch(0,1); ui->verticalLayout->setStretch(1,0); ui->verticalLayout->setStretch(2,9); ui->verticalLayout->setStretch(3,5); } else{ m_bCameraOpen = false; ui->pushButton->setText("打开摄像头"); } } void MainWindow::on_pushButton_2_clicked() { if(!m_bRtmpPushing){ if(!m_bCameraOpen){ ToastWidget::showTip("请打开摄像头",this); return; }else{ // if(nullptr == mVideoCoder){ mVideoCoder = new VideoCoder(mCamera->GetWidth(), mCamera->GetHeight(), GUIDToAvFormat(mCamera->MediaType())); } mCamera->SetObserver(mVideoCoder); if(mPusher == nullptr) mPusher = new H264RtmpPuser(); // todo 根据返回结果判断是否推流 qDebug()<<"连接RTMP服务器"<lineEdit->text(); if (!mPusher->IfConnect()) { const char* address = ui->lineEdit->text().toLocal8Bit().data(); qDebug()<RTMP264_Connect("rtmp://127.0.0.1:1935/live/1")) { ToastWidget::showTip("已经连接上RTMP服务器",this->parentWidget()); mVideoCoder->SetOberver(mPusher); mPusher->StartPush(); ui->pushButton_2->setText("关闭推流"); /* if (nullptr != this->mAudioCoder) { this->mAudioCoder->SetObserver(mPusher); //音频流先不推流 }*/ } else { ToastWidget::showTip("连接RTMP服务器失败,请检查服务器地址",this->parentWidget()); } }else{ ToastWidget::showTip("正在推流,请先关闭",this->parentWidget()); } } } } void MainWindow::on_pushButton_3_clicked() { qDebug()<comboBox_2->currentText(); mAudioCapture->InitCapture(ui->comboBox_2->currentText().toStdWString().c_str(),4800,2); mAudioCapture->StartCapture(); mAudioCapture->SetObserver(this); mSeries->removePoints(0,mSeries->points().size()); } void MainWindow::DetectDpi() { int horizontalDPI = logicalDpiX(); int verticalDPI = logicalDpiY(); mMux.lock(); if(mBufferAudio.size() > 0){ uint8_t *ptr = static_cast(mBufferAudio.takeLast()); if(mSeries->points().size() > 100){ for(int i = 0;i < 2000 ;i++){ int16_t *v = (int16_t*)(ptr + i*40); mSeries->replace(mSeries->at(i),QPointF(i,*v)); } }else{ for(int i = 0;i < 2000 ;i++){ int16_t *v = (int16_t*)(ptr + i*40); mSeries->append(QPointF(i,*v)); } } } mMux.unlock(); } void MainWindow::on_pushButton_4_clicked() { if(ui->lineEdit_2->text() == ""){ ToastWidget::showTip("请选择保存地址",this); return ; } if(!mCapScreen){ if(nullptr == mScreenCap){ mScreenCap = new ScreenCapture(); } mScreenCap->InitCap(); mScreenCap->InitEncoder(ui->lineEdit_2->text().toStdString()); mScreenCap->Start(this); if(nullptr == mPlayerWidget){ mPlayerWidget = new CPlayWidget(nullptr); } mPlayerWidget->SetDataType(CPlayWidget::IMG_TYPE::TYPE_RGB32); mPlayerWidget->SetImgSize(mScreenCap->Width(),mScreenCap->Height()); mScreenCap->SetObserver(this->mPlayerWidget); mPlayerWidget->show(); ui->verticalLayout->insertWidget(2,mPlayerWidget,9); qDebug()<verticalLayout->layout(); ui->verticalLayout->setStretch(0,1); ui->verticalLayout->setStretch(1,0); ui->verticalLayout->setStretch(2,9); ui->verticalLayout->setStretch(3,5); mCapScreen = true; } else{ mScreenCap->Stop(); } } void MainWindow::on_pushButton_5_clicked() { if(ui->lineEdit_2->text() == ""){ ToastWidget::showTip("请选择保存地址",this); return ; } if(nullptr == mScreenshot){ mScreenshot = new ScreenShotWidget(nullptr); connect(mScreenshot,&ScreenShotWidget::rect_selected, this,[&](QRect rect){ qDebug()<<"screen rect selected"<InitCap(); mScreenCap->SetStrip(new ScreenCapture::Rect{rect.width(), rect.height(), rect.x(), rect.y()}); mScreenCap->InitEncoder(ui->lineEdit_2->text().toStdString()); mScreenCap->Start(this); if(nullptr == mPlayerWidget){ mPlayerWidget = new CPlayWidget(nullptr); } mPlayerWidget->SetDataType(CPlayWidget::IMG_TYPE::TYPE_RGB32); mPlayerWidget->SetImgSize(rect.width(),rect.height()); mScreenCap->SetObserver(this->mPlayerWidget); mPlayerWidget->show(); ui->verticalLayout->insertWidget(3,mPlayerWidget,9); qDebug()<verticalLayout->layout(); // ui->verticalLayout->setStretch(0,1); // ui->verticalLayout->setStretch(1,1); // ui->verticalLayout->setStretch(2,9); // ui->verticalLayout->setStretch(3,5); mCapScreen = true; } else{ mScreenCap->Stop(); } }); } mScreenshot->showFullScreen(); } void MainWindow::on_rect_selected(QRect rect) { qDebug()<<"screen rect selected"<lineEdit_2->setText(fileName + "mp4"); } } void MainWindow::on_pushButton_5_clicked(bool checked) { }