qt_rtmp_demo/mainwindow.cpp

317 lines
10 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDesktopWidget>
#include <QPaintDevice>
#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()<<this->pos()<<clientRect<<applicationRect<<this->m_frame->geometry()<<this->centralWidget()->geometry();
std::vector<std::wstring> 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 "<<mMic.size()<<"mic";
for(vector<CaptureAudioFfmpeg::MICInfo>::iterator itr = mMic.begin();itr != mMic.end();itr++){
qDebug()<<QString::fromStdWString(itr->name)<<itr->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()<<frameaddress<<framelen;
mMux.lock();
mBufferAudio.push_front((void *)frameaddress);
mMux.unlock();
}
void MainWindow::on_pushButton_clicked(){
if(nullptr == mPlayerWidget){
mPlayerWidget = new CPlayWidget(nullptr);
}
if(!m_bCameraOpen){
mPlayerWidget->SetDataType(CPlayWidget::IMG_TYPE::TYPE_RGB32);
qDebug()<<ui->comboBox->currentText().size()<<ui->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()<<ui->comboBox->currentText();
ui->pushButton->setText("关闭摄像头");
m_bCameraOpen = true;
mPlayerWidget->show();
ui->verticalLayout->insertWidget(2,mPlayerWidget,9);
qDebug()<<ui->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服务器"<<ui->lineEdit->text();
if (!mPusher->IfConnect()) {
const char* address = ui->lineEdit->text().toLocal8Bit().data();
qDebug()<<address;
if (0 == mPusher->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()<<ui->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<uint8_t *>(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()<<ui->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"<<rect;
if(!mCapScreen){
if(nullptr == mScreenCap){
mScreenCap = new ScreenCapture();
}
mScreenCap->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()<<ui->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"<<rect;
}
void MainWindow::on_pushButton_6_clicked()
{
QString fileName = QFileDialog::getSaveFileName(this,tr("文件打开对话框"),"D:",tr("(*mp4)"));
if(fileName != ""){
qDebug()<<fileName + ".mp4";
ui->lineEdit_2->setText(fileName + "mp4");
}
}
void MainWindow::on_pushButton_5_clicked(bool checked)
{
}