Client/董澎韬/code/facexmainwindow.cpp | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
Client/董澎韬/code/facexmainwindow.h | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
Client/董澎韬/code/form.h | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
Client/董澎韬/code/main.cpp | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
Client/董澎韬/code/qffmpeg.cpp | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
Client/董澎韬/code/qffmpeg.h | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
Client/董澎韬/code/存放代码.txt | 补丁 | 查看 | 原始文档 | blame | 历史 | |
Client/董澎韬/log/日志_董澎韬_0220.doc | 补丁 | 查看 | 原始文档 | blame | 历史 |
Client/¶Åìèº/code/facexmainwindow.cpp
@@ -8,6 +8,7 @@ #include <QScreen> #include <QException> #include <QThread> #include <QWheelEvent> FaceXMainWindow::FaceXMainWindow(QWidget *parent) : QMainWindow(parent), @@ -35,7 +36,7 @@ m_videowidget->resize(ui->label_video->size()); m_videowidget->move(ui->label_video->pos()); m_videowidget->show(); ui->label_video->show(); ui->label_video->hide(); // è¿æ¥ QFFmpeg çä¿¡å· connect(m_ffmpeg, &QFFmpeg::GetImage, this, &FaceXMainWindow::SetImage, Qt::QueuedConnection); @@ -45,6 +46,9 @@ QMessageBox::critical(this, "ææ¾é误", m_player->errorString()); }); // è¿æ¥ææ¾å¨çä½ç½®æ´æ°ä¿¡å· connect(m_player, &QMediaPlayer::positionChanged, this, &FaceXMainWindow::updateSliderPosition); connect(ui->horizontalSlider, &QSlider::sliderMoved, this, &FaceXMainWindow::on_sliderPosition_valueChanged); } @@ -161,6 +165,18 @@ } } void FaceXMainWindow::playOrPause() { isPlaying = !isPlaying; if (isPlaying) { m_player->play(); ui->btn_play->setStyleSheet("border-image: url(:/image/pause.png)"); } else { m_player->pause(); ui->btn_play->setStyleSheet("border-image: url(:/image/start.png)"); } } //ææ¾æé® void FaceXMainWindow::on_btn_play_clicked() { @@ -171,6 +187,7 @@ m_rtspThread->start(); } } playOrPause(); } else { QMessageBox::critical(this, "é误", "ææ¾å¨æªåå§å"); } @@ -189,16 +206,36 @@ void FaceXMainWindow::SetImage(const QImage &image) { qDebug() << "å¾å尺寸: " << image.width() << "x" << image.height(); qDebug() << "å¾åæ ¼å¼: " << image.format(); qDebug() << "æ¥æ¶å°å¾åä¿¡å·"; if (!image.isNull()) { ui->label_video->setScaledContents(true); // 设置å¾åèªå¨ç¼©æ¾ ui->label_video->setPixmap(QPixmap::fromImage(image)); ui->label_video->adjustSize(); ui->label_video->update(); qDebug() << "å¾åå·²æ´æ°"; } else { qDebug() << "æ¥æ¶å°çå¾å为空"; } } //æ´æ°æ»åçä½ç½® void FaceXMainWindow::updateSliderPosition() { ui->horizontalSlider->setValue(m_player->position()); } //æå¨æ»åæ¥æ§å¶ææ¾è¿åº¦ void FaceXMainWindow::on_sliderPosition_valueChanged(int value) { m_player->setPosition(value); } void FaceXMainWindow::on_btn_back_clicked() { int currentPosition = m_player->position(); m_player->setPosition(currentPosition - 10000); // åé 10 ç§ } void FaceXMainWindow::on_btn_forward_clicked() { int currentPosition = m_player->position(); m_player->setPosition(currentPosition + 10000); // åè¿ 10 ç§ } Client/¶Åìèº/code/facexmainwindow.h
@@ -45,22 +45,19 @@ void mouseReleaseEvent(QMouseEvent *event)override; void mouseDoubleClickEvent(QMouseEvent *event)override; private slots: void on_btnSelect_clicked(); void on_toolButton_clicked(); void on_toolButton_3_clicked(); void on_toolButton_2_clicked(); void on_btn_play_clicked(); void on_btn_cut_clicked(); void SetImage(const QImage &image); void updateSliderPosition(); void on_sliderPosition_valueChanged(int value); void on_btn_back_clicked(); void on_btn_forward_clicked(); private: Ui::FaceXMainWindow *ui; @@ -76,7 +73,10 @@ QFFmpeg *m_ffmpeg; RtspThread *m_rtspThread; bool isPlaying = false; void setPlayButtonIcon(bool isPlaying); void playOrPause(); }; #endif // FACEXMAINWINDOW_H Client/¶Åìèº/code/form.h
New file @@ -0,0 +1,22 @@ #ifndef FORM_H #define FORM_H #include <QWidget> namespace Ui { class Form; } class Form : public QWidget { Q_OBJECT public: explicit Form(QWidget *parent = 0); ~Form(); private: Ui::Form *ui; }; #endif // FORM_H Client/¶Åìèº/code/main.cpp
@@ -7,5 +7,11 @@ FaceXMainWindow w; w.show(); // SDLéªè¯ // SDL_version version; // SDL_VERSION(&version); // qDebug()<<"version major is"<<version.major; // qDebug()<<"version minor is"<<version.minor; return a.exec(); } Client/¶Åìèº/code/qffmpeg.cpp
@@ -24,7 +24,6 @@ if (pSwsContext) { sws_freeContext(pSwsContext); } avpicture_free(&pAVPicture); } bool QFFmpeg::Init() @@ -46,9 +45,6 @@ //è·åè§é¢æµç´¢å¼ videoStreamIndex = -1; // qDebug()<<"nb:"<<pAVFormatContext->nb_streams; // qDebug()<<"type:"<<pAVFormatContext->streams[0]->codec->codec_type; // qDebug()<<"AVMEDIA_TYPE_VIDEO:"<<AVMEDIA_TYPE_VIDEO; for (uint i = 0; i < pAVFormatContext->nb_streams; i++) { if (pAVFormatContext->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO) { videoStreamIndex = i; @@ -67,8 +63,6 @@ videoWidth=pAVCodecContext->width; videoHeight=pAVCodecContext->height; avpicture_alloc(&pAVPicture,AV_PIX_FMT_RGB24,videoWidth,videoHeight); AVCodec *pAVCodec; //è·åè§é¢æµè§£ç å¨ @@ -79,7 +73,6 @@ result=avcodec_open2(pAVCodecContext,pAVCodec,NULL); if (result<0){ qDebug()<<"æå¼è§£ç å¨å¤±è´¥"; avpicture_free(&pAVPicture); sws_freeContext(pSwsContext); avformat_close_input(&pAVFormatContext); return false; @@ -91,23 +84,82 @@ void QFFmpeg::Play() { //ä¸å¸§ä¸å¸§è¯»åè§é¢ int frameFinished = 0; while (av_read_frame(pAVFormatContext, &pAVPacket) >= 0) { if (pAVPacket.stream_index == videoStreamIndex) { qDebug() << "å¼å§è§£ç " << QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss"); avcodec_decode_video2(pAVCodecContext, pAVFrame, &frameFinished, &pAVPacket); if (frameFinished) { mutex.lock(); sws_scale(pSwsContext, (const uint8_t* const *)pAVFrame->data, pAVFrame->linesize, 0, videoHeight, pAVPicture.data, pAVPicture.linesize); QImage image(pAVPicture.data[0], videoWidth, videoHeight, QImage::Format_RGB888); QImage copyImage = image.copy(); // æ·±æ·è´ emit GetImage(copyImage, this->index); qDebug() << "è§£ç æåï¼åéå¾åä¿¡å·"; mutex.unlock(); AVPacket packet; int frameFinished; int videoStreamIndex = -1; // æå¼è§é¢æä»¶ if (avformat_open_input(&pAVFormatContext, url.toStdString().c_str(), NULL, NULL) != 0) return; // è·åæµä¿¡æ¯ avformat_find_stream_info(pAVFormatContext, NULL); // æ¾å°è§é¢æµç´¢å¼ for (uint i = 0; i < pAVFormatContext->nb_streams; i++) { if (pAVFormatContext->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO) { videoStreamIndex = i; break; } } // è·åè§£ç å¨ AVCodec *codec = avcodec_find_decoder(pAVFormatContext->streams[videoStreamIndex]->codec->codec_id); if (!codec) { qDebug() << "æªæ¾å°è§£ç å¨"; return; } if (avcodec_open2(pAVCodecContext, codec, NULL) < 0) { qDebug() << "æå¼è§£ç å¨å¤±è´¥"; return; } // åå§å帧 pAVFrame = av_frame_alloc(); AVFrame *pFrameRGB = av_frame_alloc(); uint8_t *buffer = (uint8_t *)av_malloc(avpicture_get_size(AV_PIX_FMT_RGB24, pAVCodecContext->width, pAVCodecContext->height)); avpicture_fill((AVPicture *)pFrameRGB, buffer, AV_PIX_FMT_RGB24, pAVCodecContext->width, pAVCodecContext->height); // åå§å缩æ¾ä¸ä¸æ struct SwsContext *sws_ctx = sws_getContext(pAVCodecContext->width, pAVCodecContext->height, pAVCodecContext->pix_fmt, pAVCodecContext->width, pAVCodecContext->height, AV_PIX_FMT_RGB24, SWS_BILINEAR, NULL, NULL, NULL); while (av_read_frame(pAVFormatContext, &packet) >= 0) { if (packet.stream_index == videoStreamIndex) { avcodec_send_packet(pAVCodecContext, &packet); while (avcodec_receive_frame(pAVCodecContext, pAVFrame) == 0) { sws_scale(sws_ctx, (const uint8_t **)pAVFrame->data, pAVFrame->linesize, 0, pAVCodecContext->height, pFrameRGB->data, pFrameRGB->linesize); QImage img(pFrameRGB->data[0], pAVCodecContext->width, pAVCodecContext->height, QImage::Format_RGB888); emit GetImage(img, 0); } } av_packet_unref(&pAVPacket); av_packet_unref(&packet); } avformat_close_input(&pAVFormatContext); av_frame_free(&pAVFrame); av_frame_free(&pFrameRGB); av_free(buffer); sws_freeContext(sws_ctx); } Client/¶Åìèº/code/qffmpeg.h
@@ -10,12 +10,19 @@ //å¼å ¥ffmpeg头æä»¶ extern "C" { #include <libavcodec/avcodec.h> #include <libavformat/avformat.h> #include <libavcodec/avcodec.h> //å®ç°é³è§é¢çç¼è§£ç åè½ #include <libavformat/avformat.h> //å®ç°é³è§é¢æä»¶ç读åååå ¥åè½ï¼æ¯æå¤ç§é³è§é¢æ ¼å¼ #include <libavfilter/avfilter.h> #include <libswscale/swscale.h> #include <libavutil/frame.h> #include <libavutil/imgutils.h> } // å¼å ¥SDL2头æä»¶ //extern "C" //{ // #include "SDL.h" //} #include <QObject> #include <QMutex> @@ -53,10 +60,13 @@ int videoStreamIndex; int index; // SDLç¸å ³ // SDL_Window *sdlWindow; // SDL_Renderer *sdlRenderer; // SDL_Texture *sdlTexture; signals: void GetImage(const QImage &image,int x); // åéè§£ç åçå¾åä¿¡å· public slots: }; Client/¶Åìèº/code/´æ·Å´úÂë.txt
Client/¶Åìèº/log/ÈÕÖ¾_¶Åìèº_0220.docBinary files differ