| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311 |
- /**
- * @file test_player_adapter.cpp
- * @brief PlayerAdapter OpenGL渲染器测试程序
- * @author AI Assistant
- * @date 2024
- */
- #include "code/player/player_adapter.h"
- #include "code/player/opengl_video_renderer.h"
- #include <QApplication>
- #include <QMainWindow>
- #include <QVBoxLayout>
- #include <QHBoxLayout>
- #include <QPushButton>
- #include <QSlider>
- #include <QLabel>
- #include <QFileDialog>
- #include <QMessageBox>
- #include <QTimer>
- #include <QComboBox>
- #include <QGroupBox>
- #include <iostream>
- using namespace av;
- using namespace av::player;
- /**
- * @brief 主窗口类
- */
- class PlayerAdapterTestWindow : public QMainWindow {
- Q_OBJECT
- public:
- PlayerAdapterTestWindow(QWidget* parent = nullptr) : QMainWindow(parent) {
- setupUI();
- setupPlayer();
- setupConnections();
- }
- private slots:
- void openFile() {
- QString filename = QFileDialog::getOpenFileName(
- this,
- "Open Media File",
- "",
- "Media Files (*.mp4 *.avi *.mkv *.mov *.wmv *.flv *.webm);;All Files (*)"
- );
-
- if (!filename.isEmpty()) {
- openMediaFile(filename);
- }
- }
-
- void play() {
- if (m_playerAdapter) {
- m_playerAdapter->play();
- }
- }
-
- void pause() {
- if (m_playerAdapter) {
- m_playerAdapter->pause();
- }
- }
-
- void stop() {
- if (m_playerAdapter) {
- m_playerAdapter->stop();
- }
- }
-
- void onVolumeChanged(int value) {
- if (m_playerAdapter) {
- double volume = value / 100.0;
- m_playerAdapter->setVolume(volume);
- m_volumeLabel->setText(QString("Volume: %1%").arg(value));
- }
- }
-
- void onSpeedChanged(int value) {
- if (m_playerAdapter) {
- double speed = value / 100.0;
- m_playerAdapter->setPlaybackSpeed(speed);
- m_speedLabel->setText(QString("Speed: %1x").arg(speed, 0, 'f', 2));
- }
- }
-
- void onRendererTypeChanged(const QString& type) {
- m_rendererTypeLabel->setText(QString("Renderer: %1").arg(type));
- qDebug() << "Renderer type changed to:" << type;
- }
-
- void onOpenGLRendererInitialized() {
- qDebug() << "OpenGL renderer initialized successfully";
- m_statusLabel->setText("OpenGL renderer ready");
- }
-
- void onStateChanged(PlayerState state) {
- QString stateText;
- switch (state) {
- case PlayerState::Idle: stateText = "Idle"; break;
- case PlayerState::Opening: stateText = "Opening"; break;
- case PlayerState::Playing: stateText = "Playing"; break;
- case PlayerState::Paused: stateText = "Paused"; break;
- case PlayerState::Seeking: stateText = "Seeking"; break;
- case PlayerState::Stopped: stateText = "Stopped"; break;
- case PlayerState::Error: stateText = "Error"; break;
- }
- m_stateLabel->setText(QString("State: %1").arg(stateText));
- }
-
- void onPositionChanged(qint64 position) {
- double seconds = position / 1000000.0;
- m_positionLabel->setText(QString("Position: %1s").arg(seconds, 0, 'f', 2));
- }
-
- void onErrorOccurred(const QString& error) {
- QMessageBox::warning(this, "Error", error);
- m_statusLabel->setText("Error occurred");
- }
-
- void updateStats() {
- if (m_playerAdapter) {
- PlaybackStats stats = m_playerAdapter->getStats();
- MediaInfo info = m_playerAdapter->getMediaInfo();
-
- QString statsText = QString("Frames: %1 | Dropped: %2 | Buffer: %3")
- .arg(stats.totalFrames)
- .arg(stats.droppedFrames)
- .arg(stats.queuedVideoFrames);
-
- m_statsLabel->setText(statsText);
- }
- }
- private:
- void setupUI() {
- setWindowTitle("PlayerAdapter OpenGL Test");
- setMinimumSize(900, 700);
-
- // 创建中央部件
- QWidget* centralWidget = new QWidget(this);
- setCentralWidget(centralWidget);
-
- // 创建主布局
- QVBoxLayout* mainLayout = new QVBoxLayout(centralWidget);
-
- // 创建渲染器选择区域
- QGroupBox* rendererGroup = new QGroupBox("Renderer Selection", this);
- QHBoxLayout* rendererLayout = new QHBoxLayout(rendererGroup);
-
- QPushButton* useOpenGLButton = new QPushButton("Use OpenGL Renderer", this);
-
- rendererLayout->addWidget(useOpenGLButton);
-
- mainLayout->addWidget(rendererGroup);
-
- // 创建视频显示区域
- QGroupBox* videoGroup = new QGroupBox("Video Display", this);
- QVBoxLayout* videoLayout = new QVBoxLayout(videoGroup);
-
- // 创建OpenGL渲染器
- m_openGLRenderer = new OpenGLVideoRenderer(this);
- m_openGLRenderer->setMinimumSize(640, 480);
- videoLayout->addWidget(m_openGLRenderer);
-
-
- mainLayout->addWidget(videoGroup);
-
- // 创建控制面板
- QGroupBox* controlGroup = new QGroupBox("Playback Controls", this);
- QHBoxLayout* controlLayout = new QHBoxLayout(controlGroup);
-
- // 文件操作按钮
- QPushButton* openButton = new QPushButton("Open File", this);
- QPushButton* playButton = new QPushButton("Play", this);
- QPushButton* pauseButton = new QPushButton("Pause", this);
- QPushButton* stopButton = new QPushButton("Stop", this);
-
- controlLayout->addWidget(openButton);
- controlLayout->addWidget(playButton);
- controlLayout->addWidget(pauseButton);
- controlLayout->addWidget(stopButton);
-
- // 音量控制
- QLabel* volumeLabel = new QLabel("Volume: 100%", this);
- QSlider* volumeSlider = new QSlider(Qt::Horizontal, this);
- volumeSlider->setRange(0, 100);
- volumeSlider->setValue(100);
-
- controlLayout->addWidget(volumeLabel);
- controlLayout->addWidget(volumeSlider);
-
- // 播放速度控制
- QLabel* speedLabel = new QLabel("Speed: 1.00x", this);
- QSlider* speedSlider = new QSlider(Qt::Horizontal, this);
- speedSlider->setRange(25, 200); // 0.25x - 2.0x
- speedSlider->setValue(100);
-
- controlLayout->addWidget(speedLabel);
- controlLayout->addWidget(speedSlider);
-
- mainLayout->addWidget(controlGroup);
-
- // 创建状态显示区域
- QGroupBox* statusGroup = new QGroupBox("Status Information", this);
- QGridLayout* statusLayout = new QGridLayout(statusGroup);
-
- m_stateLabel = new QLabel("State: Idle", this);
- m_positionLabel = new QLabel("Position: 0.00s", this);
- m_rendererTypeLabel = new QLabel("Renderer: None", this);
- m_statusLabel = new QLabel("Ready", this);
- m_statsLabel = new QLabel("Stats: --", this);
-
- statusLayout->addWidget(m_stateLabel, 0, 0);
- statusLayout->addWidget(m_positionLabel, 0, 1);
- statusLayout->addWidget(m_rendererTypeLabel, 1, 0);
- statusLayout->addWidget(m_statusLabel, 1, 1);
- statusLayout->addWidget(m_statsLabel, 2, 0, 1, 2);
-
- mainLayout->addWidget(statusGroup);
-
- // 保存控件引用
- m_volumeLabel = volumeLabel;
- m_speedLabel = speedLabel;
-
- // 连接信号
- connect(openButton, &QPushButton::clicked, this, &PlayerAdapterTestWindow::openFile);
- connect(playButton, &QPushButton::clicked, this, &PlayerAdapterTestWindow::play);
- connect(pauseButton, &QPushButton::clicked, this, &PlayerAdapterTestWindow::pause);
- connect(stopButton, &QPushButton::clicked, this, &PlayerAdapterTestWindow::stop);
- connect(volumeSlider, &QSlider::valueChanged, this, &PlayerAdapterTestWindow::onVolumeChanged);
- connect(speedSlider, &QSlider::valueChanged, this, &PlayerAdapterTestWindow::onSpeedChanged);
-
- // 渲染器选择按钮
- connect(useOpenGLButton, &QPushButton::clicked, this, [this]() {
- m_playerAdapter->setOpenGLVideoRenderer(m_openGLRenderer);
- });
- }
-
- void setupPlayer() {
- m_playerAdapter = std::make_unique<PlayerAdapter>(this);
-
- // 默认使用OpenGL渲染器
- m_playerAdapter->setOpenGLVideoRenderer(m_openGLRenderer);
- }
-
- void setupConnections() {
- // 连接PlayerAdapter信号
- connect(m_playerAdapter.get(), &PlayerAdapter::stateChanged,
- this, &PlayerAdapterTestWindow::onStateChanged);
- connect(m_playerAdapter.get(), &PlayerAdapter::positionChanged,
- this, &PlayerAdapterTestWindow::onPositionChanged);
- connect(m_playerAdapter.get(), &PlayerAdapter::errorOccurred,
- this, &PlayerAdapterTestWindow::onErrorOccurred);
- connect(m_playerAdapter.get(), &PlayerAdapter::rendererTypeChanged,
- this, &PlayerAdapterTestWindow::onRendererTypeChanged);
- connect(m_playerAdapter.get(), &PlayerAdapter::openGLRendererInitialized,
- this, &PlayerAdapterTestWindow::onOpenGLRendererInitialized);
-
- // 创建定时器更新统计信息
- m_statsTimer = new QTimer(this);
- connect(m_statsTimer, &QTimer::timeout, this, &PlayerAdapterTestWindow::updateStats);
- m_statsTimer->start(500); // 每500ms更新一次
- }
-
- void openMediaFile(const QString& filename) {
- if (!m_playerAdapter) {
- return;
- }
-
- ErrorCode result = m_playerAdapter->openFile(filename);
- if (result != ErrorCode::SUCCESS) {
- QMessageBox::critical(this, "Error",
- QString("Failed to open file: %1").arg(filename));
- } else {
- setWindowTitle(QString("PlayerAdapter OpenGL Test - %1").arg(filename));
- }
- }
- private:
- std::unique_ptr<PlayerAdapter> m_playerAdapter;
- OpenGLVideoRenderer* m_openGLRenderer;
-
- QLabel* m_volumeLabel;
- QLabel* m_speedLabel;
- QLabel* m_stateLabel;
- QLabel* m_positionLabel;
- QLabel* m_rendererTypeLabel;
- QLabel* m_statusLabel;
- QLabel* m_statsLabel;
- QTimer* m_statsTimer;
- };
- int main(int argc, char* argv[]) {
- QApplication app(argc, argv);
-
- // 设置应用程序信息
- app.setApplicationName("PlayerAdapter OpenGL Test");
- app.setApplicationVersion("1.0");
- app.setOrganizationName("AV Player");
-
- // 创建主窗口
- PlayerAdapterTestWindow window;
- window.show();
-
- return app.exec();
- }
- #include "test_player_adapter.moc"
|