test_codec.cpp 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. // 编解码测试程序
  2. #include "code/base/logger.h"
  3. #include "code/codec/codec_video_encoder.h"
  4. #include "code/codec/codec_audio_encoder.h"
  5. #include <iostream>
  6. #include <chrono>
  7. #include <thread>
  8. using namespace av;
  9. using namespace av::codec;
  10. int main() {
  11. AV_LOGGER_INFO("=== AV编解码测试 ===");
  12. // 初始化日志系统
  13. Logger::initialize("codec_test_log.txt", LogLevel::DEBUG, false, true);
  14. // 初始化FFmpeg
  15. ffmpeg_utils::initializeFFmpeg();
  16. try {
  17. // 1. 测试视频编码器支持
  18. AV_LOGGER_INFO("1. 测试视频编码器支持...");
  19. auto videoEncoders = VideoEncoder::getSupportedEncoders();
  20. AV_LOGGER_INFOF("支持的视频编码器数量: {}", videoEncoders.size());
  21. for (const auto& encoder : videoEncoders) {
  22. AV_LOGGER_INFOF(" - {} (硬件: {})", encoder,
  23. VideoEncoder::isHardwareEncoder(encoder) ? "是" : "否");
  24. }
  25. std::string recommendedVideo = VideoEncoder::getRecommendedEncoder();
  26. AV_LOGGER_INFOF("推荐的视频编码器: {}", recommendedVideo);
  27. // 2. 测试音频编码器支持
  28. AV_LOGGER_INFO("2. 测试音频编码器支持...");
  29. auto audioEncoders = AudioEncoder::getSupportedEncoders();
  30. AV_LOGGER_INFOF("支持的音频编码器数量: {}", audioEncoders.size());
  31. for (const auto& encoder : audioEncoders) {
  32. AV_LOGGER_INFOF(" - {}", encoder);
  33. }
  34. std::string recommendedAudio = AudioEncoder::getRecommendedEncoder();
  35. AV_LOGGER_INFOF("推荐的音频编码器: {}", recommendedAudio);
  36. // 3. 测试视频编码器创建和配置
  37. AV_LOGGER_INFO("3. 测试视频编码器创建...");
  38. if (!recommendedVideo.empty()) {
  39. auto videoEncoder = VideoEncoderFactory::create(recommendedVideo);
  40. if (videoEncoder) {
  41. AV_LOGGER_INFO("视频编码器创建成功");
  42. // 配置编码器参数
  43. VideoEncoderParams videoParams;
  44. videoParams.codecName = recommendedVideo;
  45. videoParams.width = 1280;
  46. videoParams.height = 720;
  47. videoParams.fps = 30;
  48. videoParams.bitRate = 2000000;
  49. videoParams.lowLatency = true;
  50. videoParams.hardwareAccel = true; // 启用硬件加速
  51. AVResult result = videoEncoder->open(videoParams);
  52. if (result == AVResult::OK) {
  53. AV_LOGGER_INFO("视频编码器打开成功");
  54. // 测试编码器状态
  55. AV_LOGGER_INFOF("编码器状态: {}", static_cast<int>(videoEncoder->getState()));
  56. AV_LOGGER_INFOF("是否已打开: {}", videoEncoder->isOpened() ? "是" : "否");
  57. videoEncoder->close();
  58. AV_LOGGER_INFO("视频编码器已关闭");
  59. } else {
  60. AV_LOGGER_ERRORF("硬件视频编码器打开失败: {}", static_cast<int>(result));
  61. // 尝试软件编码器
  62. AV_LOGGER_INFO("尝试使用软件编码器...");
  63. videoParams.hardwareAccel = false;
  64. videoParams.codecName = "libx264";
  65. auto softwareEncoder = VideoEncoderFactory::create("libx264");
  66. if (softwareEncoder) {
  67. AVResult softResult = softwareEncoder->open(videoParams);
  68. if (softResult == AVResult::OK) {
  69. AV_LOGGER_INFO("软件视频编码器打开成功");
  70. softwareEncoder->close();
  71. AV_LOGGER_INFO("软件视频编码器已关闭");
  72. } else {
  73. AV_LOGGER_ERRORF("软件视频编码器打开失败: {}", static_cast<int>(softResult));
  74. }
  75. }
  76. }
  77. } else {
  78. AV_LOGGER_ERROR("视频编码器创建失败");
  79. }
  80. } else {
  81. AV_LOGGER_WARNING("没有可用的视频编码器");
  82. }
  83. // 4. 测试音频编码器创建和配置
  84. AV_LOGGER_INFO("4. 测试音频编码器创建...");
  85. if (!recommendedAudio.empty()) {
  86. auto audioEncoder = AudioEncoderFactory::create(recommendedAudio);
  87. if (audioEncoder) {
  88. AV_LOGGER_INFO("音频编码器创建成功");
  89. // 配置编码器参数
  90. AudioEncoderParams audioParams;
  91. audioParams.codecName = recommendedAudio;
  92. audioParams.sampleRate = 44100;
  93. audioParams.channels = 2;
  94. audioParams.bitRate = 128000;
  95. av_channel_layout_default(&audioParams.channelLayout, 2);
  96. AVResult result = audioEncoder->open(audioParams);
  97. if (result == AVResult::OK) {
  98. AV_LOGGER_INFO("音频编码器打开成功");
  99. // 测试编码器状态
  100. AV_LOGGER_INFOF("编码器状态: {}", static_cast<int>(audioEncoder->getState()));
  101. AV_LOGGER_INFOF("是否已打开: {}", audioEncoder->isOpened() ? "是" : "否");
  102. audioEncoder->close();
  103. AV_LOGGER_INFO("音频编码器已关闭");
  104. } else {
  105. AV_LOGGER_ERRORF("音频编码器打开失败: {}", static_cast<int>(result));
  106. }
  107. } else {
  108. AV_LOGGER_ERROR("音频编码器创建失败");
  109. }
  110. } else {
  111. AV_LOGGER_WARNING("没有可用的音频编码器");
  112. }
  113. // 5. 测试编码器工厂
  114. AV_LOGGER_INFO("5. 测试编码器工厂...");
  115. // 测试最佳视频编码器
  116. auto bestVideoEncoder = VideoEncoderFactory::createBest(true);
  117. if (bestVideoEncoder) {
  118. AV_LOGGER_INFO("最佳视频编码器创建成功(硬件优先)");
  119. }
  120. auto softwareVideoEncoder = VideoEncoderFactory::createBest(false);
  121. if (softwareVideoEncoder) {
  122. AV_LOGGER_INFO("最佳视频编码器创建成功(软件优先)");
  123. }
  124. // 测试最佳音频编码器
  125. auto bestAudioEncoder = AudioEncoderFactory::createBest();
  126. if (bestAudioEncoder) {
  127. AV_LOGGER_INFO("最佳音频编码器创建成功");
  128. }
  129. // 测试无损音频编码器
  130. auto losslessAudioEncoder = AudioEncoderFactory::createLossless();
  131. if (losslessAudioEncoder) {
  132. AV_LOGGER_INFO("无损音频编码器创建成功");
  133. }
  134. // 6. 测试编码器能力查询
  135. AV_LOGGER_INFO("6. 测试编码器能力查询...");
  136. // 测试音频编码器能力
  137. if (!recommendedAudio.empty()) {
  138. bool supportsFLTP = AudioEncoder::isSampleFormatSupported(recommendedAudio, AV_SAMPLE_FMT_FLTP);
  139. bool supports44100 = AudioEncoder::isSampleRateSupported(recommendedAudio, 44100);
  140. AVChannelLayout stereoLayout = AV_CHANNEL_LAYOUT_STEREO;
  141. bool supportsStereo = AudioEncoder::isChannelLayoutSupported(recommendedAudio, stereoLayout);
  142. AV_LOGGER_INFOF("编码器 {} 支持:", recommendedAudio);
  143. AV_LOGGER_INFOF(" - FLTP格式: {}", supportsFLTP ? "是" : "否");
  144. AV_LOGGER_INFOF(" - 44100Hz: {}", supports44100 ? "是" : "否");
  145. AV_LOGGER_INFOF(" - 立体声: {}", supportsStereo ? "是" : "否");
  146. }
  147. // 7. 测试编码器统计信息
  148. AV_LOGGER_INFO("7. 测试编码器统计信息...");
  149. if (!recommendedVideo.empty()) {
  150. auto encoder = VideoEncoderFactory::create(recommendedVideo);
  151. if (encoder) {
  152. const auto& stats = encoder->getStatistics();
  153. AV_LOGGER_INFOF("编码器统计信息:");
  154. AV_LOGGER_INFOF(" - 处理帧数: {}", stats.processedFrames);
  155. AV_LOGGER_INFOF(" - 丢弃帧数: {}", stats.droppedFrames);
  156. AV_LOGGER_INFOF(" - 错误次数: {}", stats.errorCount);
  157. AV_LOGGER_INFOF(" - 平均处理时间: {:.2f}ms", stats.avgProcessTime);
  158. AV_LOGGER_INFOF(" - 总字节数: {}", stats.totalBytes);
  159. }
  160. }
  161. AV_LOGGER_INFO("=== 所有编解码测试完成 ===");
  162. AV_LOGGER_INFO("测试完成,请查看 codec_test_log.txt 文件");
  163. } catch (const std::exception& e) {
  164. AV_LOGGER_ERRORF("测试过程中发生异常: {}", e.what());
  165. AV_LOGGER_ERRORF("测试失败: {}", e.what());
  166. return 1;
  167. }
  168. // 清理FFmpeg
  169. ffmpeg_utils::cleanupFFmpeg();
  170. return 0;
  171. }