player_adapter.cpp 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325
  1. #include "player_adapter.h"
  2. #include "video_renderer.h"
  3. #include "../base/media_common.h"
  4. #include <QDebug>
  5. #include <QMetaType>
  6. namespace av {
  7. namespace player {
  8. // 注册Qt元类型
  9. static int registerMetaTypes() {
  10. qRegisterMetaType<PlayerState>("PlayerState");
  11. qRegisterMetaType<MediaInfo>("MediaInfo");
  12. qRegisterMetaType<PlaybackStats>("PlaybackStats");
  13. qRegisterMetaType<av::ErrorCode>("av::ErrorCode");
  14. return 0;
  15. }
  16. static int dummy = registerMetaTypes();
  17. PlayerAdapter::PlayerAdapter(QObject* parent)
  18. : QObject(parent)
  19. , m_playerCore(std::make_unique<PlayerCore>())
  20. , m_updateTimer(new QTimer(this))
  21. {
  22. // 设置事件回调
  23. m_playerCore->setEventCallback(this);
  24. // 连接更新定时器
  25. connect(m_updateTimer, &QTimer::timeout, this, &PlayerAdapter::updatePlayer);
  26. qDebug() << "PlayerAdapter created";
  27. }
  28. PlayerAdapter::~PlayerAdapter()
  29. {
  30. stopUpdateTimer();
  31. qDebug() << "PlayerAdapter destroyed";
  32. }
  33. void PlayerAdapter::setVideoRenderer(VideoRenderer* renderer)
  34. {
  35. if (m_playerCore) {
  36. m_playerCore->setVideoRenderer(renderer);
  37. }
  38. }
  39. av::ErrorCode PlayerAdapter::openFile(const QString& filename)
  40. {
  41. std::string stdFilename = filename.toStdString();
  42. av::ErrorCode result = m_playerCore->openFile(stdFilename);
  43. if (result == av::ErrorCode::SUCCESS) {
  44. // 启动更新定时器
  45. startUpdateTimer();
  46. }
  47. return result;
  48. }
  49. av::ErrorCode PlayerAdapter::play()
  50. {
  51. return m_playerCore->play();
  52. }
  53. av::ErrorCode PlayerAdapter::pause()
  54. {
  55. return m_playerCore->pause();
  56. }
  57. av::ErrorCode PlayerAdapter::stop()
  58. {
  59. av::ErrorCode result = m_playerCore->stop();
  60. if (result == av::ErrorCode::SUCCESS) {
  61. // 停止更新定时器
  62. stopUpdateTimer();
  63. }
  64. return result;
  65. }
  66. av::ErrorCode PlayerAdapter::seek(qint64 timestamp)
  67. {
  68. return m_playerCore->seek(timestamp);
  69. }
  70. av::ErrorCode PlayerAdapter::setPlaybackSpeed(double speed)
  71. {
  72. av::ErrorCode result = m_playerCore->setPlaybackSpeed(speed);
  73. if (result == av::ErrorCode::SUCCESS && std::abs(m_lastPlaybackSpeed - speed) > 0.001) {
  74. m_lastPlaybackSpeed = speed;
  75. emit playbackSpeedChanged(speed);
  76. }
  77. return result;
  78. }
  79. PlayerState PlayerAdapter::getState() const
  80. {
  81. return m_playerCore->getState();
  82. }
  83. qint64 PlayerAdapter::getCurrentTime() const
  84. {
  85. return m_playerCore->getCurrentTime();
  86. }
  87. qint64 PlayerAdapter::getDuration() const
  88. {
  89. MediaInfo info = m_playerCore->getMediaInfo();
  90. return info.duration;
  91. }
  92. double PlayerAdapter::getPlaybackSpeed() const
  93. {
  94. return m_playerCore->getPlaybackSpeed();
  95. }
  96. void PlayerAdapter::setVolume(double volume)
  97. {
  98. m_playerCore->setVolume(volume);
  99. if (std::abs(m_lastVolume - volume) > 0.001) {
  100. m_lastVolume = volume;
  101. emit volumeChanged(volume);
  102. }
  103. }
  104. double PlayerAdapter::getVolume() const
  105. {
  106. return m_playerCore->getVolume();
  107. }
  108. void PlayerAdapter::setMuted(bool muted)
  109. {
  110. if (m_muted != muted) {
  111. m_muted = muted;
  112. // 如果静音,设置音量为0;否则恢复之前的音量
  113. if (muted) {
  114. m_playerCore->setVolume(0.0);
  115. } else {
  116. m_playerCore->setVolume(m_lastVolume);
  117. }
  118. emit mutedChanged(muted);
  119. }
  120. }
  121. bool PlayerAdapter::isMuted() const
  122. {
  123. return m_muted;
  124. }
  125. MediaInfo PlayerAdapter::getMediaInfo() const
  126. {
  127. return m_playerCore->getMediaInfo();
  128. }
  129. PlaybackStats PlayerAdapter::getStats() const
  130. {
  131. return m_playerCore->getStats();
  132. }
  133. AVFrame* PlayerAdapter::getNextVideoFrame()
  134. {
  135. return m_playerCore->getNextVideoFrame();
  136. }
  137. AVFrame* PlayerAdapter::getNextAudioFrame()
  138. {
  139. return m_playerCore->getNextAudioFrame();
  140. }
  141. void PlayerAdapter::releaseVideoFrame(AVFrame* frame)
  142. {
  143. m_playerCore->releaseVideoFrame(frame);
  144. }
  145. void PlayerAdapter::releaseAudioFrame(AVFrame* frame)
  146. {
  147. m_playerCore->releaseAudioFrame(frame);
  148. }
  149. void PlayerAdapter::startUpdateTimer(int intervalMs)
  150. {
  151. if (!m_updateTimer->isActive()) {
  152. m_updateTimer->start(intervalMs);
  153. qDebug() << "Update timer started with interval:" << intervalMs << "ms";
  154. }
  155. }
  156. void PlayerAdapter::stopUpdateTimer()
  157. {
  158. if (m_updateTimer->isActive()) {
  159. m_updateTimer->stop();
  160. qDebug() << "Update timer stopped";
  161. }
  162. }
  163. void PlayerAdapter::updatePlayer()
  164. {
  165. // 更新播放器核心
  166. m_playerCore->update();
  167. // 检查状态变化
  168. PlayerState currentState = m_playerCore->getState();
  169. if (currentState != m_lastState) {
  170. m_lastState = currentState;
  171. emit stateChanged(currentState);
  172. }
  173. // 检查位置和时长变化
  174. checkPositionChanged();
  175. checkDurationChanged();
  176. // 发送统计信息更新
  177. PlaybackStats stats = m_playerCore->getStats();
  178. emit statsUpdated(stats);
  179. // 检查是否有新的视频帧
  180. if (m_playerCore->getNextVideoFrame() != nullptr) {
  181. emit videoFrameAvailable();
  182. }
  183. // 检查是否有新的音频帧
  184. if (m_playerCore->getNextAudioFrame() != nullptr) {
  185. emit audioFrameAvailable();
  186. }
  187. }
  188. void PlayerAdapter::onStateChanged(PlayerState state)
  189. {
  190. // 在主线程中发送信号
  191. QMetaObject::invokeMethod(this, [this, state]() {
  192. if (state != m_lastState) {
  193. m_lastState = state;
  194. emit stateChanged(state);
  195. }
  196. }, Qt::QueuedConnection);
  197. }
  198. void PlayerAdapter::onMediaInfoChanged(const MediaInfo& info)
  199. {
  200. // 在主线程中发送信号
  201. QMetaObject::invokeMethod(this, [this, info]() {
  202. emit mediaInfoChanged(info);
  203. // 检查时长变化
  204. if (info.duration != m_lastDuration) {
  205. m_lastDuration = info.duration;
  206. emit durationChanged(info.duration);
  207. }
  208. }, Qt::QueuedConnection);
  209. }
  210. void PlayerAdapter::onPositionChanged(int64_t position)
  211. {
  212. // 在主线程中发送信号
  213. QMetaObject::invokeMethod(this, [this, position]() {
  214. if (std::abs(position - m_lastPosition) > 100000) { // 100ms阈值(微秒)
  215. m_lastPosition = position;
  216. emit positionChanged(position);
  217. }
  218. }, Qt::QueuedConnection);
  219. }
  220. void PlayerAdapter::onErrorOccurred(const std::string& error)
  221. {
  222. QString qError = toQString(error);
  223. // 在主线程中发送信号
  224. QMetaObject::invokeMethod(this, [this, qError]() {
  225. emit errorOccurred(qError);
  226. }, Qt::QueuedConnection);
  227. }
  228. void PlayerAdapter::onEndOfFile()
  229. {
  230. // 在主线程中发送信号
  231. QMetaObject::invokeMethod(this, [this]() {
  232. emit playbackFinished();
  233. stopUpdateTimer();
  234. }, Qt::QueuedConnection);
  235. }
  236. void PlayerAdapter::checkPositionChanged()
  237. {
  238. qint64 currentPosition = getCurrentTime();
  239. if (std::abs(currentPosition - m_lastPosition) > 100) { // 100ms阈值
  240. m_lastPosition = currentPosition;
  241. emit positionChanged(currentPosition);
  242. }
  243. }
  244. void PlayerAdapter::checkDurationChanged()
  245. {
  246. qint64 currentDuration = getDuration();
  247. if (currentDuration != m_lastDuration) {
  248. m_lastDuration = currentDuration;
  249. emit durationChanged(currentDuration);
  250. }
  251. }
  252. QString PlayerAdapter::toQString(const std::string& str) const
  253. {
  254. return QString::fromStdString(str);
  255. }
  256. // PlayerAdapterFactory 实现
  257. std::unique_ptr<PlayerAdapter> PlayerAdapterFactory::create(QObject* parent)
  258. {
  259. return std::make_unique<PlayerAdapter>(parent);
  260. }
  261. std::shared_ptr<PlayerAdapter> PlayerAdapterFactory::createShared(QObject* parent)
  262. {
  263. return std::make_shared<PlayerAdapter>(parent);
  264. }
  265. } // namespace player
  266. } // namespace av
  267. #include "player_adapter.moc"