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

AudioDecode新增支持播放其他格式音频文件

huihui преди 5 години
родител
ревизия
6fdec0f5d9

+ 4 - 2
source/AudioDecode/AudioDecoder/AudioDecoder.pri

@@ -4,13 +4,14 @@ QMAKE_CXXFLAGS += -std=c++11
 
 SOURCES += \
         $$PWD/src/MoudleConfig.cpp \
-        $$PWD/src/AudioDecoder/AudioDecoder.cpp \
+        $$PWD/src/AudioDecoder/AACDecoder.cpp \
         $$PWD/src/AudioFrame/AACFrame.cpp \
         $$PWD/src/AudioFrame/PCMFrame.cpp \
         $$PWD/src/AudioPlayer/AudioPlayer.cpp \
         $$PWD/src/AudioPlayer/AudioPlayer_RtAudio.cpp \
         $$PWD/src/AudioPlayer/AudioPlayer_SDL.cpp \
         $$PWD/src/AudioReader/AAC/AACReader.cpp \
+        $$PWD/src/AudioReader/ReadAACFileThread.cpp \
         $$PWD/src/AudioReader/ReadAudioFileThread.cpp \
         $$PWD/src/EventHandle/AudioPlayerEventHandle.cpp \
         $$PWD/src/Mutex/Cond.cpp \
@@ -18,13 +19,14 @@ SOURCES += \
 
 HEADERS += \
         $$PWD/src/MoudleConfig.h \
-        $$PWD/src/AudioDecoder/AudioDecoder.h \
+        $$PWD/src/AudioDecoder/AACDecoder.h \
         $$PWD/src/AudioFrame/AACFrame.h \
         $$PWD/src/AudioFrame/PCMFrame.h \
         $$PWD/src/AudioPlayer/AudioPlayer.h \
         $$PWD/src/AudioPlayer/AudioPlayer_RtAudio.h \
         $$PWD/src/AudioPlayer/AudioPlayer_SDL.h \
         $$PWD/src/AudioReader/AAC/AACReader.h \
+        $$PWD/src/AudioReader/ReadAACFileThread.h \
         $$PWD/src/AudioReader/ReadAudioFileThread.h \
         $$PWD/src/EventHandle/AudioPlayerEventHandle.h \
         $$PWD/src/Mutex/Cond.h \

+ 7 - 7
source/AudioDecode/AudioDecoder/src/AudioDecoder/AudioDecoder.cpp → source/AudioDecode/AudioDecoder/src/AudioDecoder/AACDecoder.cpp

@@ -1,12 +1,12 @@
-/**
+/**
  * 叶海辉
  * QQ群121376426
  * http://blog.yundiantech.com/
  */
 
-#include "AudioDecoder.h"
+#include "AACDecoder.h"
 
-AudioDecoder::AudioDecoder()
+AACDecoder::AACDecoder()
 {
     aCodec = nullptr;
     aCodecCtx = nullptr;
@@ -16,7 +16,7 @@ AudioDecoder::AudioDecoder()
     swrCtx = nullptr;
 }
 
-bool AudioDecoder::openDecoder()
+bool AACDecoder::openDecoder()
 {
     ///打开音频解码器
     //find the decoder
@@ -44,7 +44,7 @@ bool AudioDecoder::openDecoder()
     return true;
 }
 
-void AudioDecoder::closeDecoder()
+void AACDecoder::closeDecoder()
 {
     avcodec_close(aCodecCtx);
     av_free(aCodecCtx);
@@ -57,7 +57,7 @@ void AudioDecoder::closeDecoder()
 
 }
 
-bool AudioDecoder::initResample()
+bool AACDecoder::initResample()
 {
     //重采样设置选项-----------------------------------------------------------start
     aFrame_ReSample = av_frame_alloc();
@@ -121,7 +121,7 @@ bool AudioDecoder::initResample()
     return true;
 }
 //FILE *fp = fopen("out.pcm", "wb");
-PCMFramePtr AudioDecoder::decode(uint8_t *inputbuf, int frame_size)
+PCMFramePtr AACDecoder::decode(uint8_t *inputbuf, int frame_size)
 {
     PCMFramePtr framePtr = nullptr;
 

+ 6 - 6
source/AudioDecode/AudioDecoder/src/AudioDecoder/AudioDecoder.h → source/AudioDecode/AudioDecoder/src/AudioDecoder/AACDecoder.h

@@ -1,11 +1,11 @@
-/**
+/**
  * 叶海辉
  * QQ群121376426
  * http://blog.yundiantech.com/
  */
 
-#ifndef AUDIODECODER_H
-#define AUDIODECODER_H
+#ifndef AACDECODER_H
+#define AACDECODER_H
 
 #include "AudioFrame/PCMFrame.h"
 
@@ -22,10 +22,10 @@ typedef unsigned char uchar;
 
 #define AVCODEC_MAX_AUDIO_FRAME_SIZE 192000 // 1 second of 48khz 32bit audio
 
-class AudioDecoder
+class AACDecoder
 {
 public:
-    AudioDecoder();
+    AACDecoder();
 
     bool openDecoder();
     void closeDecoder();
@@ -56,4 +56,4 @@ private:
 
 };
 
-#endif // AUDIODECORDER_H
+#endif // AACDECODER_H

+ 1 - 1
source/AudioDecode/AudioDecoder/src/AudioPlayer/AudioPlayer.cpp

@@ -1,4 +1,4 @@
-#include "AudioPlayer.h"
+#include "AudioPlayer.h"
 
 #include "PcmVolumeControl.h"
 

+ 223 - 0
source/AudioDecode/AudioDecoder/src/AudioReader/ReadAACFileThread.cpp

@@ -0,0 +1,223 @@
+
+/**
+ * 叶海辉
+ * QQ群121376426
+ * http://blog.yundiantech.com/
+ */
+
+#include <thread>
+
+#include "MoudleConfig.h"
+#include "ReadAACFileThread.h"
+
+#if defined(WIN32)
+#include <WinSock2.h>
+#include <Windows.h>
+#include <direct.h>
+#include <io.h> //C (Windows)    access
+#else
+#include <sys/time.h>
+#include <stdio.h>
+#include <unistd.h>
+#endif
+
+#define PCMTYPE short
+#define MAXPCMVALUE 32767
+
+ReadAACFileThread::ReadAACFileThread()
+{
+    mAudioCallBack = nullptr;
+
+    mAACReader  = new AACReader();
+    mAACDecoder = new AACDecoder();
+
+#if 1
+    mAudioPlayer  = new AudioPlayer_RtAudio();
+#else
+    mAudioPlayer  = new AudioPlayer_SDL();
+#endif
+}
+
+ReadAACFileThread::~ReadAACFileThread()
+{
+
+}
+
+std::list<AudioDevice> ReadAACFileThread::getAudiDeviceList()
+{
+    return  mAudioPlayer->getAudiDeviceList();
+}
+
+void ReadAACFileThread::startRead(char* filePath)
+{
+    strcpy(mFileName, filePath);
+
+    //启动新的线程实现读取视频文件
+    std::thread([&](ReadAACFileThread *pointer)
+    {
+        pointer->run();
+
+    }, this).detach();
+}
+
+void ReadAACFileThread::run()
+{
+
+    char *fileName = mFileName;
+    FILE *fp = fopen(fileName, "rb");
+    if (fp == nullptr)
+    {
+        fprintf(stderr, "AAC file not exist! \n");
+        return;
+    }
+
+    mAACDecoder->openDecoder();
+    mAudioPlayer->startPlay();
+
+    int totalFrameNum = 0; //总帧数
+    int frameNum = 0; //当前播放的帧序号
+    uint32_t totalTime = 0; //总时长(毫秒)
+    uint32_t currentTime = 0; //当前播放时间(毫秒)
+
+    ///获取音频强度数据,用于绘制波形图
+    {
+        std::list<float> mLeftChannelDbValues;
+        std::list<float> mRighttChannelDbValues;
+
+        while(!feof(fp))
+        {
+            char buf[10240];
+            int size = fread(buf, 1, 1024, fp);//从h264文件读1024个字节 (模拟从网络收到h264流)
+            int nCount = mAACReader->inputAACData((uint8_t*)buf,size);
+
+            while(1)
+            {
+                //从前面读到的数据中获取一个nalu
+                AACFramePtr framePtr = mAACReader->getNextFrame();
+                if (framePtr == nullptr || framePtr.get() == nullptr) break;
+
+                AACFrame *aacFrame = framePtr.get();
+
+                PCMFramePtr pcmFramePtr = mAACDecoder->decode(aacFrame->getBuffer(), aacFrame->getSize());
+
+                PCMTYPE *buffer = (PCMTYPE *)pcmFramePtr->getBuffer();
+
+                /// 这里直接使用前两个字节转成short,然后作为纵坐标来绘制波形图。
+                /// PS:这里的PCM音频数据排列方式为,左右左右左右左右...
+                mLeftChannelDbValues.push_back(buffer[0] * 1.0 / MAXPCMVALUE);
+                mRighttChannelDbValues.push_back(buffer[1] * 1.0 / MAXPCMVALUE);
+
+                totalFrameNum++;
+            }
+        }
+
+        if (mAudioCallBack != nullptr)
+        {
+            mAudioCallBack->onGetPcmWaveValues(mLeftChannelDbValues, mRighttChannelDbValues);
+        }
+
+        fseek(fp, 0, SEEK_SET);
+    }
+
+    ///计算总时长
+    {
+        /// 这里一帧音频的采样是1024,音频的采样率是一秒钟44100次,总时长便很容易就算。
+        /// 当然也可以通过直接计算数据总大小,原理都是类似。
+        totalTime = totalFrameNum * 1024.0 / 44100 * 1000; //单位是毫秒
+    }
+
+    while(!feof(fp))
+    {
+        char buf[10240];
+        int size = fread(buf, 1, 1024, fp);//从h264文件读1024个字节 (模拟从网络收到h264流)
+        int nCount = mAACReader->inputAACData((uint8_t*)buf,size);
+
+        while(1)
+        {
+            //从前面读到的数据中获取一个nalu
+            AACFramePtr framePtr = mAACReader->getNextFrame();
+            if (framePtr == nullptr || framePtr.get() == nullptr) break;
+
+            frameNum++;
+
+            AACFrame *aacFrame = framePtr.get();
+
+            PCMFramePtr pcmFramePtr = mAACDecoder->decode(aacFrame->getBuffer(), aacFrame->getSize());
+
+            ///延时等待
+            while(1)
+            {
+                if (mAudioPlayer->getPcmFrameSize() <= 3)
+                {
+                    mAudioPlayer->inputPCMFrame(pcmFramePtr);
+                    break;
+                }
+                else
+                {
+                    MoudleConfig::mSleep(50);
+                }
+            }
+
+            if (mAudioCallBack != nullptr)
+            {
+                PCMTYPE *buffer = (PCMTYPE *)pcmFramePtr->getBuffer();
+
+                ///记录当前帧的所有采样点db值
+                std::list<float> leftChannelDbValues;
+                std::list<float> righttChannelDbValues;
+
+                ///记录当前帧的所有采样点db值总和
+                uint64_t leftChannelTotal = 0;
+                uint64_t rightChannelTotal = 0;
+
+                /// 计算分贝 音频数据与大小
+                /// 首先我们分别累加每个采样点的数值,除以采样个数,得到声音平均能量值。
+                /// 然后再将其做100与32767之间的等比量化。得到1-100的量化值。
+                /// 通常情况下,人声分布在较低的能量范围,这样就会使量化后的数据大致分布在1-20的较小区间,不能够很敏感的感知变化。
+                /// 所以我们将其做了5倍的放大,当然计算后大于100的值,我们将其赋值100.
+                /// PS:这里的PCM音频数据排列方式为,左右左右左右左右..
+                int nums = pcmFramePtr->getSize() / sizeof (PCMTYPE);
+                for (int i=0;i<nums;)
+                {
+                    leftChannelTotal += abs(buffer[i]);
+                    rightChannelTotal += abs(buffer[i+1]);
+
+                    ///左声道数据放大5倍展示
+                    leftChannelDbValues.push_back(buffer[i] * 1.0 / MAXPCMVALUE);
+
+                    if (i % 500 == 0)
+                    {
+                        righttChannelDbValues.push_back(buffer[i+1] * 1.0 / MAXPCMVALUE);
+                    }
+
+                    i+=2;
+                }
+
+                ///记录当前帧的所有采样点db值平均值
+                PCMTYPE leftChannels  = leftChannelTotal / nums;
+                PCMTYPE rightChannels = rightChannelTotal / nums;
+
+                float leftChannelDb = leftChannels * 5.0 / MAXPCMVALUE;
+                if (leftChannelDb > 1.0f)
+                {
+                    leftChannelDb = 1.0f;
+                }
+
+                float rightChannelDb = rightChannels * 5.0 / MAXPCMVALUE;
+                if (rightChannelDb > 1.0f)
+                {
+                    rightChannelDb = 1.0f;
+                }
+
+                float progress = frameNum * 1.0 / totalFrameNum;
+                currentTime = frameNum * 1024.0 / 44100 * 1000; //单位是毫秒
+
+                mAudioCallBack->onGetPcmFrame(pcmFramePtr);
+                mAudioCallBack->onUpdatePlayingTime(totalTime, currentTime);
+                mAudioCallBack->onUpdatePlayingValue(leftChannelDb, rightChannelDb, leftChannelDbValues, righttChannelDbValues, progress);
+            }
+        }
+    }
+
+    mAACDecoder->closeDecoder();
+}

+ 54 - 0
source/AudioDecode/AudioDecoder/src/AudioReader/ReadAACFileThread.h

@@ -0,0 +1,54 @@
+
+/**
+ * 叶海辉
+ * QQ群121376426
+ * http://blog.yundiantech.com/
+ */
+
+#ifndef REAACFILETHREAD_H
+#define REAACFILETHREAD_H
+
+#include "AAC/AACReader.h"
+#include "AudioDecoder/AACDecoder.h"
+#include "AudioPlayer/AudioPlayer_SDL.h"
+#include "AudioPlayer/AudioPlayer_RtAudio.h"
+
+#include "EventHandle/AudioPlayerEventHandle.h"
+
+class ReadAACFileThread
+{
+public:
+    ReadAACFileThread();
+    ~ReadAACFileThread();
+
+    /**
+     * @brief setVideoPlayerCallBack 设置播放器回调函数
+     * @param pointer
+     */
+    void setVideoPlayerCallBack(AudioPlayerCallBack *pointer){mAudioCallBack=pointer;}
+
+    void startRead(char* filePath);
+
+    std::list<AudioDevice> getAudiDeviceList();
+
+protected:
+    void run();
+
+private:
+    char mFileName[256];
+
+    AACReader *mAACReader;
+    AACDecoder *mAACDecoder;
+    AudioPlayer *mAudioPlayer;
+
+    ///回调函数相关,主要用于输出信息给界面
+private:
+    ///回调函数
+    AudioPlayerCallBack *mAudioCallBack;
+
+//    ///显示视频数据,此函数不宜做耗时操作,否则会影响播放的流畅性。
+//    void doDisplayVideo(const uint8_t *yuv420Buffer, const int &width, const int &height, const int &frameNum);
+
+};
+
+#endif // REAACFILETHREAD_H

+ 530 - 114
source/AudioDecode/AudioDecoder/src/AudioReader/ReadAudioFileThread.cpp

@@ -1,4 +1,4 @@
-
+
 /**
  * 叶海辉
  * QQ群121376426
@@ -28,9 +28,6 @@ ReadAudioFileThread::ReadAudioFileThread()
 {
     mAudioCallBack = nullptr;
 
-    mAACReader    = new AACReader();
-    mAudioDecoder = new AudioDecoder();
-
 #if 1
     mAudioPlayer  = new AudioPlayer_RtAudio();
 #else
@@ -48,9 +45,9 @@ std::list<AudioDevice> ReadAudioFileThread::getAudiDeviceList()
     return  mAudioPlayer->getAudiDeviceList();
 }
 
-void ReadAudioFileThread::startRead(char* filePath)
+void ReadAudioFileThread::startRead(const std::string &filePath)
 {
-    strcpy(mFileName, filePath);
+    mFilePath = filePath;
 
     //启动新的线程实现读取视频文件
     std::thread([&](ReadAudioFileThread *pointer)
@@ -62,16 +59,9 @@ void ReadAudioFileThread::startRead(char* filePath)
 
 void ReadAudioFileThread::run()
 {
+//    mIsReadThreadFinished = false;
+//    mIsReadFinished = false;
 
-    char *fileName = mFileName;
-    FILE *fp = fopen(fileName, "rb");
-    if (fp == nullptr)
-    {
-        fprintf(stderr, "AAC file not exist! \n");
-        return;
-    }
-
-    mAudioDecoder->openDecoder();
     mAudioPlayer->startPlay();
 
     int totalFrameNum = 0; //总帧数
@@ -79,145 +69,571 @@ void ReadAudioFileThread::run()
     uint32_t totalTime = 0; //总时长(毫秒)
     uint32_t currentTime = 0; //当前播放时间(毫秒)
 
-    ///获取音频强度数据,用于绘制波形图
-    {
-        std::list<float> mLeftChannelDbValues;
-        std::list<float> mRighttChannelDbValues;
+    const char * file_path = mFilePath.c_str();
 
-        while(!feof(fp))
-        {
-            char buf[10240];
-            int size = fread(buf, 1, 1024, fp);//从h264文件读1024个字节 (模拟从网络收到h264流)
-            int nCount = mAACReader->inputAACData((uint8_t*)buf,size);
+    pFormatCtx = nullptr;
+    pCodecCtx = nullptr;
+    pCodec = nullptr;
 
-            while(1)
-            {
-                //从前面读到的数据中获取一个nalu
-                AACFramePtr framePtr = mAACReader->getNextFrame();
-                if (framePtr == nullptr || framePtr.get() == nullptr) break;
+    aCodecCtx = nullptr;
+    aCodec = nullptr;
+    aFrame = nullptr;
 
-                AACFrame *aacFrame = framePtr.get();
+    mAudioStream = nullptr;
+    mVideoStream = nullptr;
 
-                PCMFramePtr pcmFramePtr = mAudioDecoder->decode(aacFrame->getBuffer(), aacFrame->getSize());
+    audio_clock = 0;
+    video_clock = 0;
 
-                PCMTYPE *buffer = (PCMTYPE *)pcmFramePtr->getBuffer();
+    int audioStream ,videoStream;
 
-                /// 这里直接使用前两个字节转成short,然后作为纵坐标来绘制波形图。
-                /// PS:这里的PCM音频数据排列方式为,左右左右左右左右...
-                mLeftChannelDbValues.push_back(buffer[0] * 1.0 / MAXPCMVALUE);
-                mRighttChannelDbValues.push_back(buffer[1] * 1.0 / MAXPCMVALUE);
+    //Allocate an AVFormatContext.
+    pFormatCtx = avformat_alloc_context();
 
-                totalFrameNum++;
-            }
+    if (avformat_open_input(&pFormatCtx, file_path, nullptr, nullptr) != 0)
+    {
+        fprintf(stderr, "can't open the file. \n");
+//        doOpenVideoFileFailed();
+        goto end;
+    }
+
+    if (avformat_find_stream_info(pFormatCtx, nullptr) < 0)
+    {
+        fprintf(stderr, "Could't find stream infomation.\n");
+//        doOpenVideoFileFailed();
+        goto end;
+    }
+
+    videoStream = -1;
+    audioStream = -1;
+
+    ///循环查找视频中包含的流信息,
+    for (int i = 0; i < pFormatCtx->nb_streams; i++)
+    {
+        if (pFormatCtx->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO)
+        {
+            videoStream = i;
+        }
+        if (pFormatCtx->streams[i]->codec->codec_type == AVMEDIA_TYPE_AUDIO  && audioStream < 0)
+        {
+            audioStream = i;
+        }
+    }
+
+//    doTotalTimeChanged(getTotalTime());
+
+    ///打开视频解码器,并启动视频线程
+    if (videoStream >= 0)
+    {
+        ///查找视频解码器
+        pCodecCtx = pFormatCtx->streams[videoStream]->codec;
+        pCodec = avcodec_find_decoder(pCodecCtx->codec_id);
+
+        if (pCodec == nullptr)
+        {
+            fprintf(stderr, "PCodec not found.\n");
+//            doOpenVideoFileFailed();
+            goto end;
         }
 
-        if (mAudioCallBack != nullptr)
+        ///打开视频解码器
+        if (avcodec_open2(pCodecCtx, pCodec, NULL) < 0)
         {
-            mAudioCallBack->onGetPcmWaveValues(mLeftChannelDbValues, mRighttChannelDbValues);
+            fprintf(stderr, "Could not open video codec.\n");
+//            doOpenVideoFileFailed();
+            goto end;
         }
 
-        fseek(fp, 0, SEEK_SET);
+        mVideoStream = pFormatCtx->streams[videoStream];
     }
 
-    ///计算总时长
+    if (audioStream >= 0)
     {
-        /// 这里一帧音频的采样是1024,音频的采样率是一秒钟44100次,总时长便很容易就算。
-        /// 当然也可以通过直接计算数据总大小,原理都是类似。
-        totalTime = totalFrameNum * 1024.0 / 44100 * 1000; //单位是毫秒
+        ///查找音频解码器
+        aCodecCtx = pFormatCtx->streams[audioStream]->codec;
+        aCodec = avcodec_find_decoder(aCodecCtx->codec_id);
+
+        if (aCodec == NULL)
+        {
+            fprintf(stderr, "ACodec not found.\n");
+            audioStream = -1;
+        }
+        else
+        {
+            ///打开音频解码器
+            if (avcodec_open2(aCodecCtx, aCodec, nullptr) < 0)
+            {
+                fprintf(stderr, "Could not open audio codec.\n");
+//                doOpenVideoFileFailed();
+                goto end;
+            }
+
+            ///解码音频相关
+            aFrame = av_frame_alloc();
+
+
+            //重采样设置选项-----------------------------------------------------------start
+            aFrame_ReSample = nullptr;
+
+            //frame->16bit 44100 PCM 统一音频采样格式与采样率
+            swrCtx = nullptr;
+
+            //输入的声道布局
+            int in_ch_layout;
+
+            //输出的声道布局
+            int out_ch_layout = av_get_default_channel_layout(audio_tgt_channels); ///AV_CH_LAYOUT_STEREO
+
+            out_ch_layout &= ~AV_CH_LAYOUT_STEREO_DOWNMIX;
+
+            /// 这里音频播放使用了固定的参数
+            /// 强制将音频重采样成44100 双声道  AV_SAMPLE_FMT_S16
+            /// SDL播放中也是用了同样的播放参数
+            //重采样设置选项----------------
+            //输入的采样格式
+            in_sample_fmt = aCodecCtx->sample_fmt;
+            //输出的采样格式 16bit PCM
+            out_sample_fmt = AV_SAMPLE_FMT_S16;
+            //输入的采样率
+            in_sample_rate = aCodecCtx->sample_rate;
+            //输入的声道布局
+            in_ch_layout = aCodecCtx->channel_layout;
+
+            //输出的采样率
+            out_sample_rate = 44100;
+            //输出的声道布局
+
+            audio_tgt_channels = 2; ///av_get_channel_layout_nb_channels(out_ch_layout);
+            out_ch_layout = av_get_default_channel_layout(audio_tgt_channels); ///AV_CH_LAYOUT_STEREO
+
+            out_ch_layout &= ~AV_CH_LAYOUT_STEREO_DOWNMIX;
+
+            /// 2019-5-13添加
+            /// wav/wmv 文件获取到的aCodecCtx->channel_layout为0会导致后面的初始化失败,因此这里需要加个判断。
+            if (in_ch_layout <= 0)
+            {
+                in_ch_layout = av_get_default_channel_layout(aCodecCtx->channels);
+            }
+
+            swrCtx = swr_alloc_set_opts(nullptr, out_ch_layout, out_sample_fmt, out_sample_rate,
+                                                 in_ch_layout, in_sample_fmt, in_sample_rate, 0, nullptr);
+
+            /** Open the resampler with the specified parameters. */
+            int ret = swr_init(swrCtx);
+            if (ret < 0)
+            {
+                char buff[128]={0};
+                av_strerror(ret, buff, 128);
+
+                fprintf(stderr, "Could not open resample context %s\n", buff);
+                swr_free(&swrCtx);
+                swrCtx = nullptr;
+//                doOpenVideoFileFailed();
+                goto end;
+            }
+
+            //存储pcm数据
+            int out_linesize = out_sample_rate * audio_tgt_channels;
+
+    //        out_linesize = av_samples_get_buffer_size(NULL, audio_tgt_channels, av_get_bytes_per_sample(out_sample_fmt), out_sample_fmt, 1);
+            out_linesize = AVCODEC_MAX_AUDIO_FRAME_SIZE;
+
+
+            mAudioStream = pFormatCtx->streams[audioStream];
+        }
+
     }
 
-    while(!feof(fp))
+    av_dump_format(pFormatCtx, 0, file_path, 0); //输出视频信息
+
+//    mPlayerState = VideoPlayer_Playing;
+//    doPlayerStateChanged(VideoPlayer_Playing, mVideoStream != nullptr, mAudioStream != nullptr);
+
+    mVideoStartTime = av_gettime();
+fprintf(stderr, "%s mIsQuit=%d mIsPause=%d \n", __FUNCTION__, mIsQuit, mIsPause);
+    while (1)
     {
-        char buf[10240];
-        int size = fread(buf, 1, 1024, fp);//从h264文件读1024个字节 (模拟从网络收到h264流)
-        int nCount = mAACReader->inputAACData((uint8_t*)buf,size);
+        if (mIsQuit)
+        {
+            //停止播放了
+            break;
+        }
 
-        while(1)
+//        if (seek_req)
+//        {
+//            int stream_index = -1;
+//            int64_t seek_target = seek_pos;
+
+//            if (videoStream >= 0)
+//                stream_index = videoStream;
+//            else if (audioStream >= 0)
+//                stream_index = audioStream;
+
+//            AVRational aVRational = {1, AV_TIME_BASE};
+//            if (stream_index >= 0)
+//            {
+//                seek_target = av_rescale_q(seek_target, aVRational, pFormatCtx->streams[stream_index]->time_base);
+//            }
+
+//            if (av_seek_frame(pFormatCtx, stream_index, seek_target, AVSEEK_FLAG_BACKWARD) < 0)
+//            {
+//                fprintf(stderr, "%s: error while seeking\n",pFormatCtx->filename);
+//            }
+//            else
+//            {
+//                if (audioStream >= 0)
+//                {
+//                    AVPacket packet;
+//                    av_new_packet(&packet, 10);
+//                    strcpy((char*)packet.data,FLUSH_DATA);
+//                    clearAudioQuene(); //清除队列
+//                    inputAudioQuene(packet); //往队列中存入用来清除的包
+//                }
+
+//                if (videoStream >= 0)
+//                {
+//                    AVPacket packet;
+//                    av_new_packet(&packet, 10);
+//                    strcpy((char*)packet.data,FLUSH_DATA);
+//                    clearVideoQuene(); //清除队列
+//                    inputVideoQuene(packet); //往队列中存入用来清除的包
+//                    video_clock = 0;
+//                }
+
+//                mVideoStartTime = av_gettime() - seek_pos;
+//                mPauseStartTime = av_gettime();
+//            }
+//            seek_req = 0;
+//            seek_time = seek_pos / 1000000.0;
+//            seek_flag_audio = 1;
+//            seek_flag_video = 1;
+
+//            if (mIsPause)
+//            {
+//                mIsNeedPause = true;
+//                mIsPause = false;
+//            }
+
+//        }
+
+//        //这里做了个限制  当队列里面的数据超过某个大小的时候 就暂停读取  防止一下子就把视频读完了,导致的空间分配不足
+//        //这个值可以稍微写大一些
+//        if (mAudioPacktList.size() > MAX_AUDIO_SIZE || mVideoPacktList.size() > MAX_VIDEO_SIZE)
+//        {
+//            mSleep(10);
+//            continue;
+//        }
+
+//        if (mIsPause == true)
+//        {
+//            mSleep(10);
+//            continue;
+//        }
+
+        AVPacket packet;
+        if (av_read_frame(pFormatCtx, &packet) < 0)
         {
-            //从前面读到的数据中获取一个nalu
-            AACFramePtr framePtr = mAACReader->getNextFrame();
-            if (framePtr == nullptr || framePtr.get() == nullptr) break;
+            mIsReadFinished = true;
 
-            frameNum++;
+            if (mIsQuit)
+            {
+                break; //解码线程也执行完了 可以退出了
+            }
 
-            AACFrame *aacFrame = framePtr.get();
+            MoudleConfig::mSleep(10);
+            continue;
+        }
 
-            PCMFramePtr pcmFramePtr = mAudioDecoder->decode(aacFrame->getBuffer(), aacFrame->getSize());
+        if( packet.stream_index == audioStream )
+        {
+            fprintf(stderr, "%s size=%d pts=%I64d \n", __FUNCTION__, packet.size, packet.pts);
 
-            ///延时等待
-            while(1)
+
+            //解码AVPacket->AVFrame
+            if (int ret = avcodec_send_packet(aCodecCtx, &packet) && ret != 0)
             {
-                if (mAudioPlayer->getPcmFrameSize() <= 3)
-                {
-                    mAudioPlayer->inputPCMFrame(pcmFramePtr);
-                    break;
-                }
-                else
-                {
-                    MoudleConfig::mSleep(50);
-                }
+               char buffer[1024] = {0};
+               av_strerror(ret, buffer, 1024);
+               fprintf(stderr, "input AVPacket to decoder failed! ret = %d %s\n", ret, buffer);
             }
-
-            if (mAudioCallBack != nullptr)
+            else
             {
-                PCMTYPE *buffer = (PCMTYPE *)pcmFramePtr->getBuffer();
-
-                ///记录当前帧的所有采样点db值
-                std::list<float> leftChannelDbValues;
-                std::list<float> righttChannelDbValues;
-
-                ///记录当前帧的所有采样点db值总和
-                uint64_t leftChannelTotal = 0;
-                uint64_t rightChannelTotal = 0;
-
-                /// 计算分贝 音频数据与大小
-                /// 首先我们分别累加每个采样点的数值,除以采样个数,得到声音平均能量值。
-                /// 然后再将其做100与32767之间的等比量化。得到1-100的量化值。
-                /// 通常情况下,人声分布在较低的能量范围,这样就会使量化后的数据大致分布在1-20的较小区间,不能够很敏感的感知变化。
-                /// 所以我们将其做了5倍的放大,当然计算后大于100的值,我们将其赋值100.
-                /// PS:这里的PCM音频数据排列方式为,左右左右左右左右..
-                int nums = pcmFramePtr->getSize() / sizeof (PCMTYPE);
-                for (int i=0;i<nums;)
+            //    while (0 == avcodec_receive_frame(pCodecCtx, pFrame))
+                while(1)
                 {
-                    leftChannelTotal += abs(buffer[i]);
-                    rightChannelTotal += abs(buffer[i+1]);
+                    int ret = avcodec_receive_frame(aCodecCtx, aFrame);
+                    if (ret != 0)
+                    {
+            //            char buffer[1024] = {0};
+            //            av_strerror(ret, buffer, 1024);
+            //            fprintf(stderr, "avcodec_receive_frame = %d %s\n", ret, buffer);
+                        break;
+                    }
 
-                    ///左声道数据放大5倍展示
-                    leftChannelDbValues.push_back(buffer[i] * 1.0 / MAXPCMVALUE);
+                    /// ffmpeg解码之后得到的音频数据不是SDL想要的,
+                    /// 因此这里需要重采样成44100 双声道 AV_SAMPLE_FMT_S16
+                    if (aFrame_ReSample == NULL)
+                    {
+                        aFrame_ReSample = av_frame_alloc();
+                    }
 
-                    if (i % 500 == 0)
+                    if (aFrame_ReSample->nb_samples != aFrame->nb_samples)
                     {
-                        righttChannelDbValues.push_back(buffer[i+1] * 1.0 / MAXPCMVALUE);
+                        aFrame_ReSample->nb_samples = av_rescale_rnd(swr_get_delay(swrCtx, out_sample_rate) + aFrame->nb_samples,
+                                    out_sample_rate, in_sample_rate, AV_ROUND_UP);
+
+                        av_samples_fill_arrays(aFrame_ReSample->data, aFrame_ReSample->linesize, audio_buf, audio_tgt_channels, aFrame_ReSample->nb_samples, out_sample_fmt, 0);
+
                     }
 
-                    i+=2;
-                }
+                    int len2 = swr_convert(swrCtx, aFrame_ReSample->data, aFrame_ReSample->nb_samples, (const uint8_t**)aFrame->data, aFrame->nb_samples);
+                    int resampled_data_size = len2 * audio_tgt_channels * av_get_bytes_per_sample(out_sample_fmt);
 
-                ///记录当前帧的所有采样点db值平均值
-                PCMTYPE leftChannels  = leftChannelTotal / nums;
-                PCMTYPE rightChannels = rightChannelTotal / nums;
+                    frameNum++;
+                    fprintf(stderr, "%s [%d] size=%d pts=%I64d %d\n", __FUNCTION__, frameNum, packet.size, packet.pts, resampled_data_size);
 
-                float leftChannelDb = leftChannels * 5.0 / MAXPCMVALUE;
-                if (leftChannelDb > 1.0f)
-                {
-                    leftChannelDb = 1.0f;
-                }
+                    PCMFramePtr pcmFramePtr = std::make_shared<PCMFrame>();
+                    pcmFramePtr->setFrameBuffer(audio_buf, resampled_data_size);
 
-                float rightChannelDb = rightChannels * 5.0 / MAXPCMVALUE;
-                if (rightChannelDb > 1.0f)
-                {
-                    rightChannelDb = 1.0f;
+                    mAudioPlayer->inputPCMFrame(pcmFramePtr);
+
+                    static FILE * fp = fopen("out.pcm", "wb");
+                    fwrite(audio_buf, 1, resampled_data_size, fp);
                 }
+            }
 
-                float progress = frameNum * 1.0 / totalFrameNum;
-                currentTime = frameNum * 1024.0 / 44100 * 1000; //单位是毫秒
+    //保存重采样之前的一个声道的数据方法
+    //size_t unpadded_linesize = aFrame->nb_samples * av_get_bytes_per_sample((AVSampleFormat) aFrame->format);
+    //static FILE * fp = fopen("out.pcm", "wb");
+    //fwrite(aFrame->extended_data[0], 1, unpadded_linesize, fp);
 
-                mAudioCallBack->onGetPcmFrame(pcmFramePtr);
-                mAudioCallBack->onUpdatePlayingTime(totalTime, currentTime);
-                mAudioCallBack->onUpdatePlayingValue(leftChannelDb, rightChannelDb, leftChannelDbValues, righttChannelDbValues, progress);
-            }
+            av_packet_unref(&packet);
         }
+        else
+        {
+            // Free the packet that was allocated by av_read_frame
+            av_packet_unref(&packet);
+        }
+    }
+
+    ///文件读取结束 跳出循环的情况
+    ///等待播放完毕
+    while (!mIsQuit)
+    {
+        MoudleConfig::mSleep(100);
+    }
+
+end:
+
+//    clearAudioQuene();
+//    clearVideoQuene();
+
+//    if (mPlayerState != VideoPlayer_Stop) //不是外部调用的stop 是正常播放结束
+//    {
+//        stop();
+//    }
+
+//    while((mVideoStream != nullptr && !mIsVideoThreadFinished) || (mAudioStream != nullptr && !mIsAudioThreadFinished))
+//    {
+//        mSleep(10);
+//    } //确保视频线程结束后 再销毁队列
+
+    if (swrCtx != nullptr)
+    {
+        swr_free(&swrCtx);
+        swrCtx = nullptr;
+    }
+
+    if (aFrame != nullptr)
+    {
+        av_frame_free(&aFrame);
+        aFrame = nullptr;
+    }
+
+    if (aFrame_ReSample != nullptr)
+    {
+        av_frame_free(&aFrame_ReSample);
+        aFrame_ReSample = nullptr;
+    }
+
+    if (aCodecCtx != nullptr)
+    {
+        avcodec_close(aCodecCtx);
+        aCodecCtx = nullptr;
     }
 
-    mAudioDecoder->closeDecoder();
+    if (pCodecCtx != nullptr)
+    {
+        avcodec_close(pCodecCtx);
+        pCodecCtx = nullptr;
+    }
+
+    avformat_close_input(&pFormatCtx);
+    avformat_free_context(pFormatCtx);
+
+//    doPlayerStateChanged(VideoPlayer_Stop, mVideoStream != nullptr, mAudioStream != nullptr);
+
+    mIsReadThreadFinished = true;
+
+fprintf(stderr, "%s finished \n", __FUNCTION__);
 }
+
+//void ReadAudioFileThread::run()
+//{
+
+//    char *fileName = mFileName;
+//    FILE *fp = fopen(fileName, "rb");
+//    if (fp == nullptr)
+//    {
+//        fprintf(stderr, "AAC file not exist! \n");
+//        return;
+//    }
+
+//    mAudioPlayer->startPlay();
+
+//    int totalFrameNum = 0; //总帧数
+//    int frameNum = 0; //当前播放的帧序号
+//    uint32_t totalTime = 0; //总时长(毫秒)
+//    uint32_t currentTime = 0; //当前播放时间(毫秒)
+
+//    ///获取音频强度数据,用于绘制波形图
+//    {
+//        std::list<float> mLeftChannelDbValues;
+//        std::list<float> mRighttChannelDbValues;
+
+//        while(!feof(fp))
+//        {
+////            char buf[10240];
+////            int size = fread(buf, 1, 1024, fp);//从h264文件读1024个字节 (模拟从网络收到h264流)
+////            int nCount = mAACReader->inputAACData((uint8_t*)buf,size);
+
+////            while(1)
+////            {
+////                //从前面读到的数据中获取一个nalu
+////                AACFramePtr framePtr = mAACReader->getNextFrame();
+////                if (framePtr == nullptr || framePtr.get() == nullptr) break;
+
+////                AACFrame *aacFrame = framePtr.get();
+
+////                PCMFramePtr pcmFramePtr = mAudioDecoder->decode(aacFrame->getBuffer(), aacFrame->getSize());
+
+////                PCMTYPE *buffer = (PCMTYPE *)pcmFramePtr->getBuffer();
+
+////                /// 这里直接使用前两个字节转成short,然后作为纵坐标来绘制波形图。
+////                /// PS:这里的PCM音频数据排列方式为,左右左右左右左右...
+////                mLeftChannelDbValues.push_back(buffer[0] * 1.0 / MAXPCMVALUE);
+////                mRighttChannelDbValues.push_back(buffer[1] * 1.0 / MAXPCMVALUE);
+
+////                totalFrameNum++;
+////            }
+//        }
+
+//        if (mAudioCallBack != nullptr)
+//        {
+//            mAudioCallBack->onGetPcmWaveValues(mLeftChannelDbValues, mRighttChannelDbValues);
+//        }
+
+//        fseek(fp, 0, SEEK_SET);
+//    }
+
+//    ///计算总时长
+//    {
+//        /// 这里一帧音频的采样是1024,音频的采样率是一秒钟44100次,总时长便很容易就算。
+//        /// 当然也可以通过直接计算数据总大小,原理都是类似。
+//        totalTime = totalFrameNum * 1024.0 / 44100 * 1000; //单位是毫秒
+//    }
+
+//    while(!feof(fp))
+//    {
+////        char buf[10240];
+////        int size = fread(buf, 1, 1024, fp);//从h264文件读1024个字节 (模拟从网络收到h264流)
+////        int nCount = mAACReader->inputAACData((uint8_t*)buf,size);
+
+////        while(1)
+////        {
+////            //从前面读到的数据中获取一个nalu
+////            AACFramePtr framePtr = mAACReader->getNextFrame();
+////            if (framePtr == nullptr || framePtr.get() == nullptr) break;
+
+////            frameNum++;
+
+////            AACFrame *aacFrame = framePtr.get();
+
+////            PCMFramePtr pcmFramePtr = mAudioDecoder->decode(aacFrame->getBuffer(), aacFrame->getSize());
+
+////            ///延时等待
+////            while(1)
+////            {
+////                if (mAudioPlayer->getPcmFrameSize() <= 3)
+////                {
+////                    mAudioPlayer->inputPCMFrame(pcmFramePtr);
+////                    break;
+////                }
+////                else
+////                {
+////                    MoudleConfig::mSleep(50);
+////                }
+////            }
+
+////            if (mAudioCallBack != nullptr)
+////            {
+////                PCMTYPE *buffer = (PCMTYPE *)pcmFramePtr->getBuffer();
+
+////                ///记录当前帧的所有采样点db值
+////                std::list<float> leftChannelDbValues;
+////                std::list<float> righttChannelDbValues;
+
+////                ///记录当前帧的所有采样点db值总和
+////                uint64_t leftChannelTotal = 0;
+////                uint64_t rightChannelTotal = 0;
+
+////                /// 计算分贝 音频数据与大小
+////                /// 首先我们分别累加每个采样点的数值,除以采样个数,得到声音平均能量值。
+////                /// 然后再将其做100与32767之间的等比量化。得到1-100的量化值。
+////                /// 通常情况下,人声分布在较低的能量范围,这样就会使量化后的数据大致分布在1-20的较小区间,不能够很敏感的感知变化。
+////                /// 所以我们将其做了5倍的放大,当然计算后大于100的值,我们将其赋值100.
+////                /// PS:这里的PCM音频数据排列方式为,左右左右左右左右..
+////                int nums = pcmFramePtr->getSize() / sizeof (PCMTYPE);
+////                for (int i=0;i<nums;)
+////                {
+////                    leftChannelTotal += abs(buffer[i]);
+////                    rightChannelTotal += abs(buffer[i+1]);
+
+////                    ///左声道数据放大5倍展示
+////                    leftChannelDbValues.push_back(buffer[i] * 1.0 / MAXPCMVALUE);
+
+////                    if (i % 500 == 0)
+////                    {
+////                        righttChannelDbValues.push_back(buffer[i+1] * 1.0 / MAXPCMVALUE);
+////                    }
+
+////                    i+=2;
+////                }
+
+////                ///记录当前帧的所有采样点db值平均值
+////                PCMTYPE leftChannels  = leftChannelTotal / nums;
+////                PCMTYPE rightChannels = rightChannelTotal / nums;
+
+////                float leftChannelDb = leftChannels * 5.0 / MAXPCMVALUE;
+////                if (leftChannelDb > 1.0f)
+////                {
+////                    leftChannelDb = 1.0f;
+////                }
+
+////                float rightChannelDb = rightChannels * 5.0 / MAXPCMVALUE;
+////                if (rightChannelDb > 1.0f)
+////                {
+////                    rightChannelDb = 1.0f;
+////                }
+
+////                float progress = frameNum * 1.0 / totalFrameNum;
+////                currentTime = frameNum * 1024.0 / 44100 * 1000; //单位是毫秒
+
+////                mAudioCallBack->onGetPcmFrame(pcmFramePtr);
+////                mAudioCallBack->onUpdatePlayingTime(totalTime, currentTime);
+////                mAudioCallBack->onUpdatePlayingValue(leftChannelDb, rightChannelDb, leftChannelDbValues, righttChannelDbValues, progress);
+////            }
+////        }
+//    }
+
+//}

+ 60 - 7
source/AudioDecode/AudioDecoder/src/AudioReader/ReadAudioFileThread.h

@@ -1,4 +1,4 @@
-
+
 /**
  * 叶海辉
  * QQ群121376426
@@ -8,13 +8,25 @@
 #ifndef READAUDIOFILETHREAD_H
 #define READAUDIOFILETHREAD_H
 
-#include "AAC/AACReader.h"
-#include "AudioDecoder/AudioDecoder.h"
 #include "AudioPlayer/AudioPlayer_SDL.h"
 #include "AudioPlayer/AudioPlayer_RtAudio.h"
 
 #include "EventHandle/AudioPlayerEventHandle.h"
 
+#include <thread>
+
+extern "C"
+{
+    #include <libavcodec/avcodec.h>
+    #include <libavformat/avformat.h>
+    #include <libavutil/time.h>
+    #include <libavutil/pixfmt.h>
+    #include <libswscale/swscale.h>
+    #include <libswresample/swresample.h>
+}
+
+#define AVCODEC_MAX_AUDIO_FRAME_SIZE 192000 // 1 second of 48khz 32bit audio
+
 class ReadAudioFileThread
 {
 public:
@@ -27,7 +39,7 @@ public:
      */
     void setVideoPlayerCallBack(AudioPlayerCallBack *pointer){mAudioCallBack=pointer;}
 
-    void startRead(char* filePath);
+    void startRead(const std::string &filePath);
 
     std::list<AudioDevice> getAudiDeviceList();
 
@@ -35,12 +47,53 @@ protected:
     void run();
 
 private:
-    char mFileName[256];
+    std::string mFilePath;
 
-    AACReader *mAACReader;
-    AudioDecoder *mAudioDecoder;
     AudioPlayer *mAudioPlayer;
 
+    ///播放控制相关
+    bool mIsNeedPause; //暂停后跳转先标记此变量
+    bool mIsPause;  //暂停标志
+    bool mIsQuit;   //停止
+    bool mIsReadFinished; //文件读取完毕
+    bool mIsReadThreadFinished;
+    bool mIsVideoThreadFinished; //视频解码线程
+    bool mIsAudioThreadFinished; //音频播放线程
+
+    ///音视频同步相关
+    uint64_t mVideoStartTime; //开始播放视频的时间
+    uint64_t mPauseStartTime; //暂停开始的时间
+    double audio_clock; ///音频时钟
+    double video_clock; ///<pts of last decoded frame / predicted pts of next decoded frame
+    AVStream *mVideoStream; //视频流
+    AVStream *mAudioStream; //音频流
+
+    ///视频相关
+    AVFormatContext *pFormatCtx;
+    AVCodecContext *pCodecCtx;
+    AVCodec *pCodec;
+
+    ///音频相关
+    AVCodecContext *aCodecCtx;
+    AVCodec *aCodec;
+    AVFrame *aFrame;
+
+    ///以下变量用于音频重采样
+    /// 由于ffmpeg解码出来后的pcm数据有可能是带平面的pcm,因此这里统一做重采样处理,
+    /// 重采样成44100的16 bits 双声道数据(AV_SAMPLE_FMT_S16)
+    AVFrame *aFrame_ReSample;
+    SwrContext *swrCtx;
+
+    enum AVSampleFormat in_sample_fmt; //输入的采样格式
+    enum AVSampleFormat out_sample_fmt;//输出的采样格式 16bit PCM
+    int in_sample_rate;//输入的采样率
+    int out_sample_rate;//输出的采样率
+    int audio_tgt_channels; ///av_get_channel_layout_nb_channels(out_ch_layout);
+    unsigned int audio_buf_size;
+    unsigned int audio_buf_index;
+    DECLARE_ALIGNED(16,uint8_t,audio_buf) [AVCODEC_MAX_AUDIO_FRAME_SIZE * 4];
+
+
     ///回调函数相关,主要用于输出信息给界面
 private:
     ///回调函数

+ 12 - 8
source/AudioDecode/AudioDecoder/src/Mutex/Cond.cpp

@@ -1,4 +1,4 @@
-#include "Cond.h"
+锘�#include "Cond.h"
 
 Cond::Cond()
 {
@@ -23,7 +23,7 @@ Cond::~Cond()
 
 }
 
-//加锁
+//鍔犻攣
 int Cond::Lock()
 {
 #if defined(WIN32) && !defined(MINGW)
@@ -35,7 +35,7 @@ int Cond::Lock()
 
 }
 
-//解锁
+//瑙i攣
 int Cond::Unlock()
 {
 #if defined(WIN32) && !defined(MINGW)
@@ -46,10 +46,14 @@ int Cond::Unlock()
 #endif
 }
 
-int Cond::Wait()
+int Cond::Wait(int timeOut)
 {
 #if defined(WIN32) && !defined(MINGW)
-    DWORD ret = SleepConditionVariableCS((PCONDITION_VARIABLE)&m_cond, &m_mutex, INFINITE);
+    if (timeOut < 0)
+    {
+        timeOut = INFINITE;
+    }
+    DWORD ret = SleepConditionVariableCS((PCONDITION_VARIABLE)&m_cond, &m_mutex, timeOut);
 #else
     int ret = pthread_cond_wait(&m_cond, &m_mutex);
 #endif
@@ -58,7 +62,7 @@ int Cond::Wait()
 
 }
 
-//固定时间等待
+//鍥哄畾鏃堕棿绛夊緟
 int Cond::TimedWait(int second)
 {
 #if defined(WIN32) && !defined(MINGW)
@@ -66,7 +70,7 @@ int Cond::TimedWait(int second)
     return 0;
 #else
     struct timespec abstime;
-    //获取从当前时间,并加上等待时间, 设置进程的超时睡眠时间
+    //鑾峰彇浠庡綋鍓嶆椂闂达紝骞跺姞涓婄瓑寰呮椂闂达紝 璁剧疆杩涚▼鐨勮秴鏃剁潯鐪犳椂闂�
     clock_gettime(CLOCK_REALTIME, &abstime);
     abstime.tv_sec += second;
     return pthread_cond_timedwait(&m_cond, &m_mutex, &abstime);
@@ -85,7 +89,7 @@ int Cond::Signal()
     return ret;
 }
 
-//唤醒所有睡眠线程
+//鍞ら啋鎵€鏈夌潯鐪犵嚎绋�
 int Cond::Broadcast()
 {
 #if defined(WIN32) && !defined(MINGW)

+ 9 - 9
source/AudioDecode/AudioDecoder/src/Mutex/Cond.h

@@ -1,8 +1,8 @@
-#ifndef COND_H
+锘�#ifndef COND_H
 #define COND_H
 
-/// 注意Mingw的话使用的是linux下的api pthread
-/// 没有_MSC_VER这个宏 我们就认为他用的是mingw编译器
+/// 娉ㄦ剰Mingw鐨勮瘽浣跨敤鐨勬槸linux涓嬬殑api pthread
+/// 娌℃湁_MSC_VER杩欎釜瀹� 鎴戜滑灏辫�涓轰粬鐢ㄧ殑鏄痬ingw缂栬瘧鍣�
 
 #ifndef _MSC_VER
 #define MINGW
@@ -22,22 +22,22 @@ public:
     Cond();
     ~Cond();
 
-    //上锁
+    //涓婇攣
     int Lock();
 
-    //解锁
+    //瑙i攣
     int Unlock();
 
-    //
-    int Wait();
+    //timeOut-姣��
+    int Wait(int timeOut = -1);
 
-    //固定时间等待
+    //鍥哄畾鏃堕棿绛夊緟
     int TimedWait(int second);
 
     //
     int Signal();
 
-    //唤醒所有睡眠线程
+    //鍞ら啋鎵€鏈夌潯鐪犵嚎绋�
     int Broadcast();
 
 private:

+ 1 - 1
source/AudioDecode/AudioDecoder/src/Mutex/Mutex.cpp

@@ -1,4 +1,4 @@
-#include "Mutex.h"
+#include "Mutex.h"
 
 Mutex::Mutex()
 {

+ 3 - 3
source/AudioDecode/AudioDecoder/src/Mutex/Mutex.h

@@ -1,4 +1,4 @@
-#ifndef MUTEX_H
+锘�#ifndef MUTEX_H
 #define MUTEX_H
 
 
@@ -16,10 +16,10 @@ public:
     Mutex();
     ~Mutex();
 
-    //确保拥有互斥对象的线程对被保护资源的独自访问
+    //纭�繚鎷ユ湁浜掓枼瀵硅薄鐨勭嚎绋嬪�琚�繚鎶よ祫婧愮殑鐙�嚜璁块棶
     int Lock() const;
 
-    //释放当前线程拥有的互斥对象,以使其它线程可以拥有互斥对象,对被保护资源进行访问
+    //閲婃斁褰撳墠绾跨▼鎷ユ湁鐨勪簰鏂ュ�璞★紝浠ヤ娇鍏跺畠绾跨▼鍙�互鎷ユ湁浜掓枼瀵硅薄锛屽�琚�繚鎶よ祫婧愯繘琛岃�闂�
     int Unlock() const;
 
 private:

+ 8 - 2
source/AudioDecode/src/MainWindow.cpp

@@ -74,11 +74,17 @@ MainWindow::MainWindow(QWidget *parent) :
     ui->horizontalLayout_current_left->addWidget(mCurrentChartView_Left);
     ui->horizontalLayout_current_right->addWidget(mCurrentChartView_Right);
 
+#if 1
+    mReadAACFileThread = new ReadAACFileThread();
+    mReadAACFileThread->setVideoPlayerCallBack(this);
+    mReadAACFileThread->startRead((char*)"../data/test.aac");
+    std::list<AudioDevice> deviceList = mReadAACFileThread->getAudiDeviceList();
+#else
     mReadAudioFileThread = new ReadAudioFileThread();
     mReadAudioFileThread->setVideoPlayerCallBack(this);
-    mReadAudioFileThread->startRead((char*)"../data/test.aac");
-
+    mReadAudioFileThread->startRead((char*)"../data/test.mp3");
     std::list<AudioDevice> deviceList = mReadAudioFileThread->getAudiDeviceList();
+#endif
 
     for (const AudioDevice & device : deviceList)
     {

+ 2 - 0
source/AudioDecode/src/MainWindow.h

@@ -9,6 +9,7 @@
 #include <QtCharts/QValueAxis>
 #include <QLabel>
 
+#include "AudioReader/ReadAACFileThread.h"
 #include "AudioReader/ReadAudioFileThread.h"
 
 QT_CHARTS_USE_NAMESPACE
@@ -29,6 +30,7 @@ private:
     Ui::MainWindow *ui;
 
     ReadAudioFileThread *mReadAudioFileThread;
+    ReadAACFileThread *mReadAACFileThread;
 
     QLabel *mShowProgressLabel; //显示进度用的