player_adapter.cpp 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354
  1. #include "player_adapter.h"
  2. #include "opengl_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::setOpenGLVideoRenderer(OpenGLVideoRenderer* renderer)
  34. {
  35. if (m_playerCore) {
  36. m_playerCore->setOpenGLVideoRenderer(renderer);
  37. m_openGLVideoRenderer = renderer;
  38. updateRendererType();
  39. // 如果OpenGL渲染器初始化完成,发送信号
  40. if (renderer && renderer->isInitialized()) {
  41. emit openGLRendererInitialized();
  42. }
  43. }
  44. }
  45. av::ErrorCode PlayerAdapter::openFile(const QString& filename)
  46. {
  47. std::string stdFilename = filename.toStdString();
  48. av::ErrorCode result = m_playerCore->openFile(stdFilename);
  49. if (result == av::ErrorCode::SUCCESS) {
  50. // 启动更新定时器
  51. startUpdateTimer();
  52. // 检查渲染器状态
  53. if (m_openGLVideoRenderer && m_openGLVideoRenderer->isInitialized()) {
  54. emit openGLRendererInitialized();
  55. }
  56. qDebug() << "File opened successfully:" << filename;
  57. qDebug() << "Current renderer type:" << m_currentRendererType;
  58. }
  59. return result;
  60. }
  61. av::ErrorCode PlayerAdapter::play()
  62. {
  63. return m_playerCore->play();
  64. }
  65. av::ErrorCode PlayerAdapter::pause()
  66. {
  67. return m_playerCore->pause();
  68. }
  69. av::ErrorCode PlayerAdapter::stop()
  70. {
  71. av::ErrorCode result = m_playerCore->stop();
  72. if (result == av::ErrorCode::SUCCESS) {
  73. // 停止更新定时器
  74. stopUpdateTimer();
  75. }
  76. return result;
  77. }
  78. av::ErrorCode PlayerAdapter::seek(qint64 timestamp)
  79. {
  80. return m_playerCore->seek(timestamp);
  81. }
  82. av::ErrorCode PlayerAdapter::setPlaybackSpeed(double speed)
  83. {
  84. av::ErrorCode result = m_playerCore->setPlaybackSpeed(speed);
  85. if (result == av::ErrorCode::SUCCESS && std::abs(m_lastPlaybackSpeed - speed) > 0.001) {
  86. m_lastPlaybackSpeed = speed;
  87. emit playbackSpeedChanged(speed);
  88. }
  89. return result;
  90. }
  91. PlayerState PlayerAdapter::getState() const
  92. {
  93. return m_playerCore->getState();
  94. }
  95. qint64 PlayerAdapter::getCurrentTime() const
  96. {
  97. return m_playerCore->getCurrentTime();
  98. }
  99. qint64 PlayerAdapter::getDuration() const
  100. {
  101. MediaInfo info = m_playerCore->getMediaInfo();
  102. return info.duration;
  103. }
  104. double PlayerAdapter::getPlaybackSpeed() const
  105. {
  106. return m_playerCore->getPlaybackSpeed();
  107. }
  108. void PlayerAdapter::setVolume(double volume)
  109. {
  110. m_playerCore->setVolume(volume);
  111. if (std::abs(m_lastVolume - volume) > 0.001) {
  112. m_lastVolume = volume;
  113. emit volumeChanged(volume);
  114. }
  115. }
  116. double PlayerAdapter::getVolume() const
  117. {
  118. return m_playerCore->getVolume();
  119. }
  120. void PlayerAdapter::setMuted(bool muted)
  121. {
  122. if (m_muted != muted) {
  123. m_muted = muted;
  124. // 如果静音,设置音量为0;否则恢复之前的音量
  125. if (muted) {
  126. m_playerCore->setVolume(0.0);
  127. } else {
  128. m_playerCore->setVolume(m_lastVolume);
  129. }
  130. emit mutedChanged(muted);
  131. }
  132. }
  133. bool PlayerAdapter::isMuted() const
  134. {
  135. return m_muted;
  136. }
  137. MediaInfo PlayerAdapter::getMediaInfo() const
  138. {
  139. return m_playerCore->getMediaInfo();
  140. }
  141. PlaybackStats PlayerAdapter::getStats() const
  142. {
  143. return m_playerCore->getStats();
  144. }
  145. AVFrame* PlayerAdapter::getNextVideoFrame()
  146. {
  147. return m_playerCore->getNextVideoFrame();
  148. }
  149. AVFrame* PlayerAdapter::getNextAudioFrame()
  150. {
  151. return m_playerCore->getNextAudioFrame();
  152. }
  153. void PlayerAdapter::releaseVideoFrame(AVFrame* frame)
  154. {
  155. m_playerCore->releaseVideoFrame(frame);
  156. }
  157. void PlayerAdapter::releaseAudioFrame(AVFrame* frame)
  158. {
  159. m_playerCore->releaseAudioFrame(frame);
  160. }
  161. void PlayerAdapter::startUpdateTimer(int intervalMs)
  162. {
  163. if (!m_updateTimer->isActive()) {
  164. m_updateTimer->start(intervalMs);
  165. qDebug() << "Update timer started with interval:" << intervalMs << "ms";
  166. }
  167. }
  168. void PlayerAdapter::stopUpdateTimer()
  169. {
  170. if (m_updateTimer->isActive()) {
  171. m_updateTimer->stop();
  172. qDebug() << "Update timer stopped";
  173. }
  174. }
  175. void PlayerAdapter::updatePlayer()
  176. {
  177. // 更新播放器核心
  178. m_playerCore->update();
  179. // 检查状态变化
  180. PlayerState currentState = m_playerCore->getState();
  181. if (currentState != m_lastState) {
  182. m_lastState = currentState;
  183. emit stateChanged(currentState);
  184. }
  185. // 检查位置和时长变化
  186. checkPositionChanged();
  187. checkDurationChanged();
  188. // 发送统计信息更新
  189. PlaybackStats stats = m_playerCore->getStats();
  190. emit statsUpdated(stats);
  191. // 检查是否有新的视频帧
  192. if (m_playerCore->getNextVideoFrame() != nullptr) {
  193. emit videoFrameAvailable();
  194. }
  195. // 检查是否有新的音频帧
  196. if (m_playerCore->getNextAudioFrame() != nullptr) {
  197. emit audioFrameAvailable();
  198. }
  199. }
  200. void PlayerAdapter::onStateChanged(PlayerState state)
  201. {
  202. // 在主线程中发送信号
  203. QMetaObject::invokeMethod(this, [this, state]() {
  204. if (state != m_lastState) {
  205. m_lastState = state;
  206. emit stateChanged(state);
  207. }
  208. }, Qt::QueuedConnection);
  209. }
  210. void PlayerAdapter::onMediaInfoChanged(const MediaInfo& info)
  211. {
  212. // 在主线程中发送信号
  213. QMetaObject::invokeMethod(this, [this, info]() {
  214. emit mediaInfoChanged(info);
  215. // 检查时长变化
  216. if (info.duration != m_lastDuration) {
  217. m_lastDuration = info.duration;
  218. emit durationChanged(info.duration);
  219. }
  220. }, Qt::QueuedConnection);
  221. }
  222. void PlayerAdapter::onPositionChanged(int64_t position)
  223. {
  224. // 在主线程中发送信号
  225. QMetaObject::invokeMethod(this, [this, position]() {
  226. if (std::abs(position - m_lastPosition) > 100000) { // 100ms阈值(微秒)
  227. m_lastPosition = position;
  228. emit positionChanged(position);
  229. }
  230. }, Qt::QueuedConnection);
  231. }
  232. void PlayerAdapter::onErrorOccurred(const std::string& error)
  233. {
  234. QString qError = toQString(error);
  235. // 在主线程中发送信号
  236. QMetaObject::invokeMethod(this, [this, qError]() {
  237. emit errorOccurred(qError);
  238. }, Qt::QueuedConnection);
  239. }
  240. void PlayerAdapter::onEndOfFile()
  241. {
  242. // 在主线程中发送信号
  243. QMetaObject::invokeMethod(this, [this]() {
  244. emit playbackFinished();
  245. stopUpdateTimer();
  246. }, Qt::QueuedConnection);
  247. }
  248. void PlayerAdapter::checkPositionChanged()
  249. {
  250. qint64 currentPosition = getCurrentTime();
  251. if (std::abs(currentPosition - m_lastPosition) > 100) { // 100ms阈值
  252. m_lastPosition = currentPosition;
  253. emit positionChanged(currentPosition);
  254. }
  255. }
  256. void PlayerAdapter::checkDurationChanged()
  257. {
  258. qint64 currentDuration = getDuration();
  259. if (currentDuration != m_lastDuration) {
  260. m_lastDuration = currentDuration;
  261. emit durationChanged(currentDuration);
  262. }
  263. }
  264. QString PlayerAdapter::toQString(const std::string& str) const
  265. {
  266. return QString::fromStdString(str);
  267. }
  268. void PlayerAdapter::updateRendererType()
  269. {
  270. QString newType = "None";
  271. if (m_openGLVideoRenderer) {
  272. newType = "OpenGL";
  273. }
  274. if (newType != m_currentRendererType) {
  275. m_currentRendererType = newType;
  276. emit rendererTypeChanged(newType);
  277. qDebug() << "Renderer type changed to:" << newType;
  278. }
  279. }
  280. // PlayerAdapterFactory 实现
  281. std::unique_ptr<PlayerAdapter> PlayerAdapterFactory::create(QObject* parent)
  282. {
  283. return std::make_unique<PlayerAdapter>(parent);
  284. }
  285. std::shared_ptr<PlayerAdapter> PlayerAdapterFactory::createShared(QObject* parent)
  286. {
  287. return std::make_shared<PlayerAdapter>(parent);
  288. }
  289. } // namespace player
  290. } // namespace av