encoder_aac.h 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. #ifndef ENCODER_AAC
  2. #define ENCODER_AAC
  3. #include <atomic>
  4. #include <condition_variable>
  5. #include <functional>
  6. #include <mutex>
  7. #include <thread>
  8. #include "headers_ffmpeg.h"
  9. #include "ring_buffer.h"
  10. //#define SAVE_AAC
  11. namespace am {
  12. typedef std::function<void(AVPacket *packet)> cb_aac_data;
  13. typedef std::function<void(int)> cb_aac_error;
  14. class encoder_aac
  15. {
  16. public:
  17. encoder_aac();
  18. ~encoder_aac();
  19. int init(int nb_channels, int sample_rate, AVSampleFormat fmt, int bit_rate);
  20. int get_extradata_size();
  21. const uint8_t *get_extradata();
  22. int get_nb_samples();
  23. int start();
  24. void stop();
  25. int put(const uint8_t *data, int data_len, AVFrame *frame);
  26. inline void registe_cb(cb_aac_data on_data, cb_aac_error on_error)
  27. {
  28. _on_data = on_data;
  29. _on_error = on_error;
  30. }
  31. const AVRational &get_time_base();
  32. AVCodecID get_codec_id();
  33. private:
  34. int encode(AVFrame *frame, AVPacket *packet);
  35. void encode_loop();
  36. void cleanup();
  37. // 为raw AAC数据添加ADTS头部
  38. int add_adts_header(AVPacket *packet);
  39. private:
  40. cb_aac_data _on_data;
  41. cb_aac_error _on_error;
  42. ring_buffer<AVFrame> *_ring_buffer;
  43. std::atomic_bool _inited;
  44. std::atomic_bool _running;
  45. std::thread _thread;
  46. AVCodec *_encoder;
  47. AVCodecContext *_encoder_ctx;
  48. AVFrame *_frame;
  49. uint8_t *_buff;
  50. int _buff_size;
  51. // BSF for converting raw AAC to ADTS format
  52. AVBSFContext *_bsf_ctx;
  53. std::mutex _mutex;
  54. std::condition_variable _cond_var;
  55. bool _cond_notify;
  56. #ifdef SAVE_AAC
  57. AVIOContext *_aac_io_ctx;
  58. AVStream *_aac_stream;
  59. AVFormatContext *_aac_fmt_ctx;
  60. #endif
  61. };
  62. } // namespace am
  63. #endif