test_audio.cpp 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. #include <chrono>
  2. #include <iostream>
  3. #include <string>
  4. #include <thread>
  5. #include "code/base/logger.h"
  6. #include "code/player/player_core_v2.h"
  7. using namespace av::player;
  8. using namespace av::utils;
  9. // 简单的事件回调类
  10. class TestPlayerCallback : public PlayerEventCallback {
  11. public:
  12. void onStateChanged(PlayerState newState) override {
  13. std::string stateStr;
  14. switch (newState) {
  15. case PlayerState::Idle: stateStr = "Idle"; break;
  16. case PlayerState::Opening: stateStr = "Opening"; break;
  17. case PlayerState::Stopped: stateStr = "Stopped"; break;
  18. case PlayerState::Playing: stateStr = "Playing"; break;
  19. case PlayerState::Paused: stateStr = "Paused"; break;
  20. case PlayerState::Seeking: stateStr = "Seeking"; break;
  21. case PlayerState::Error: stateStr = "Error"; break;
  22. }
  23. std::cout << "[EVENT] State changed to: " << stateStr << std::endl;
  24. }
  25. void onPositionChanged(int64_t position) override {
  26. static auto lastUpdate = std::chrono::steady_clock::now();
  27. auto now = std::chrono::steady_clock::now();
  28. if (std::chrono::duration_cast<std::chrono::seconds>(now - lastUpdate).count() >= 1) {
  29. double seconds = position / 1000000.0;
  30. std::cout << "[EVENT] Position: " << std::fixed << std::setprecision(2) << seconds << "s" << std::endl;
  31. lastUpdate = now;
  32. }
  33. }
  34. void onMediaInfoChanged(const MediaInfo& info) override {
  35. std::cout << "[EVENT] Media info changed:" << std::endl;
  36. std::cout << " File: " << info.filename << std::endl;
  37. std::cout << " Duration: " << (info.duration / 1000000.0) << "s" << std::endl;
  38. std::cout << " Has Video: " << (info.hasVideo ? "Yes" : "No") << std::endl;
  39. std::cout << " Has Audio: " << (info.hasAudio ? "Yes" : "No") << std::endl;
  40. if (info.hasAudio) {
  41. std::cout << " Audio: " << info.sampleRate << " Hz, " << info.channels << " channels" << std::endl;
  42. }
  43. }
  44. void onErrorOccurred(const std::string& error) override {
  45. std::cout << "[ERROR] " << error << std::endl;
  46. }
  47. void onFrameDropped(int64_t totalDropped) override {
  48. std::cout << "[WARNING] Frame dropped, total: " << totalDropped << std::endl;
  49. }
  50. void onSyncError(double error, const std::string& reason) override {
  51. std::cout << "[WARNING] Sync error: " << (error * 1000) << "ms, reason: " << reason << std::endl;
  52. }
  53. void onEndOfFile() override {}
  54. };
  55. int main() {
  56. // 初始化日志系统
  57. Logger::instance().setLevel(LogLevel::DEBUG);
  58. Logger::instance().info("Audio Test Started");
  59. try {
  60. // 创建同步配置
  61. SyncConfigV2 syncConfig;
  62. syncConfig.syncStrategy = SyncStrategy::ADAPTIVE;
  63. syncConfig.audioSyncThreshold = 0.040;
  64. syncConfig.videoSyncThreshold = 0.020;
  65. syncConfig.maxSyncError = 0.200;
  66. syncConfig.clockUpdateInterval = 10;
  67. syncConfig.smoothingWindow = 10;
  68. syncConfig.enableAdaptiveSync = true;
  69. syncConfig.enableFrameDrop = true;
  70. syncConfig.enableFrameDuplicate = true;
  71. syncConfig.enablePrediction = true;
  72. syncConfig.enableErrorRecovery = true;
  73. // 创建播放器实例
  74. auto player = std::make_unique<PlayerCoreV2>(syncConfig);
  75. // 创建事件回调
  76. auto callback = std::make_unique<TestPlayerCallback>();
  77. player->setEventCallback(callback.get());
  78. // 测试音频文件路径(请根据实际情况修改)
  79. std::string audioFile = "C:\\Windows\\Media\\notify.wav"; // Windows系统音频文件
  80. std::cout << "Testing with audio file: " << audioFile << std::endl;
  81. // 打开音频文件
  82. auto result = player->openFile(audioFile);
  83. if (result != ErrorCode::SUCCESS) {
  84. std::cout << "Failed to open audio file: " << static_cast<int>(result) << std::endl;
  85. // 尝试其他常见的音频文件
  86. audioFile = "C:\\Windows\\Media\\chimes.wav";
  87. std::cout << "Trying alternative file: " << audioFile << std::endl;
  88. result = player->openFile(audioFile);
  89. if (result != ErrorCode::SUCCESS) {
  90. std::cout << "Failed to open alternative audio file: " << static_cast<int>(result) << std::endl;
  91. std::cout << "Please provide a valid audio file path." << std::endl;
  92. return 1;
  93. }
  94. }
  95. std::cout << "Audio file opened successfully!" << std::endl;
  96. // 获取媒体信息
  97. auto mediaInfo = player->getMediaInfo();
  98. std::cout << "Media duration: " << (mediaInfo.duration / 1000000.0) << " seconds" << std::endl;
  99. std::cout << "Has audio: " << (mediaInfo.hasAudio ? "Yes" : "No") << std::endl;
  100. if (!mediaInfo.hasAudio) {
  101. std::cout << "No audio stream found in the file!" << std::endl;
  102. return 1;
  103. }
  104. // 设置音量为最大
  105. player->setVolume(1.0);
  106. std::cout << "Volume set to: " << player->getVolume() << std::endl;
  107. // 开始播放
  108. result = player->play();
  109. if (result != ErrorCode::SUCCESS) {
  110. std::cout << "Failed to start playback: " << static_cast<int>(result) << std::endl;
  111. return 1;
  112. }
  113. std::cout << "Playback started! You should hear audio now." << std::endl;
  114. std::cout << "Current volume: " << player->getVolume() << std::endl;
  115. // 等待播放完成
  116. double totalDuration = mediaInfo.duration / 1000000.0;
  117. std::cout << "Waiting for playback to complete (" << totalDuration << " seconds)..." << std::endl;
  118. // 监控播放状态
  119. auto startTime = std::chrono::steady_clock::now();
  120. while (true) {
  121. auto currentTime = std::chrono::steady_clock::now();
  122. auto elapsed = std::chrono::duration_cast<std::chrono::seconds>(currentTime - startTime).count();
  123. auto state = player->getState();
  124. auto currentPos = player->getCurrentTime() / 1000000.0;
  125. std::cout << "State: " << static_cast<int>(state) << ", Position: " << currentPos << "s" << std::endl;
  126. // 如果播放完成或出错,退出
  127. if (state == PlayerState::Stopped || state == PlayerState::Error) {
  128. break;
  129. }
  130. // 如果播放时间接近总时长,停止播放
  131. if (currentPos >= totalDuration - 0.1) {
  132. std::cout << "Playback completed, stopping..." << std::endl;
  133. player->stop();
  134. break;
  135. }
  136. // 超时保护
  137. if (elapsed > totalDuration + 5) {
  138. std::cout << "Timeout, stopping playback..." << std::endl;
  139. player->stop();
  140. break;
  141. }
  142. std::this_thread::sleep_for(std::chrono::milliseconds(500));
  143. }
  144. std::cout << "Audio test completed." << std::endl;
  145. } catch (const std::exception& e) {
  146. std::cerr << "Exception: " << e.what() << std::endl;
  147. return 1;
  148. } catch (...) {
  149. std::cerr << "Unknown exception occurred" << std::endl;
  150. return 1;
  151. }
  152. return 0;
  153. }