capture_abstract_capturer.cpp 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. #include "capture_abstract_capturer.h"
  2. #include "../base/logger.h"
  3. #include <chrono>
  4. namespace av {
  5. namespace capture {
  6. AbstractCapturer::AbstractCapturer() {
  7. stats_.startTime = std::chrono::steady_clock::now();
  8. lastFrameTime_ = std::chrono::steady_clock::now();
  9. lastFpsCalcTime_ = std::chrono::steady_clock::now();
  10. AV_LOGGER_DEBUG("创建抽象采集器");
  11. }
  12. AbstractCapturer::~AbstractCapturer() {
  13. AV_LOGGER_DEBUG("抽象采集器已销毁");
  14. }
  15. void AbstractCapturer::setState(CapturerState state) {
  16. CapturerState oldState = state_.exchange(state);
  17. if (oldState != state) {
  18. AV_LOGGER_INFOF("采集器状态变更: {} -> {}",
  19. static_cast<int>(oldState), static_cast<int>(state));
  20. }
  21. }
  22. void AbstractCapturer::onFrameCaptured(const AVFramePtr& frame) {
  23. if (!frame) {
  24. AV_LOGGER_WARNING("采集到空帧");
  25. return;
  26. }
  27. auto now = std::chrono::steady_clock::now();
  28. double captureTime = std::chrono::duration<double, std::milli>(now - lastFrameTime_).count();
  29. lastFrameTime_ = now;
  30. // 计算数据大小
  31. size_t dataSize = 0;
  32. if (frame->data[0]) {
  33. for (int i = 0; i < AV_NUM_DATA_POINTERS && frame->data[i]; ++i) {
  34. dataSize += frame->linesize[i] * frame->height;
  35. }
  36. }
  37. updateStats(true, captureTime, dataSize);
  38. calculateFPS();
  39. if (frameCallback_) {
  40. frameCallback_(frame);
  41. }
  42. }
  43. void AbstractCapturer::onError(ErrorCode error, const std::string& message) {
  44. updateStats(false, 0.0);
  45. AV_LOGGER_ERRORF("采集器错误: {} - {}", static_cast<int>(error), message);
  46. if (errorCallback_) {
  47. errorCallback_(error, message);
  48. }
  49. }
  50. void AbstractCapturer::updateStats(bool success, double captureTime, size_t dataSize) {
  51. std::lock_guard<std::mutex> lock(statsMutex_);
  52. if (success) {
  53. stats_.capturedFrames++;
  54. stats_.totalBytes += dataSize;
  55. // 更新平均采集时间
  56. if (stats_.capturedFrames == 1) {
  57. stats_.avgCaptureTime = captureTime;
  58. } else {
  59. stats_.avgCaptureTime = (stats_.avgCaptureTime * (stats_.capturedFrames - 1) + captureTime) / stats_.capturedFrames;
  60. }
  61. } else {
  62. stats_.errorCount++;
  63. }
  64. }
  65. void AbstractCapturer::calculateFPS() {
  66. frameCountForFps_++;
  67. auto now = std::chrono::steady_clock::now();
  68. auto elapsed = std::chrono::duration<double>(now - lastFpsCalcTime_).count();
  69. // 每秒计算一次FPS
  70. if (elapsed >= 1.0) {
  71. std::lock_guard<std::mutex> lock(statsMutex_);
  72. stats_.fps = frameCountForFps_ / elapsed;
  73. frameCountForFps_ = 0;
  74. lastFpsCalcTime_ = now;
  75. }
  76. }
  77. CapturerStats AbstractCapturer::getStats() const {
  78. std::lock_guard<std::mutex> lock(statsMutex_);
  79. return stats_;
  80. }
  81. void AbstractCapturer::resetStats() {
  82. std::lock_guard<std::mutex> lock(statsMutex_);
  83. stats_ = CapturerStats{};
  84. stats_.startTime = std::chrono::steady_clock::now();
  85. frameCountForFps_ = 0;
  86. lastFpsCalcTime_ = std::chrono::steady_clock::now();
  87. AV_LOGGER_DEBUG("采集器统计信息已重置");
  88. }
  89. // CapturerFactory 实现
  90. bool CapturerFactory::isCapturerSupported(CapturerType type) {
  91. switch (type) {
  92. case CapturerType::VIDEO_CAMERA:
  93. case CapturerType::VIDEO_SCREEN:
  94. case CapturerType::AUDIO_MIC:
  95. case CapturerType::AUDIO_SYSTEM:
  96. case CapturerType::AUDIO_LOOPBACK:
  97. return true;
  98. default:
  99. return false;
  100. }
  101. }
  102. std::vector<CapturerType> CapturerFactory::getAvailableCapturerTypes() {
  103. std::vector<CapturerType> types;
  104. // 检查各种采集器类型的可用性
  105. if (isCapturerSupported(CapturerType::VIDEO_CAMERA)) {
  106. types.push_back(CapturerType::VIDEO_CAMERA);
  107. }
  108. if (isCapturerSupported(CapturerType::VIDEO_SCREEN)) {
  109. types.push_back(CapturerType::VIDEO_SCREEN);
  110. }
  111. if (isCapturerSupported(CapturerType::AUDIO_MIC)) {
  112. types.push_back(CapturerType::AUDIO_MIC);
  113. }
  114. if (isCapturerSupported(CapturerType::AUDIO_SYSTEM)) {
  115. types.push_back(CapturerType::AUDIO_SYSTEM);
  116. }
  117. if (isCapturerSupported(CapturerType::AUDIO_LOOPBACK)) {
  118. types.push_back(CapturerType::AUDIO_LOOPBACK);
  119. }
  120. return types;
  121. }
  122. std::string CapturerFactory::getCapturerTypeName(CapturerType type) {
  123. switch (type) {
  124. case CapturerType::VIDEO_CAMERA:
  125. return "摄像头";
  126. case CapturerType::VIDEO_SCREEN:
  127. return "屏幕录制";
  128. case CapturerType::AUDIO_MIC:
  129. return "麦克风";
  130. case CapturerType::AUDIO_SYSTEM:
  131. return "系统音频";
  132. case CapturerType::AUDIO_LOOPBACK:
  133. return "音频回环";
  134. default:
  135. return "未知";
  136. }
  137. }
  138. } // namespace capture
  139. } // namespace av