GetAudioThread.h 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. /**
  2. * 叶海辉
  3. * QQ群121376426
  4. * http://blog.yundiantech.com/
  5. */
  6. #ifndef GetAudioThread_H
  7. #define GetAudioThread_H
  8. #include <functional>
  9. extern "C"
  10. {
  11. #include "libavcodec/avcodec.h"
  12. #include "libavformat/avformat.h"
  13. #include "libswscale/swscale.h"
  14. #include "libswresample/swresample.h"
  15. #include "libavdevice/avdevice.h"
  16. #include "libavutil/imgutils.h"
  17. }
  18. #include "AudioEncoder.h"
  19. #define AVCODEC_MAX_AUDIO_FRAME_SIZE 192000 // 1 second of 48khz 32bit audio
  20. /**
  21. * @brief The GetVideoThread class 此类主要负责采集屏幕
  22. */
  23. class GetAudioThread
  24. {
  25. public:
  26. explicit GetAudioThread();
  27. ~GetAudioThread();
  28. bool init(const char * const deviceName);
  29. void deInit();
  30. void startRecord(int outOneFrameSize, std::function<void (PCMFramePtr pcmFrame, int index)> func, int funcIndex);
  31. void pauseRecord();
  32. void restoreRecord();
  33. void stopRecord();
  34. protected:
  35. void run();
  36. private:
  37. int mONEFrameSize; //输出的一帧数据大小
  38. int mFuncIndex;
  39. std::function<void (PCMFramePtr pcmFrame, int index)> mCallBackFunc; //回调函数
  40. AVFormatContext *pFormatCtx;
  41. int audioStream;
  42. AVCodecContext *aCodecCtx;
  43. AVFrame *aFrame;
  44. bool m_isRun;
  45. bool m_pause;
  46. bool m_getFirst; //是否获取到了时间基准
  47. ///以下变量用于音频重采样
  48. /// 由于ffmpeg编码aac需要输入FLTP格式的数据。
  49. /// 因此这里将音频重采样成44100 双声道 AV_SAMPLE_FMT_FLTP
  50. AVFrame *aFrame_ReSample;
  51. SwrContext *swrCtx;
  52. enum AVSampleFormat in_sample_fmt; //输入的采样格式
  53. enum AVSampleFormat out_sample_fmt;//输出的采样格式 16bit PCM
  54. int in_sample_rate;//输入的采样率
  55. int out_sample_rate;//输出的采样率
  56. int audio_tgt_channels; ///av_get_channel_layout_nb_channels(out_ch_layout);
  57. int out_ch_layout;
  58. ///用于存储读取到的音频数据
  59. /// 由于平面模式的pcm存储方式为:LLLLLLLLLLLLLLLLLLLLLRRRRRRRRRRRRRRRRRRRRR,因此这里需要将左右声道数据分开存放
  60. DECLARE_ALIGNED(16, uint8_t, audio_buf_L) [AVCODEC_MAX_AUDIO_FRAME_SIZE * 4];
  61. unsigned int audio_buf_size_L;
  62. DECLARE_ALIGNED(16, uint8_t, audio_buf_R) [AVCODEC_MAX_AUDIO_FRAME_SIZE * 4];
  63. unsigned int audio_buf_size_R;
  64. bool initResample();
  65. void dealWithAudioFrame(const int &OneChannelDataSize);
  66. };
  67. #endif // GetVideoThread_H