| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325 |
- #include "player_adapter.h"
- #include "video_renderer.h"
- #include "../base/media_common.h"
- #include <QDebug>
- #include <QMetaType>
- namespace av {
- namespace player {
- // 注册Qt元类型
- static int registerMetaTypes() {
- qRegisterMetaType<PlayerState>("PlayerState");
- qRegisterMetaType<MediaInfo>("MediaInfo");
- qRegisterMetaType<PlaybackStats>("PlaybackStats");
- qRegisterMetaType<av::ErrorCode>("av::ErrorCode");
- return 0;
- }
- static int dummy = registerMetaTypes();
- PlayerAdapter::PlayerAdapter(QObject* parent)
- : QObject(parent)
- , m_playerCore(std::make_unique<PlayerCore>())
- , m_updateTimer(new QTimer(this))
- {
- // 设置事件回调
- m_playerCore->setEventCallback(this);
-
- // 连接更新定时器
- connect(m_updateTimer, &QTimer::timeout, this, &PlayerAdapter::updatePlayer);
-
- qDebug() << "PlayerAdapter created";
- }
- PlayerAdapter::~PlayerAdapter()
- {
- stopUpdateTimer();
- qDebug() << "PlayerAdapter destroyed";
- }
- void PlayerAdapter::setVideoRenderer(VideoRenderer* renderer)
- {
- if (m_playerCore) {
- m_playerCore->setVideoRenderer(renderer);
- }
- }
- av::ErrorCode PlayerAdapter::openFile(const QString& filename)
- {
- std::string stdFilename = filename.toStdString();
- av::ErrorCode result = m_playerCore->openFile(stdFilename);
-
- if (result == av::ErrorCode::SUCCESS) {
- // 启动更新定时器
- startUpdateTimer();
- }
-
- return result;
- }
- av::ErrorCode PlayerAdapter::play()
- {
- return m_playerCore->play();
- }
- av::ErrorCode PlayerAdapter::pause()
- {
- return m_playerCore->pause();
- }
- av::ErrorCode PlayerAdapter::stop()
- {
- av::ErrorCode result = m_playerCore->stop();
-
- if (result == av::ErrorCode::SUCCESS) {
- // 停止更新定时器
- stopUpdateTimer();
- }
-
- return result;
- }
- av::ErrorCode PlayerAdapter::seek(qint64 timestamp)
- {
- return m_playerCore->seek(timestamp);
- }
- av::ErrorCode PlayerAdapter::setPlaybackSpeed(double speed)
- {
- av::ErrorCode result = m_playerCore->setPlaybackSpeed(speed);
-
- if (result == av::ErrorCode::SUCCESS && std::abs(m_lastPlaybackSpeed - speed) > 0.001) {
- m_lastPlaybackSpeed = speed;
- emit playbackSpeedChanged(speed);
- }
-
- return result;
- }
- PlayerState PlayerAdapter::getState() const
- {
- return m_playerCore->getState();
- }
- qint64 PlayerAdapter::getCurrentTime() const
- {
- return m_playerCore->getCurrentTime();
- }
- qint64 PlayerAdapter::getDuration() const
- {
- MediaInfo info = m_playerCore->getMediaInfo();
- return info.duration;
- }
- double PlayerAdapter::getPlaybackSpeed() const
- {
- return m_playerCore->getPlaybackSpeed();
- }
- void PlayerAdapter::setVolume(double volume)
- {
- m_playerCore->setVolume(volume);
-
- if (std::abs(m_lastVolume - volume) > 0.001) {
- m_lastVolume = volume;
- emit volumeChanged(volume);
- }
- }
- double PlayerAdapter::getVolume() const
- {
- return m_playerCore->getVolume();
- }
- void PlayerAdapter::setMuted(bool muted)
- {
- if (m_muted != muted) {
- m_muted = muted;
-
- // 如果静音,设置音量为0;否则恢复之前的音量
- if (muted) {
- m_playerCore->setVolume(0.0);
- } else {
- m_playerCore->setVolume(m_lastVolume);
- }
-
- emit mutedChanged(muted);
- }
- }
- bool PlayerAdapter::isMuted() const
- {
- return m_muted;
- }
- MediaInfo PlayerAdapter::getMediaInfo() const
- {
- return m_playerCore->getMediaInfo();
- }
- PlaybackStats PlayerAdapter::getStats() const
- {
- return m_playerCore->getStats();
- }
- AVFrame* PlayerAdapter::getNextVideoFrame()
- {
- return m_playerCore->getNextVideoFrame();
- }
- AVFrame* PlayerAdapter::getNextAudioFrame()
- {
- return m_playerCore->getNextAudioFrame();
- }
- void PlayerAdapter::releaseVideoFrame(AVFrame* frame)
- {
- m_playerCore->releaseVideoFrame(frame);
- }
- void PlayerAdapter::releaseAudioFrame(AVFrame* frame)
- {
- m_playerCore->releaseAudioFrame(frame);
- }
- void PlayerAdapter::startUpdateTimer(int intervalMs)
- {
- if (!m_updateTimer->isActive()) {
- m_updateTimer->start(intervalMs);
- qDebug() << "Update timer started with interval:" << intervalMs << "ms";
- }
- }
- void PlayerAdapter::stopUpdateTimer()
- {
- if (m_updateTimer->isActive()) {
- m_updateTimer->stop();
- qDebug() << "Update timer stopped";
- }
- }
- void PlayerAdapter::updatePlayer()
- {
- // 更新播放器核心
- m_playerCore->update();
-
- // 检查状态变化
- PlayerState currentState = m_playerCore->getState();
- if (currentState != m_lastState) {
- m_lastState = currentState;
- emit stateChanged(currentState);
- }
-
- // 检查位置和时长变化
- checkPositionChanged();
- checkDurationChanged();
-
- // 发送统计信息更新
- PlaybackStats stats = m_playerCore->getStats();
- emit statsUpdated(stats);
-
- // 检查是否有新的视频帧
- if (m_playerCore->getNextVideoFrame() != nullptr) {
- emit videoFrameAvailable();
- }
-
- // 检查是否有新的音频帧
- if (m_playerCore->getNextAudioFrame() != nullptr) {
- emit audioFrameAvailable();
- }
- }
- void PlayerAdapter::onStateChanged(PlayerState state)
- {
- // 在主线程中发送信号
- QMetaObject::invokeMethod(this, [this, state]() {
- if (state != m_lastState) {
- m_lastState = state;
- emit stateChanged(state);
- }
- }, Qt::QueuedConnection);
- }
- void PlayerAdapter::onMediaInfoChanged(const MediaInfo& info)
- {
- // 在主线程中发送信号
- QMetaObject::invokeMethod(this, [this, info]() {
- emit mediaInfoChanged(info);
-
- // 检查时长变化
- if (info.duration != m_lastDuration) {
- m_lastDuration = info.duration;
- emit durationChanged(info.duration);
- }
- }, Qt::QueuedConnection);
- }
- void PlayerAdapter::onPositionChanged(int64_t position)
- {
- // 在主线程中发送信号
- QMetaObject::invokeMethod(this, [this, position]() {
- if (std::abs(position - m_lastPosition) > 100000) { // 100ms阈值(微秒)
- m_lastPosition = position;
- emit positionChanged(position);
- }
- }, Qt::QueuedConnection);
- }
- void PlayerAdapter::onErrorOccurred(const std::string& error)
- {
- QString qError = toQString(error);
-
- // 在主线程中发送信号
- QMetaObject::invokeMethod(this, [this, qError]() {
- emit errorOccurred(qError);
- }, Qt::QueuedConnection);
- }
- void PlayerAdapter::onEndOfFile()
- {
- // 在主线程中发送信号
- QMetaObject::invokeMethod(this, [this]() {
- emit playbackFinished();
- stopUpdateTimer();
- }, Qt::QueuedConnection);
- }
- void PlayerAdapter::checkPositionChanged()
- {
- qint64 currentPosition = getCurrentTime();
- if (std::abs(currentPosition - m_lastPosition) > 100) { // 100ms阈值
- m_lastPosition = currentPosition;
- emit positionChanged(currentPosition);
- }
- }
- void PlayerAdapter::checkDurationChanged()
- {
- qint64 currentDuration = getDuration();
- if (currentDuration != m_lastDuration) {
- m_lastDuration = currentDuration;
- emit durationChanged(currentDuration);
- }
- }
- QString PlayerAdapter::toQString(const std::string& str) const
- {
- return QString::fromStdString(str);
- }
- // PlayerAdapterFactory 实现
- std::unique_ptr<PlayerAdapter> PlayerAdapterFactory::create(QObject* parent)
- {
- return std::make_unique<PlayerAdapter>(parent);
- }
- std::shared_ptr<PlayerAdapter> PlayerAdapterFactory::createShared(QObject* parent)
- {
- return std::make_shared<PlayerAdapter>(parent);
- }
- } // namespace player
- } // namespace av
- #include "player_adapter.moc"
|