Преглед на файлове

V1.8.0

1.支持播放音频文件
叶海辉 преди 6 години
родител
ревизия
120f296b45

BIN
bin/VideoPlayer.exe


+ 9 - 9
module/VideoPlayer/src/VideoPlayer/VideoPlayer.cpp

@@ -88,7 +88,7 @@ bool VideoPlayer::play()
     mVideoStartTime += pauseTime; //将暂停的时间加到开始播放的时间上,保证同步不受暂停的影响
 
     mPlayerState = Playing;
-    doPlayerStateChanged(Playing);
+    doPlayerStateChanged(Playing, mVideoStream != nullptr, mAudioStream != nullptr);
 
     return true;
 }
@@ -106,7 +106,7 @@ bool VideoPlayer::pause()
 
     mPlayerState = Pause;
 
-    emit doPlayerStateChanged(Pause);
+    emit doPlayerStateChanged(Pause, mVideoStream != nullptr, mAudioStream != nullptr);
 
     return true;
 }
@@ -403,7 +403,7 @@ void VideoPlayer::readVideoFile()
 //    av_dump_format(pFormatCtx, 0, file_path, 0); //输出视频信息
 
     mPlayerState = Playing;
-    doPlayerStateChanged(Playing);
+    doPlayerStateChanged(Playing, mVideoStream != nullptr, mAudioStream != nullptr);
 
     mVideoStartTime = av_gettime();
 OUTPUT("%s mIsQuit=%d \n", __FUNCTION__, mIsQuit);
@@ -534,7 +534,7 @@ end:
         stop();
     }
 
-    while(!mIsVideoThreadFinished || (mAudioStream != NULL && !mIsAudioThreadFinished))
+    while((mVideoStream != nullptr && !mIsVideoThreadFinished) || (mAudioStream != nullptr && !mIsAudioThreadFinished))
     {
         AppConfig::mSleep(10);
     } //确保视频线程结束后 再销毁队列
@@ -574,7 +574,7 @@ end:
     avformat_close_input(&pFormatCtx);
     avformat_free_context(pFormatCtx);
 
-    doPlayerStateChanged(Stop);
+    doPlayerStateChanged(Stop, mVideoStream != nullptr, mAudioStream != nullptr);
 
     mIsReadThreadFinished = true;
 
@@ -652,17 +652,17 @@ void VideoPlayer::doOpenSdlFailed(const int &code)
 ///获取到视频时长的时候调用此函数
 void VideoPlayer::doTotalTimeChanged(const int64_t &uSec)
 {
-
+    OUTPUT("%s \n", __FUNCTION__);
 }
 
 ///播放器状态改变的时候回调此函数
-void VideoPlayer::doPlayerStateChanged(const VideoPlayer::PlayerState &state)
+void VideoPlayer::doPlayerStateChanged(const VideoPlayer::PlayerState &state, const bool &hasVideo, const bool &hasAudio)
 {
-
+    OUTPUT("%s \n", __FUNCTION__);
 }
 
 ///显示rgb数据,此函数不宜做耗时操作,否则会影响播放的流畅性,传入的brgb32Buffer,在函数返回后既失效。
 void VideoPlayer::doDisplayVideo(const uint8_t *brgb32Buffer, const int &width, const int &height)
 {
-
+    OUTPUT("%s \n", __FUNCTION__);
 }

+ 1 - 1
module/VideoPlayer/src/VideoPlayer/VideoPlayer.h

@@ -178,7 +178,7 @@ protected:
     virtual void doTotalTimeChanged(const int64_t &uSec);
 
     ///播放器状态改变的时候回调此函数
-    virtual void doPlayerStateChanged(const VideoPlayer::PlayerState &state);
+    virtual void doPlayerStateChanged(const VideoPlayer::PlayerState &state, const bool &hasVideo, const bool &hasAudio);
 
     ///显示rgb数据,此函数不宜做耗时操作,否则会影响播放的流畅性,传入的brgb32Buffer,在函数返回后既失效。
     virtual void doDisplayVideo(const uint8_t *brgb32Buffer, const int &width, const int &height);

BIN
resources/image/audio.png


+ 1 - 0
resources/resources.qrc

@@ -17,5 +17,6 @@
         <file>image/stop1_normal.png</file>
         <file>image/volume_mute.png</file>
         <file>image/volume_normal.png</file>
+        <file>image/audio.png</file>
     </qresource>
 </RCC>

+ 14 - 5
src/Widget/VideoPlayerWidget.cpp

@@ -121,7 +121,9 @@ void VideoPlayerWidget::slotBtnClick(bool isChecked)
         QString s = QFileDialog::getOpenFileName(
                    this, QStringLiteral("选择要播放的文件"),
                     "/",//初始目录
-                    QStringLiteral("视频文件 (*.flv *.rmvb *.avi *.MP4 *.mkv);; 所有文件 (*.*);; "));
+                    QStringLiteral("视频文件 (*.flv *.rmvb *.avi *.MP4 *.mkv);;")
+                    +QStringLiteral("音频文件 (*.mp3 *.wma *.wav);;")
+                    +QStringLiteral("所有文件 (*.*)"));
         if (!s.isEmpty())
         {
             s.replace("/","\\");
@@ -176,9 +178,9 @@ void VideoPlayerWidget::doTotalTimeChanged(const int64_t &uSec)
 }
 
 ///播放器状态改变的时候回调此函数
-void VideoPlayerWidget::doPlayerStateChanged(const VideoPlayer::PlayerState &state)
+void VideoPlayerWidget::doPlayerStateChanged(const VideoPlayer::PlayerState &state, const bool &hasVideo, const bool &hasAudio)
 {
-    emit sig_PlayerStateChanged(state);
+    emit sig_PlayerStateChanged(state, hasVideo, hasAudio);
 }
 
 void VideoPlayerWidget::slotOpenVideoFileFailed(const int &code)
@@ -206,7 +208,7 @@ void VideoPlayerWidget::slotTotalTimeChanged(const qint64 &uSec)
 
 }
 
-void VideoPlayerWidget::slotStateChanged(VideoPlayer::PlayerState state)
+void VideoPlayerWidget::slotStateChanged(const PlayerState &state, const bool &hasVideo, const bool &hasAudio)
 {
     if (state == VideoPlayer::Stop)
     {
@@ -224,7 +226,14 @@ void VideoPlayerWidget::slotStateChanged(VideoPlayer::PlayerState state)
     }
     else if (state == VideoPlayer::Playing)
     {
-        ui->stackedWidget->setCurrentWidget(ui->page_video);
+        if (hasVideo)
+        {
+            ui->stackedWidget->setCurrentWidget(ui->page_video);
+        }
+        else
+        {
+            ui->stackedWidget->setCurrentWidget(ui->page_audio);
+        }
 
         ui->pushButton_play->hide();
         ui->pushButton_pause->show();

+ 3 - 3
src/Widget/VideoPlayerWidget.h

@@ -60,7 +60,7 @@ protected:
     void doTotalTimeChanged(const int64_t &uSec);
 
     ///播放器状态改变的时候回调此函数
-    void doPlayerStateChanged(const VideoPlayer::PlayerState &state);
+    void doPlayerStateChanged(const VideoPlayer::PlayerState &state, const bool &hasVideo, const bool &hasAudio);
 
     ///显示rgb数据,此函数不宜做耗时操作,否则会影响播放的流畅性,传入的brgb32Buffer,在函数返回后既失效。
     void doDisplayVideo(const uint8_t *brgb32Buffer, const int &width, const int &height);
@@ -70,14 +70,14 @@ signals:
     void sig_OpenVideoFileFailed(const int &code);
     void sig_OpenSdlFailed(const int &code);
     void sig_TotalTimeChanged(const qint64 &Usec);
-    void sig_PlayerStateChanged(const VideoPlayer::PlayerState &state);
+    void sig_PlayerStateChanged(const VideoPlayer::PlayerState &state, const bool &hasVideo, const bool &hasAudio);
     void sig_DisplayVideo(const QImage &image);
 
 private slots:
     void slotOpenVideoFileFailed(const int &code);
     void slotOpenSdlFailed(const int &code);
     void slotTotalTimeChanged(const qint64 &uSec);
-    void slotStateChanged(VideoPlayer::PlayerState state);
+    void slotStateChanged(const VideoPlayer::PlayerState &state, const bool &hasVideo, const bool &hasAudio);
     void slotDisplayVideo(const QImage &image);
 
 };

+ 24 - 34
src/Widget/VideoPlayerWidget.ui

@@ -43,12 +43,12 @@
        <rect>
         <x>80</x>
         <y>40</y>
-        <width>711</width>
-        <height>321</height>
+        <width>931</width>
+        <height>381</height>
        </rect>
       </property>
       <property name="currentIndex">
-       <number>1</number>
+       <number>2</number>
       </property>
       <widget class="QWidget" name="page_open">
        <layout class="QVBoxLayout" name="verticalLayout_6">
@@ -131,6 +131,20 @@
         </item>
        </layout>
       </widget>
+      <widget class="QWidget" name="page_audio">
+       <layout class="QVBoxLayout" name="verticalLayout_2">
+        <item>
+         <widget class="QLabel" name="label">
+          <property name="styleSheet">
+           <string notr="true">image: url(:/image/audio.png);</string>
+          </property>
+          <property name="text">
+           <string/>
+          </property>
+         </widget>
+        </item>
+       </layout>
+      </widget>
       <widget class="QWidget" name="page_video">
        <layout class="QVBoxLayout" name="verticalLayout_8">
         <property name="spacing">
@@ -287,22 +301,6 @@ border-radius:0px;
            </property>
           </widget>
          </item>
-         <item>
-          <spacer name="horizontalSpacer_4">
-           <property name="orientation">
-            <enum>Qt::Horizontal</enum>
-           </property>
-           <property name="sizeType">
-            <enum>QSizePolicy::Fixed</enum>
-           </property>
-           <property name="sizeHint" stdset="0">
-            <size>
-             <width>6</width>
-             <height>20</height>
-            </size>
-           </property>
-          </spacer>
-         </item>
          <item>
           <widget class="QPushButton" name="pushButton_pause">
            <property name="minimumSize">
@@ -409,10 +407,10 @@ border: 0px solid #bbb;
 
 QSlider::sub-page:horizontal {
 background-color: #ff9900;
-border-bottom-left-radius: 5px; 
-border-top-left-radius: 5px; 
+border-bottom-left-radius: 2px; 
+border-top-left-radius: 2px; 
 
-border-radius: 5px; 
+border-radius: 2px; 
 margin-top:5px;
 margin-bottom:5px;
 }
@@ -454,24 +452,16 @@ border-color: #999;
 QSlider::handle:horizontal:disabled {
 background: #eee;
 border: 1px solid #aaa;
-border-radius: 4px;
-}
-
-
-
-QProgressBar 
-{   
-border: 0px solid grey;   
-border-radius: 5px;   
-background-color: rgba(228, 228, 228, 50);
-border-radius:5px;  /*边框拐角*/
+border-radius: 2px;
 }
-
 </string>
            </property>
            <property name="maximum">
             <number>100</number>
            </property>
+           <property name="value">
+            <number>0</number>
+           </property>
            <property name="orientation">
             <enum>Qt::Horizontal</enum>
            </property>