From df2d86b055469ce04ebee1f10bdd2c9a0a86f64a Mon Sep 17 00:00:00 2001
From: "DESKTOP-4RNDQIC\\29019" <290198252@qq.com>
Date: Fri, 5 Jun 2020 23:59:47 +0800
Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E6=8E=A8=E6=B5=81=E5=8A=9F?=
=?UTF-8?q?=E8=83=BD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
client/qt_gl_/yuvgl/components/toast.ui | 2 +-
client/qt_gl_/yuvgl/main.cpp | 18 -----------
client/qt_gl_/yuvgl/mainwindow.cpp | 36 +++++++++++++++++++--
client/qt_gl_/yuvgl/mainwindow.h | 6 ++--
client/qt_gl_/yuvgl/mainwindow.ui | 2 +-
client/qt_gl_/yuvgl/media/CameraCapture.cpp | 12 ++++---
client/qt_gl_/yuvgl/media/CameraCapture.h | 2 ++
client/qt_gl_/yuvgl/media/VideoCoder.cpp | 34 ++++++++++---------
client/qt_gl_/yuvgl/media/VideoCoder.h | 1 +
client/qt_gl_render/yuvgl/yuvgl.pro.user | 2 +-
10 files changed, 68 insertions(+), 47 deletions(-)
diff --git a/client/qt_gl_/yuvgl/components/toast.ui b/client/qt_gl_/yuvgl/components/toast.ui
index ba97c7d..0cbc9bc 100644
--- a/client/qt_gl_/yuvgl/components/toast.ui
+++ b/client/qt_gl_/yuvgl/components/toast.ui
@@ -6,7 +6,7 @@
0
0
- 431
+ 932
59
diff --git a/client/qt_gl_/yuvgl/main.cpp b/client/qt_gl_/yuvgl/main.cpp
index 76e3ebd..86fe2d9 100644
--- a/client/qt_gl_/yuvgl/main.cpp
+++ b/client/qt_gl_/yuvgl/main.cpp
@@ -15,23 +15,5 @@ int main(int argc, char *argv[])
MainWindow main;
main.show();
-/*
- CPlayWidget gPlayer(nullptr);
- gPlayer.SetDataType(CPlayWidget::IMG_TYPE::TYPE_RGB32);
- gPlayer.SetImgSize(640,480);
- gPlayer.show();
- Camera *gCam;
- std::vector names = Camera::EnumAllCamera();
- for(auto itr = names.begin();itr != names.end();itr++){
- if(gCam->Open(*names.begin()) ){
- Camera *gCam = new Camera(*names.begin());
- gCam->SetObserver(&gPlayer);
- qDebug("open success");
- }else{
- qDebug("open fail");
- }
- qDebug()<setupUi(this);
std::vector cameras = Camera::EnumAllCamera();
@@ -14,6 +17,7 @@ MainWindow::MainWindow(QWidget *parent) :
ui->comboBox->addItem(QString::fromWCharArray(x.c_str(),x.size()),
QString::fromWCharArray(x.c_str(),x.size()));
}
+ mPusher = new H264RtmpPuser();
}
MainWindow::~MainWindow(){
@@ -23,7 +27,6 @@ MainWindow::~MainWindow(){
void MainWindow::on_pushButton_clicked(){
if(nullptr == mPlayerWidget){
mPlayerWidget = new CPlayWidget(nullptr);
- //mVideoCoder = new VideoCoder(mCamera->GetWidth(),mCamera->GetHeight(),);
}
if(!m_bCameraOpen){
mPlayerWidget->SetDataType(CPlayWidget::IMG_TYPE::TYPE_RGB32);
@@ -36,7 +39,7 @@ void MainWindow::on_pushButton_clicked(){
if(nullptr == mCamera){
this->mCamera = new Camera(ss);
}
- this->mCamera->SetObserver(mPlayerWidget);
+ //this->mCamera->SetObserver(mPlayerWidget);
qDebug()<comboBox->currentText();
ui->pushButton->setText("关闭摄像头");
m_bCameraOpen = true;
@@ -52,6 +55,33 @@ 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);
+
+ // todo 根据返回结果判断是否推流
+ if (!mPusher->IfConnect()) {
+ if (0 == mPusher->RTMP264_Connect(ui->lineEdit->text().toStdString().c_str())) {
+ ToastWidget::showTip("已经连接上RTMP服务器",this);
+ mVideoCoder->SetOberver(mPusher);
+ mPusher->StartPush();
+ /*
+ if (nullptr != this->mAudioCoder) {
+ this->mAudioCoder->SetObserver(mPusher);
+ //音频流先不推流
+ }*/
+ }
+ else {
+ ToastWidget::showTip("连接RTMP服务器失败,请检查服务器地址",this);
+ }
+ }
}
}
}
+
diff --git a/client/qt_gl_/yuvgl/mainwindow.h b/client/qt_gl_/yuvgl/mainwindow.h
index 1099130..3bbd478 100644
--- a/client/qt_gl_/yuvgl/mainwindow.h
+++ b/client/qt_gl_/yuvgl/mainwindow.h
@@ -5,8 +5,10 @@
#include "media/CameraCapture.h"
#include "cplaywidget.h"
#include "media/VideoCoder.h"
-#include "media/RtmpPuser.h"
+#include "media/RtmpPusher.h"
#include "components/toast.h"
+#include "utils.h"
+#include "media/RtmpPusher.h"
namespace Ui {
class MainWindow;
@@ -33,7 +35,7 @@ private:
CPlayWidget *mPlayerWidget;
VideoCoder *mVideoCoder;
bool m_bRtmpPushing;
-
+ H264RtmpPuser *mPusher;
};
#endif // MAINWINDOW_H
diff --git a/client/qt_gl_/yuvgl/mainwindow.ui b/client/qt_gl_/yuvgl/mainwindow.ui
index 05a0c34..981a887 100644
--- a/client/qt_gl_/yuvgl/mainwindow.ui
+++ b/client/qt_gl_/yuvgl/mainwindow.ui
@@ -94,7 +94,7 @@
- rtmp://
+ rtmp://192.168.3.21:1935/live
diff --git a/client/qt_gl_/yuvgl/media/CameraCapture.cpp b/client/qt_gl_/yuvgl/media/CameraCapture.cpp
index 1272247..f9ec206 100644
--- a/client/qt_gl_/yuvgl/media/CameraCapture.cpp
+++ b/client/qt_gl_/yuvgl/media/CameraCapture.cpp
@@ -28,6 +28,11 @@ Camera::Camera():
}
+GUID Camera::MediaType()
+{
+ return mMediaType;
+}
+
Camera::Camera(wstring camera)
{
mInitOK = false;
@@ -409,15 +414,12 @@ HRESULT STDMETHODCALLTYPE Camera::SampleGrabberCallback::BufferCB(double Time, B
fflush(p);
#endif
- if (mNewDataCallBack)
- {
- mNewDataCallBack(Time, pBuffer, BufferLen);
- }
+
if (mObserver.size() > 0) {
mMux.lock();
for (auto itr = this->mObserver.begin(); itr != mObserver.end(); itr++) {
CameraObserver *p = (CameraObserver *)*itr;
- p->OnCameraData(pBuffer, BufferLen);
+ p->OnCameraData(pBuffer, BufferLen);
}
mMux.unlock();
}
diff --git a/client/qt_gl_/yuvgl/media/CameraCapture.h b/client/qt_gl_/yuvgl/media/CameraCapture.h
index d0d0f8b..4bab7db 100644
--- a/client/qt_gl_/yuvgl/media/CameraCapture.h
+++ b/client/qt_gl_/yuvgl/media/CameraCapture.h
@@ -83,5 +83,7 @@ public:
int GetHeight() { return mVideoHeight; }
int GetWidth() { return mVideoWidth; }
int GetBitDepth() { return mBitDepth; }
+ GUID MediaType();
+
};
diff --git a/client/qt_gl_/yuvgl/media/VideoCoder.cpp b/client/qt_gl_/yuvgl/media/VideoCoder.cpp
index 55a8411..243df21 100644
--- a/client/qt_gl_/yuvgl/media/VideoCoder.cpp
+++ b/client/qt_gl_/yuvgl/media/VideoCoder.cpp
@@ -1,5 +1,4 @@
-
-#include "VideoCoder.h"
+#include "VideoCoder.h"
#include "Debuger.h"
FILE *p = nullptr;
int VideoCoder::OnBuffer(double dblSampleTime, BYTE * pBuffer, long lBufferSize)
@@ -10,21 +9,26 @@ int VideoCoder::OnBuffer(double dblSampleTime, BYTE * pBuffer, long lBufferSize)
int VideoCoder::OnCameraData(uint8_t * dat, uint32_t size)
{
- this->Encode(dat, size, AV_PIX_FMT_YUV420P);
+ //std::cout<<"captrue data and into coder"<Encode(dat, size, AV_PIX_FMT_YUV420P);
return 0;
}
-int VideoCoder::SetDestPix(uint8_t width, uint8_t height)
-{
+int VideoCoder::SetDestPix(uint8_t width, uint8_t height) {
this->mDestHeight = height;
this->mDestWidth = width;
return 0;
}
-VideoCoder::VideoCoder(int width, int height, AVPixelFormat formt)
-:mObserver(nullptr),mFrame(nullptr), mPitureBuffer(nullptr), mFormatCtx(nullptr), mOutputFmt(nullptr),
-mVideoStream(nullptr), mCodecCtx(nullptr), mCodec(nullptr)
-{
+VideoCoder::VideoCoder(int width, int height, AVPixelFormat formt):
+ mObserver(nullptr),
+ mFrame(nullptr),
+ mPitureBuffer(nullptr),
+ mFormatCtx(nullptr),
+ mOutputFmt(nullptr),
+ mVideoStream(nullptr),
+ mCodecCtx(nullptr),
+ mCodec(nullptr) {
AVCodecID codec_id = AV_CODEC_ID_H264;
mCodec = avcodec_find_encoder(codec_id);
@@ -89,8 +93,7 @@ VideoCoder::~VideoCoder()
fclose(p);
}
-void VideoCoder::Encode(uint8_t * src, int size, enum AVPixelFormat format)
-{
+void VideoCoder::Encode(uint8_t * src, int size, enum AVPixelFormat format) {
uint8_t *pFrame[4];
int lineSize[4];
static int debugs = 1;
@@ -128,8 +131,8 @@ void VideoCoder::Encode(uint8_t * src, int size, enum AVPixelFormat format)
this->mObserver->OnGetCodeFrame(mAVPack.data, mAVPack.size);
}
//Debuger::Debug(L"Succeed to encode frame: %5d\tsize:%5d\n", 1, mAVPack.size);
- //fwrite(mAVPack.data, 1, mAVPack.size, p);
- //fflush(p);
+ fwrite(mAVPack.data, 1, mAVPack.size, p);
+ fflush(p);
// 刷新coder,防止包挤压
av_packet_unref(&mAVPack);
av_freep(&pFrame[0]);
@@ -144,8 +147,7 @@ void VideoCoder::SetOutPutPixel(unsigned int width, unsigned int height)
this->mWidth = width;
}
-int VideoCoder::flushCoder(AVFormatContext *fmt_ctx, unsigned int stream_index)
-{
+int VideoCoder::flushCoder(AVFormatContext *fmt_ctx, unsigned int stream_index) {
int ret;
int got_frame;
AVPacket enc_pkt;
@@ -260,7 +262,7 @@ int VideoCoder::forceYUV420P(uint8_t * src, int size,
}
}
// 转换数据
- ret = sws_scale(img_convert_ctx, src_data, src_linesize, 0, mHeight, dst_data, dst_linesize);
+ ret = sws_scale(img_convert_ctx, src_data, src_linesize, 0, mHeight, dst_data, dst_linesize);
if (ret < 0) {
return ret;
}
diff --git a/client/qt_gl_/yuvgl/media/VideoCoder.h b/client/qt_gl_/yuvgl/media/VideoCoder.h
index d808435..60dc09b 100644
--- a/client/qt_gl_/yuvgl/media/VideoCoder.h
+++ b/client/qt_gl_/yuvgl/media/VideoCoder.h
@@ -12,6 +12,7 @@ extern "C"
#include "libavutil/opt.h"
#include "libavutil/imgutils.h"
};
+#include
#else
//Linux...
#ifdef __cplusplus
diff --git a/client/qt_gl_render/yuvgl/yuvgl.pro.user b/client/qt_gl_render/yuvgl/yuvgl.pro.user
index 34ffa83..3d922cd 100644
--- a/client/qt_gl_render/yuvgl/yuvgl.pro.user
+++ b/client/qt_gl_render/yuvgl/yuvgl.pro.user
@@ -1,6 +1,6 @@
-
+
EnvironmentId