codec_video_encoder.h 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. #pragma once
  2. #include "codec_abstract_codec.h"
  3. #include "../base/media_common.h"
  4. #include <mutex>
  5. #include <memory>
  6. extern "C" {
  7. #include <libavcodec/avcodec.h>
  8. #include <libavutil/hwcontext.h>
  9. #include <libavutil/opt.h>
  10. #include <libavformat/avformat.h>
  11. }
  12. namespace av {
  13. namespace codec {
  14. /**
  15. * 视频编码器参数
  16. */
  17. struct VideoEncoderParams : public CodecParams {
  18. int bitRate = 2000000; // 比特率 (bps)
  19. int width = 1920; // 宽度
  20. int height = 1080; // 高度
  21. int fps = 30; // 帧率
  22. int gopSize = 30; // GOP大小
  23. int maxBFrames = 0; // B帧数量
  24. std::string preset = "medium"; // 编码预设
  25. std::string tune = ""; // 调优参数
  26. bool lowLatency = false; // 低延迟模式
  27. bool hardwareAccel = true; // 硬件加速
  28. AVPixelFormat pixelFormat = AV_PIX_FMT_YUV420P; // 像素格式
  29. VideoEncoderParams() {
  30. type = MediaType::VIDEO;
  31. }
  32. };
  33. /**
  34. * 像素格式转换器
  35. */
  36. class PixelFormatConverter {
  37. friend class VideoEncoder;
  38. public:
  39. PixelFormatConverter(AVPixelFormat srcFormat, AVPixelFormat dstFormat);
  40. ~PixelFormatConverter();
  41. bool setSize(int width, int height);
  42. AVFramePtr convert(const AVFramePtr& srcFrame);
  43. private:
  44. struct SwsContext* swsCtx_;
  45. AVPixelFormat srcFormat_;
  46. AVPixelFormat dstFormat_;
  47. int width_;
  48. int height_;
  49. AVFramePtr dstFrame_;
  50. };
  51. /**
  52. * 视频编码器实现
  53. */
  54. class VideoEncoder : public AbstractEncoder {
  55. public:
  56. VideoEncoder();
  57. ~VideoEncoder() override;
  58. // AbstractCodec 接口实现
  59. ErrorCode open(const CodecParams& params) override;
  60. void close() override;
  61. ErrorCode flush() override;
  62. // AbstractEncoder 接口实现
  63. ErrorCode encode(const AVFramePtr& frame, std::vector<AVPacketPtr>& packets) override;
  64. ErrorCode finishEncode(std::vector<AVPacketPtr>& packets) override;
  65. // 视频编码器特有功能
  66. const VideoEncoderParams& getVideoParams() const { return videoParams_; }
  67. // 获取支持的编码器列表
  68. static std::vector<std::string> getSupportedEncoders();
  69. // 检查编码器是否支持硬件加速
  70. static bool isHardwareEncoder(const std::string& codecName);
  71. // 获取推荐的编码器
  72. static std::string getRecommendedEncoder();
  73. // 硬件编码器名称
  74. static constexpr const char* HARDWARE_ENCODERS[] = {
  75. "h264_nvenc", // NVIDIA
  76. "h264_qsv", // Intel Quick Sync
  77. "h264_amf", // AMD
  78. "h264_videotoolbox", // Apple
  79. };
  80. // 软件编码器名称
  81. static constexpr const char* SOFTWARE_ENCODERS[] = {
  82. "libx264",
  83. "libx265",
  84. };
  85. protected:
  86. bool validateParams(const CodecParams& params) override;
  87. private:
  88. // 初始化编码器
  89. ErrorCode initEncoder();
  90. // 设置编码器参数
  91. ErrorCode setupEncoderParams();
  92. // 设置硬件加速
  93. ErrorCode setupHardwareAcceleration();
  94. // 设置硬件帧上下文
  95. ErrorCode setupHardwareFrameContext();
  96. // 转换帧格式
  97. AVFramePtr convertFrame(const AVFramePtr& frame);
  98. // 转换到硬件帧
  99. AVFramePtr transferToHardware(const AVFramePtr& frame);
  100. // 编码单个帧
  101. ErrorCode encodeFrame(const AVFramePtr& frame, std::vector<AVPacketPtr>& packets);
  102. // 接收编码后的包
  103. ErrorCode receivePackets(std::vector<AVPacketPtr>& packets);
  104. // 获取硬件设备类型
  105. AVHWDeviceType getHardwareDeviceType() const;
  106. // 获取硬件像素格式
  107. AVPixelFormat getHardwarePixelFormat() const;
  108. // 查找可用的编码器
  109. static void findUsableEncoders();
  110. private:
  111. VideoEncoderParams videoParams_; // 视频编码参数
  112. // 硬件加速相关
  113. bool isHardwareEncoder_; // 是否硬件编码器
  114. AVBufferRef* hwDeviceCtx_; // 硬件设备上下文
  115. AVFramePtr hwFrame_; // 硬件帧缓冲
  116. // 格式转换
  117. std::unique_ptr<PixelFormatConverter> converter_;
  118. AVFramePtr convertedFrame_; // 转换后的帧
  119. // 线程安全
  120. std::mutex encodeMutex_;
  121. // 支持的编码器列表
  122. static std::vector<std::string> supportedEncoders_;
  123. static std::once_flag encodersInitFlag_;
  124. };
  125. /**
  126. * 视频编码器工厂
  127. */
  128. class VideoEncoderFactory {
  129. public:
  130. /**
  131. * 创建视频编码器
  132. */
  133. static std::unique_ptr<VideoEncoder> create(const std::string& codecName = "");
  134. /**
  135. * 创建最佳视频编码器(自动选择硬件/软件)
  136. */
  137. static std::unique_ptr<VideoEncoder> createBest(bool preferHardware = true);
  138. };
  139. } // namespace codec
  140. } // namespace av