muxer_ffmpeg.h 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. #ifndef MUXER_FFMPEG
  2. #define MUXER_FFMPEG
  3. #include <functional>
  4. #include <list>
  5. #include <math.h>
  6. #include <mutex>
  7. #include <thread>
  8. #include "muxer_file.h"
  9. #include "headers_ffmpeg.h"
  10. namespace am {
  11. // Forward declarations for encoder classes to expose getters without including headers here
  12. class encoder_video;
  13. class encoder_aac;
  14. class muxer_ffmpeg : public muxer_file
  15. {
  16. public:
  17. muxer_ffmpeg();
  18. ~muxer_ffmpeg();
  19. int init(const char *output_file,
  20. record_desktop *source_desktop,
  21. record_audio **source_audios,
  22. const int source_audios_nb,
  23. const MUX_SETTING_T &setting);
  24. int start();
  25. int stop();
  26. int pause();
  27. int resume();
  28. // Expose encoder instances for diagnostics/metrics
  29. encoder_video* get_video_encoder() const;
  30. encoder_aac* get_audio_encoder() const;
  31. private:
  32. void on_desktop_data(AVFrame *frame);
  33. void on_desktop_error(int error);
  34. void on_audio_data(AVFrame *frame, int index);
  35. void on_audio_error(int error, int index);
  36. void on_filter_amix_data(AVFrame *frame, int index);
  37. void on_filter_amix_error(int error, int index);
  38. void on_filter_aresample_data(AVFrame *frame, int index);
  39. void on_filter_aresample_error(int error, int index);
  40. void on_enc_264_data(AVPacket *packet);
  41. void on_enc_264_error(int error);
  42. void on_enc_aac_data(AVPacket *packet);
  43. void on_enc_aac_error(int error);
  44. int alloc_oc(const char *output_file, const MUX_SETTING_T &setting);
  45. int add_video_stream(const MUX_SETTING_T &setting, record_desktop *source_desktop);
  46. int add_audio_stream(const MUX_SETTING_T &setting,
  47. record_audio **source_audios,
  48. const int source_audios_nb);
  49. int open_output(const char *output_file, const MUX_SETTING_T &setting);
  50. void cleanup_video();
  51. void cleanup_audio();
  52. void cleanup();
  53. uint64_t get_current_time();
  54. int write_video(AVPacket *packet);
  55. int write_audio(AVPacket *packet);
  56. private:
  57. struct MUX_STREAM_T *_v_stream, *_a_stream;
  58. const AVOutputFormat *_fmt;
  59. AVFormatContext *_fmt_ctx;
  60. int64_t _base_time;
  61. char ff_error[4096];
  62. std::mutex _mutex;
  63. std::mutex _time_mutex;
  64. };
  65. } // namespace am
  66. #endif