player_adapter.cpp 8.7 KB

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