player_core.cpp 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874
  1. #include "player_core.h"
  2. #include "../base/media_common.h"
  3. #include "../base/logger.h"
  4. #include "../base/types.h"
  5. #include "thread_manager.h"
  6. #include "../codec/codec_video_decoder.h"
  7. #include "../codec/codec_audio_decoder.h"
  8. #include <chrono>
  9. #include <thread>
  10. namespace av {
  11. namespace player {
  12. PlayerCore::PlayerCore()
  13. : m_eventCallback(nullptr)
  14. , m_formatContext(nullptr)
  15. , m_volume(1.0)
  16. , m_playbackSpeed(1.0)
  17. , m_seekTarget(-1)
  18. , m_seeking(false)
  19. , m_lastUpdateTime(0)
  20. , m_initialized(false)
  21. , m_state(PlayerState::Idle)
  22. , m_frameCount(0)
  23. {
  24. av::Logger::instance().info("PlayerCore created");
  25. try {
  26. // 初始化FFmpeg
  27. if (!initializeFFmpeg()) {
  28. av::Logger::instance().error("Failed to initialize FFmpeg");
  29. setState(PlayerState::Error);
  30. return;
  31. }
  32. // 创建队列
  33. m_packetQueue = av::utils::PacketQueueFactory::createStandardQueue(1000); // 最多1000个包
  34. if (!m_packetQueue) {
  35. av::Logger::instance().error("Failed to create packet queue");
  36. setState(PlayerState::Error);
  37. return;
  38. }
  39. m_videoFrameQueue = av::utils::FrameQueueFactory::createStandardQueue(30); // 最多30帧
  40. if (!m_videoFrameQueue) {
  41. av::Logger::instance().error("Failed to create video frame queue");
  42. setState(PlayerState::Error);
  43. return;
  44. }
  45. m_audioFrameQueue = av::utils::FrameQueueFactory::createStandardQueue(100); // 最多100帧
  46. if (!m_audioFrameQueue) {
  47. av::Logger::instance().error("Failed to create audio frame queue");
  48. setState(PlayerState::Error);
  49. return;
  50. }
  51. // 创建同步器
  52. m_synchronizer = std::make_unique<Synchronizer>();
  53. if (!m_synchronizer) {
  54. av::Logger::instance().error("Failed to create synchronizer");
  55. setState(PlayerState::Error);
  56. return;
  57. }
  58. // 创建线程管理器
  59. m_threadManager = std::make_unique<ThreadManager>();
  60. if (!m_threadManager) {
  61. av::Logger::instance().error("Failed to create thread manager");
  62. setState(PlayerState::Error);
  63. return;
  64. }
  65. // 创建解码器
  66. m_videoDecoder = std::make_unique<VideoDecoder>();
  67. if (!m_videoDecoder) {
  68. av::Logger::instance().error("Failed to create video decoder");
  69. setState(PlayerState::Error);
  70. return;
  71. }
  72. m_audioDecoder = std::make_unique<AudioDecoder>();
  73. if (!m_audioDecoder) {
  74. av::Logger::instance().error("Failed to create audio decoder");
  75. setState(PlayerState::Error);
  76. return;
  77. }
  78. // 创建音频输出设备
  79. m_audioOutput = std::make_unique<AudioOutput>();
  80. if (!m_audioOutput) {
  81. av::Logger::instance().error("Failed to create audio output");
  82. setState(PlayerState::Error);
  83. return;
  84. }
  85. m_initialized = true;
  86. av::Logger::instance().info("PlayerCore initialized successfully");
  87. } catch (const std::exception& e) {
  88. av::Logger::instance().error("Exception during PlayerCore initialization: " + std::string(e.what()));
  89. setState(PlayerState::Error);
  90. m_initialized = false;
  91. } catch (...) {
  92. av::Logger::instance().error("Unknown exception during PlayerCore initialization");
  93. setState(PlayerState::Error);
  94. m_initialized = false;
  95. }
  96. }
  97. PlayerCore::~PlayerCore()
  98. {
  99. av::Logger::instance().info("PlayerCore destroying...");
  100. stop();
  101. cleanup();
  102. av::Logger::instance().info("PlayerCore destroyed");
  103. }
  104. void PlayerCore::setEventCallback(PlayerEventCallback* callback)
  105. {
  106. std::lock_guard<std::mutex> lock(m_mutex);
  107. m_eventCallback = callback;
  108. }
  109. ErrorCode PlayerCore::openFile(const std::string& filename)
  110. {
  111. av::Logger::instance().info("Opening file: " + filename);
  112. if (!m_initialized) {
  113. av::Logger::instance().error("PlayerCore not initialized");
  114. return ErrorCode::NOT_INITIALIZED;
  115. }
  116. // 如果正在播放,先停止
  117. if (m_state != PlayerState::Idle) {
  118. stop();
  119. }
  120. setState(PlayerState::Opening);
  121. // 打开媒体文件
  122. if (!openMediaFile(filename)) {
  123. setState(PlayerState::Error);
  124. notifyError("Failed to open media file: " + filename);
  125. return ErrorCode::FILE_OPEN_FAILED;
  126. }
  127. // 设置媒体信息
  128. m_mediaInfo.filename = filename;
  129. // 设置解码器
  130. if (m_mediaInfo.hasVideo && !setupVideoDecoder()) {
  131. av::Logger::instance().error("Failed to setup video decoder");
  132. setState(PlayerState::Error);
  133. return ErrorCode::CODEC_OPEN_FAILED;
  134. }
  135. if (m_mediaInfo.hasAudio && !setupAudioDecoder()) {
  136. av::Logger::instance().error("Failed to setup audio decoder");
  137. setState(PlayerState::Error);
  138. return ErrorCode::CODEC_OPEN_FAILED;
  139. }
  140. setState(PlayerState::Stopped);
  141. // 如果已设置视频渲染器且有视频流,重新初始化渲染器
  142. if (m_mediaInfo.hasVideo) {
  143. AVStream* videoStream = m_formatContext->streams[m_mediaInfo.videoStreamIndex];
  144. double fps = m_mediaInfo.fps > 0 ? m_mediaInfo.fps : 25.0; // 使用实际帧率或默认25fps
  145. // 优先初始化OpenGL渲染器
  146. if (m_openGLVideoRenderer) {
  147. bool rendererInitResult = m_openGLVideoRenderer->initialize(
  148. videoStream->codecpar->width,
  149. videoStream->codecpar->height,
  150. static_cast<AVPixelFormat>(videoStream->codecpar->format),
  151. fps
  152. );
  153. if (!rendererInitResult) {
  154. av::Logger::instance().warning("Failed to initialize OpenGL video renderer");
  155. } else {
  156. av::Logger::instance().info("OpenGL video renderer initialized successfully with fps: " + std::to_string(fps));
  157. }
  158. } else if (m_videoRenderer) {
  159. bool rendererInitResult = m_videoRenderer->initialize(
  160. videoStream->codecpar->width,
  161. videoStream->codecpar->height,
  162. static_cast<AVPixelFormat>(videoStream->codecpar->format),
  163. fps
  164. );
  165. if (!rendererInitResult) {
  166. av::Logger::instance().warning("Failed to initialize video renderer");
  167. } else {
  168. av::Logger::instance().info("Video renderer initialized successfully with fps: " + std::to_string(fps));
  169. }
  170. }
  171. }
  172. // 通知媒体信息变化
  173. if (m_eventCallback) {
  174. m_eventCallback->onMediaInfoChanged(m_mediaInfo);
  175. }
  176. av::Logger::instance().info("File opened successfully: " + filename);
  177. return ErrorCode::SUCCESS;
  178. }
  179. ErrorCode PlayerCore::play()
  180. {
  181. av::Logger::instance().info("Starting playback");
  182. if (m_state == PlayerState::Playing) {
  183. av::Logger::instance().debug("Already playing");
  184. return ErrorCode::SUCCESS;
  185. }
  186. if (m_state != PlayerState::Stopped && m_state != PlayerState::Paused) {
  187. av::Logger::instance().error("Invalid state for play: " + std::to_string(static_cast<int>(m_state.load())));
  188. return ErrorCode::INVALID_STATE;
  189. }
  190. // 记录播放开始时间
  191. m_playStartTime = std::chrono::steady_clock::now();
  192. // 如果是从停止状态开始播放,重置基准时间
  193. if (m_state == PlayerState::Stopped) {
  194. m_baseTime = 0;
  195. }
  196. // 如果是从暂停状态恢复播放,保持之前的基准时间
  197. // 启动音频输出设备 - 在解码线程启动前启动,确保设备准备好
  198. if (m_audioOutput && m_mediaInfo.hasAudio) {
  199. if (m_state == PlayerState::Paused) {
  200. m_audioOutput->resume();
  201. } else {
  202. m_audioOutput->start();
  203. }
  204. // 给音频输出设备一点时间完全初始化
  205. std::this_thread::sleep_for(std::chrono::milliseconds(100));
  206. }
  207. // 启动读取线程
  208. if (!startReadThread()) {
  209. av::Logger::instance().error("Failed to start read thread");
  210. return ErrorCode::THREAD_ERROR;
  211. }
  212. // 启动解码线程
  213. if (!startDecodeThreads()) {
  214. av::Logger::instance().error("Failed to start decode threads");
  215. return ErrorCode::THREAD_ERROR;
  216. }
  217. setState(PlayerState::Playing);
  218. av::Logger::instance().info("Playback started");
  219. return ErrorCode::SUCCESS;
  220. }
  221. ErrorCode PlayerCore::pause()
  222. {
  223. av::Logger::instance().info("Pausing playback");
  224. if (m_state != PlayerState::Playing) {
  225. av::Logger::instance().debug("Not playing, cannot pause");
  226. return ErrorCode::INVALID_STATE;
  227. }
  228. // 记录暂停时的播放时间
  229. if (m_playStartTime.time_since_epoch().count() != 0) {
  230. auto currentTime = std::chrono::steady_clock::now();
  231. auto elapsed = std::chrono::duration_cast<std::chrono::microseconds>(
  232. currentTime - m_playStartTime).count();
  233. m_baseTime += static_cast<int64_t>(elapsed * m_playbackSpeed);
  234. m_playStartTime = std::chrono::steady_clock::time_point{};
  235. }
  236. // 暂停音频输出
  237. if (m_audioOutput) {
  238. m_audioOutput->pause();
  239. }
  240. setState(PlayerState::Paused);
  241. av::Logger::instance().info("Playback paused");
  242. return ErrorCode::SUCCESS;
  243. }
  244. ErrorCode PlayerCore::stop()
  245. {
  246. av::Logger::instance().info("Stopping playback");
  247. if (m_state == PlayerState::Idle || m_state == PlayerState::Stopped) {
  248. av::Logger::instance().debug("Already stopped");
  249. return ErrorCode::SUCCESS;
  250. }
  251. // 停止音频输出
  252. if (m_audioOutput) {
  253. m_audioOutput->stop();
  254. }
  255. // 清空视频渲染器
  256. if (m_videoRenderer) {
  257. m_videoRenderer->clear();
  258. }
  259. // 停止所有线程
  260. stopAllThreads();
  261. // 重置解码器
  262. resetDecoders();
  263. // 清空队列
  264. if (m_packetQueue) m_packetQueue->clear();
  265. if (m_videoFrameQueue) m_videoFrameQueue->clear();
  266. if (m_audioFrameQueue) m_audioFrameQueue->clear();
  267. setState(PlayerState::Stopped);
  268. av::Logger::instance().info("Playback stopped");
  269. return ErrorCode::SUCCESS;
  270. }
  271. ErrorCode PlayerCore::seek(int64_t timestamp)
  272. {
  273. av::Logger::instance().info("Seeking to: " + std::to_string(timestamp));
  274. if (m_state == PlayerState::Idle || m_state == PlayerState::Opening) {
  275. av::Logger::instance().error("Invalid state for seek");
  276. return ErrorCode::INVALID_STATE;
  277. }
  278. std::lock_guard<std::mutex> lock(m_mutex);
  279. m_seekTarget = timestamp;
  280. m_seeking = true;
  281. // 更新基准时间为跳转目标时间
  282. m_baseTime = timestamp;
  283. m_playStartTime = std::chrono::steady_clock::now();
  284. // 清空队列
  285. if (m_packetQueue) m_packetQueue->clear();
  286. if (m_videoFrameQueue) m_videoFrameQueue->clear();
  287. if (m_audioFrameQueue) m_audioFrameQueue->clear();
  288. setState(PlayerState::Seeking);
  289. av::Logger::instance().info("Seek initiated");
  290. return ErrorCode::SUCCESS;
  291. }
  292. ErrorCode PlayerCore::setPlaybackSpeed(double speed)
  293. {
  294. if (speed <= 0.0 || speed > 4.0) {
  295. av::Logger::instance().error("Invalid playback speed: " + std::to_string(speed));
  296. return ErrorCode::INVALID_PARAMS;
  297. }
  298. std::lock_guard<std::mutex> lock(m_mutex);
  299. m_playbackSpeed = speed;
  300. // 设置同步器的播放速度
  301. if (m_synchronizer) {
  302. m_synchronizer->setPlaybackSpeed(speed);
  303. }
  304. // 设置音频输出的播放速度
  305. if (m_audioOutput) {
  306. m_audioOutput->setPlaybackSpeed(speed);
  307. }
  308. av::Logger::instance().info("Playback speed set to: " + std::to_string(speed));
  309. return ErrorCode::SUCCESS;
  310. }
  311. MediaInfo PlayerCore::getMediaInfo() const
  312. {
  313. std::lock_guard<std::mutex> lock(m_mutex);
  314. return m_mediaInfo;
  315. }
  316. PlaybackStats PlayerCore::getStats() const
  317. {
  318. std::lock_guard<std::mutex> lock(m_mutex);
  319. return m_stats;
  320. }
  321. int64_t PlayerCore::getCurrentTime() const
  322. {
  323. std::lock_guard<std::mutex> lock(m_mutex);
  324. return m_stats.currentTime;
  325. }
  326. double PlayerCore::getPlaybackSpeed() const
  327. {
  328. std::lock_guard<std::mutex> lock(m_mutex);
  329. return m_playbackSpeed;
  330. }
  331. void PlayerCore::setVolume(double volume)
  332. {
  333. volume = std::max(0.0, std::min(1.0, volume));
  334. std::lock_guard<std::mutex> lock(m_mutex);
  335. m_volume = volume;
  336. // 同时设置音频输出设备的音量
  337. if (m_audioOutput) {
  338. m_audioOutput->setVolume(volume);
  339. }
  340. av::Logger::instance().debug("Volume set to: " + std::to_string(volume));
  341. }
  342. AVFrame* PlayerCore::getNextVideoFrame()
  343. {
  344. if (m_videoFrameQueue) {
  345. return m_videoFrameQueue->dequeueFrame(1);
  346. }
  347. return nullptr;
  348. }
  349. AVFrame* PlayerCore::getNextAudioFrame()
  350. {
  351. if (m_audioFrameQueue) {
  352. return m_audioFrameQueue->dequeueFrame(1);
  353. }
  354. return nullptr;
  355. }
  356. void PlayerCore::releaseVideoFrame(AVFrame* frame)
  357. {
  358. if (frame) {
  359. av_frame_free(&frame);
  360. }
  361. }
  362. void PlayerCore::releaseAudioFrame(AVFrame* frame)
  363. {
  364. if (frame) {
  365. av_frame_free(&frame);
  366. }
  367. }
  368. void PlayerCore::update()
  369. {
  370. // 更新统计信息
  371. updateStats();
  372. // 处理跳转
  373. if (m_seeking.load()) {
  374. // 跳转逻辑
  375. // TODO: 实现跳转处理
  376. m_seeking = false;
  377. setState(PlayerState::Playing);
  378. }
  379. // 检查是否播放结束
  380. if (m_state == PlayerState::Playing) {
  381. // TODO: 检查EOF条件
  382. }
  383. }
  384. bool PlayerCore::initializeFFmpeg()
  385. {
  386. static bool initialized = false;
  387. if (!initialized) {
  388. av_log_set_level(AV_LOG_INFO);
  389. initialized = true;
  390. av::Logger::instance().info("FFmpeg initialized");
  391. }
  392. return true;
  393. }
  394. void PlayerCore::cleanup()
  395. {
  396. stopAllThreads();
  397. closeMediaFile();
  398. resetDecoders();
  399. }
  400. bool PlayerCore::openMediaFile(const std::string& filename)
  401. {
  402. // 打开输入文件
  403. int ret = avformat_open_input(&m_formatContext, filename.c_str(), nullptr, nullptr);
  404. if (ret < 0) {
  405. av::Logger::instance().error("Could not open input file: " + filename);
  406. return false;
  407. }
  408. // 查找流信息
  409. ret = avformat_find_stream_info(m_formatContext, nullptr);
  410. if (ret < 0) {
  411. av::Logger::instance().error("Could not find stream information");
  412. return false;
  413. }
  414. // 分析流信息
  415. m_mediaInfo.duration = m_formatContext->duration;
  416. for (unsigned int i = 0; i < m_formatContext->nb_streams; i++) {
  417. AVStream* stream = m_formatContext->streams[i];
  418. AVCodecParameters* codecpar = stream->codecpar;
  419. if (codecpar->codec_type == AVMEDIA_TYPE_VIDEO && m_mediaInfo.videoStreamIndex == -1) {
  420. m_mediaInfo.videoStreamIndex = i;
  421. m_mediaInfo.hasVideo = true;
  422. m_mediaInfo.width = codecpar->width;
  423. m_mediaInfo.height = codecpar->height;
  424. m_mediaInfo.fps = av_q2d(stream->avg_frame_rate);
  425. }
  426. else if (codecpar->codec_type == AVMEDIA_TYPE_AUDIO && m_mediaInfo.audioStreamIndex == -1) {
  427. m_mediaInfo.audioStreamIndex = i;
  428. m_mediaInfo.hasAudio = true;
  429. m_mediaInfo.audioSampleRate = codecpar->sample_rate;
  430. m_mediaInfo.audioChannels = codecpar->ch_layout.nb_channels;
  431. }
  432. else if (codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE && m_mediaInfo.subtitleStreamIndex == -1) {
  433. m_mediaInfo.subtitleStreamIndex = i;
  434. m_mediaInfo.hasSubtitle = true;
  435. }
  436. }
  437. av::Logger::instance().info("Media file opened successfully");
  438. av::Logger::instance().info("Duration: " + std::to_string(m_mediaInfo.duration));
  439. av::Logger::instance().info("Has video: " + std::to_string(m_mediaInfo.hasVideo));
  440. av::Logger::instance().info("Has audio: " + std::to_string(m_mediaInfo.hasAudio));
  441. return true;
  442. }
  443. void PlayerCore::closeMediaFile()
  444. {
  445. if (m_formatContext) {
  446. avformat_close_input(&m_formatContext);
  447. m_formatContext = nullptr;
  448. av::Logger::instance().info("Media file closed");
  449. }
  450. }
  451. bool PlayerCore::startReadThread()
  452. {
  453. if (!m_threadManager) {
  454. m_threadManager = std::make_unique<ThreadManager>();
  455. }
  456. return m_threadManager->createReadThread(
  457. m_formatContext,
  458. m_packetQueue.get(),
  459. m_mediaInfo.videoStreamIndex,
  460. m_mediaInfo.audioStreamIndex
  461. );
  462. }
  463. bool PlayerCore::startDecodeThreads()
  464. {
  465. if (!m_threadManager) {
  466. m_threadManager = std::make_unique<ThreadManager>();
  467. }
  468. bool success = true;
  469. if (m_mediaInfo.hasVideo) {
  470. AVStream* videoStream = m_formatContext->streams[m_mediaInfo.videoStreamIndex];
  471. success &= m_threadManager->createVideoDecodeThread(
  472. m_packetQueue.get(),
  473. m_videoFrameQueue.get(),
  474. m_videoDecoder.get(),
  475. m_synchronizer.get(),
  476. m_mediaInfo.videoStreamIndex,
  477. videoStream->codecpar,
  478. videoStream->time_base
  479. );
  480. // 设置视频帧输出回调
  481. if (success && m_threadManager->getVideoDecodeThread()) {
  482. m_threadManager->getVideoDecodeThread()->setFrameOutputCallback(
  483. [this](const AVFramePtr& frame) {
  484. if (frame && m_state == PlayerState::Playing) {
  485. // 优先使用OpenGL渲染器
  486. if (m_openGLVideoRenderer) {
  487. m_openGLVideoRenderer->renderFrame(frame);
  488. } else if (m_videoRenderer) {
  489. m_videoRenderer->renderFrame(frame);
  490. }
  491. }
  492. }
  493. );
  494. }
  495. }
  496. if (m_mediaInfo.hasAudio) {
  497. AVStream* audioStream = m_formatContext->streams[m_mediaInfo.audioStreamIndex];
  498. success &= m_threadManager->createAudioDecodeThread(
  499. m_packetQueue.get(),
  500. m_audioFrameQueue.get(),
  501. m_audioDecoder.get(),
  502. m_synchronizer.get(),
  503. m_mediaInfo.audioStreamIndex,
  504. audioStream->time_base
  505. );
  506. // 设置音频帧输出回调
  507. if (success && m_threadManager->getAudioDecodeThread()) {
  508. m_threadManager->getAudioDecodeThread()->setFrameOutputCallback(
  509. [this](const AVFramePtr& frame) {
  510. if (m_audioOutput && frame && m_state == PlayerState::Playing) {
  511. m_audioOutput->writeFrame(frame);
  512. }
  513. }
  514. );
  515. }
  516. }
  517. if (success) {
  518. success = m_threadManager->startAll();
  519. }
  520. return success;
  521. }
  522. void PlayerCore::stopAllThreads()
  523. {
  524. if (m_threadManager) {
  525. m_threadManager->stopAll();
  526. m_threadManager.reset();
  527. }
  528. av::Logger::instance().info("All threads stopped");
  529. }
  530. void PlayerCore::readThreadFunc()
  531. {
  532. // 读取线程实现
  533. while (m_state != PlayerState::Stopped && m_state != PlayerState::Error) {
  534. if (m_state == PlayerState::Paused) {
  535. std::this_thread::sleep_for(std::chrono::milliseconds(10));
  536. continue;
  537. }
  538. AVPacket* packet = av_packet_alloc();
  539. if (!packet) {
  540. break;
  541. }
  542. int ret = av_read_frame(m_formatContext, packet);
  543. if (ret < 0) {
  544. av_packet_free(&packet);
  545. if (ret == AVERROR_EOF) {
  546. // 文件结束
  547. if (m_eventCallback) {
  548. m_eventCallback->onEndOfFile();
  549. }
  550. }
  551. break;
  552. }
  553. // 将数据包放入队列
  554. if (m_packetQueue) {
  555. if (m_packetQueue->enqueue(packet) != av::ErrorCode::SUCCESS) {
  556. av_packet_free(&packet);
  557. }
  558. } else {
  559. av_packet_free(&packet);
  560. }
  561. }
  562. }
  563. bool PlayerCore::setupVideoDecoder()
  564. {
  565. if (!m_mediaInfo.hasVideo) {
  566. return true;
  567. }
  568. AVStream* videoStream = m_formatContext->streams[m_mediaInfo.videoStreamIndex];
  569. const AVCodec* codec = avcodec_find_decoder(videoStream->codecpar->codec_id);
  570. if (!codec) {
  571. av::Logger::instance().error("Video codec not found");
  572. return false;
  573. }
  574. // 创建视频解码器
  575. m_videoDecoder = std::make_unique<VideoDecoder>();
  576. av::codec::VideoDecoderParams params;
  577. params.codecName = codec->name;
  578. params.width = videoStream->codecpar->width;
  579. params.height = videoStream->codecpar->height;
  580. params.pixelFormat = static_cast<AVPixelFormat>(videoStream->codecpar->format);
  581. params.hardwareAccel = false; // 默认软件解码
  582. params.threadCount = 4;
  583. ErrorCode result = m_videoDecoder->open(params);
  584. if (result != ErrorCode::SUCCESS) {
  585. av::Logger::instance().error("Failed to open video decoder");
  586. return false;
  587. }
  588. av::Logger::instance().info("Video decoder setup successfully");
  589. return true;
  590. }
  591. bool PlayerCore::setupAudioDecoder()
  592. {
  593. if (!m_mediaInfo.hasAudio) {
  594. return true;
  595. }
  596. AVStream* audioStream = m_formatContext->streams[m_mediaInfo.audioStreamIndex];
  597. const AVCodec* codec = avcodec_find_decoder(audioStream->codecpar->codec_id);
  598. if (!codec) {
  599. av::Logger::instance().error("Audio codec not found");
  600. return false;
  601. }
  602. // 创建音频解码器
  603. m_audioDecoder = std::make_unique<AudioDecoder>();
  604. av::codec::AudioDecoderParams params;
  605. params.codecName = codec->name;
  606. params.sampleRate = audioStream->codecpar->sample_rate;
  607. params.channels = audioStream->codecpar->ch_layout.nb_channels;
  608. params.sampleFormat = static_cast<AVSampleFormat>(audioStream->codecpar->format);
  609. params.enableResampling = true;
  610. ErrorCode result = m_audioDecoder->open(params);
  611. if (result != ErrorCode::SUCCESS) {
  612. av::Logger::instance().error("Failed to open audio decoder");
  613. return false;
  614. }
  615. // 初始化音频输出设备
  616. if (m_audioOutput) {
  617. bool audioInitResult = m_audioOutput->initialize(
  618. audioStream->codecpar->sample_rate,
  619. audioStream->codecpar->ch_layout.nb_channels,
  620. static_cast<AVSampleFormat>(audioStream->codecpar->format)
  621. );
  622. if (!audioInitResult) {
  623. av::Logger::instance().error("Failed to initialize audio output");
  624. return false;
  625. }
  626. }
  627. av::Logger::instance().info("Audio decoder setup successfully");
  628. return true;
  629. }
  630. void PlayerCore::resetDecoders()
  631. {
  632. if (m_videoDecoder) {
  633. m_videoDecoder->close();
  634. m_videoDecoder.reset();
  635. }
  636. if (m_audioDecoder) {
  637. m_audioDecoder->close();
  638. m_audioDecoder.reset();
  639. }
  640. av::Logger::instance().info("Decoders reset");
  641. }
  642. void PlayerCore::updateSynchronization()
  643. {
  644. // TODO: 实现同步逻辑
  645. }
  646. int64_t PlayerCore::getCurrentPlayTime()
  647. {
  648. if (m_state == PlayerState::Idle || m_state == PlayerState::Stopped) {
  649. return 0;
  650. }
  651. // 使用系统时间计算播放时间
  652. auto currentTime = std::chrono::steady_clock::now();
  653. if (m_playStartTime.time_since_epoch().count() == 0) {
  654. return 0;
  655. }
  656. auto elapsed = std::chrono::duration_cast<std::chrono::microseconds>(
  657. currentTime - m_playStartTime).count();
  658. // 考虑播放速度
  659. elapsed = static_cast<int64_t>(elapsed * m_playbackSpeed);
  660. return m_baseTime + elapsed;
  661. }
  662. void PlayerCore::setState(PlayerState newState)
  663. {
  664. PlayerState oldState = m_state.exchange(newState);
  665. if (oldState != newState) {
  666. av::Logger::instance().debug("State changed: " + std::to_string(static_cast<int>(oldState)) +
  667. " -> " + std::to_string(static_cast<int>(newState)));
  668. notifyStateChanged(newState);
  669. }
  670. }
  671. void PlayerCore::updateStats()
  672. {
  673. std::lock_guard<std::mutex> lock(m_mutex);
  674. // 更新队列统计
  675. if (m_packetQueue) {
  676. m_stats.queuedPackets = m_packetQueue->size();
  677. }
  678. if (m_videoFrameQueue) {
  679. m_stats.queuedVideoFrames = m_videoFrameQueue->size();
  680. }
  681. if (m_audioFrameQueue) {
  682. m_stats.queuedAudioFrames = m_audioFrameQueue->size();
  683. }
  684. m_stats.playbackSpeed = m_playbackSpeed;
  685. m_stats.currentTime = getCurrentPlayTime();
  686. }
  687. void PlayerCore::notifyStateChanged(PlayerState newState)
  688. {
  689. if (m_eventCallback) {
  690. m_eventCallback->onStateChanged(newState);
  691. }
  692. }
  693. void PlayerCore::notifyError(const std::string& error)
  694. {
  695. if (m_eventCallback) {
  696. m_eventCallback->onErrorOccurred(error);
  697. }
  698. }
  699. void PlayerCore::setVideoRenderer(VideoRenderer* renderer)
  700. {
  701. std::lock_guard<std::mutex> lock(m_mutex);
  702. m_videoRenderer = renderer;
  703. // 如果已有媒体信息且视频渲染器可用,初始化渲染器
  704. if (m_videoRenderer && m_mediaInfo.hasVideo) {
  705. AVStream* videoStream = m_formatContext->streams[m_mediaInfo.videoStreamIndex];
  706. double fps = m_mediaInfo.fps > 0 ? m_mediaInfo.fps : 25.0; // 使用实际帧率或默认25fps
  707. m_videoRenderer->initialize(
  708. videoStream->codecpar->width,
  709. videoStream->codecpar->height,
  710. static_cast<AVPixelFormat>(videoStream->codecpar->format),
  711. fps
  712. );
  713. }
  714. av::Logger::instance().info("Video renderer set");
  715. }
  716. void PlayerCore::setOpenGLVideoRenderer(OpenGLVideoRenderer* renderer)
  717. {
  718. std::lock_guard<std::mutex> lock(m_mutex);
  719. m_openGLVideoRenderer = renderer;
  720. // 如果已有媒体信息且OpenGL视频渲染器可用,初始化渲染器
  721. if (m_openGLVideoRenderer && m_mediaInfo.hasVideo) {
  722. AVStream* videoStream = m_formatContext->streams[m_mediaInfo.videoStreamIndex];
  723. double fps = m_mediaInfo.fps > 0 ? m_mediaInfo.fps : 25.0; // 使用实际帧率或默认25fps
  724. m_openGLVideoRenderer->initialize(
  725. videoStream->codecpar->width,
  726. videoStream->codecpar->height,
  727. static_cast<AVPixelFormat>(videoStream->codecpar->format),
  728. fps
  729. );
  730. }
  731. av::Logger::instance().info("OpenGL video renderer set");
  732. }
  733. } // namespace player
  734. } // namespace av