QtAV 基本播放控制功能實現(C++ & QML)
QtAV 提供了完整的播放控制 API,支持 播放、暫停、停止、快進快退、截屏 等功能。以下是具體實現方法:
1. C++ 控制方式
基本播放控制
#include <QtAV>
#include <QtAV/AVPlayer.h>// 初始化播放器
QtAV::AVPlayer player;// 設置播放文件
player.setFile("video.mp4"); // 播放
player.play();// 暫停
player.pause();// 繼續播放(從暫停狀態恢復)
player.play(); // 重新播放 或 player.togglePause(); 從播放位置繼續播放// 停止(重置狀態)
player.stop();
快進/快退(跳轉進度)
// 快進 10 秒
qint64 currentPos = player.position();
player.seek(currentPos + 10000); // 單位:毫秒// 快退 5 秒
player.seek(currentPos - 5000); // 重載形式1 直接設置毫秒// 跳轉到 50% 進度
player.seek(0.5); // 重載形式2 直接設置進度
總時長 player.duration()
截屏(保存當前幀)
// 截屏并保存為 PNG
QtAV::VideoOutput *videoOutput = new QtAV::VideoOutput;
player.setRenderer(videoOutput);// 捕獲當前幀
QImage image = videoOutput->frame();
image.save("screenshot.png");
2. QML 控制方式
基本播放控制
import QtQuick 2.0
import QtAV 1.7Item {width: 800height: 600AVPlayer {id: avPlayersource: "video.mp4"}VideoOutput {source: avPlayeranchors.fill: parent}// 播放/暫停按鈕Button {text: avPlayer.isPlaying ? "暫停" : "播放"onClicked: avPlayer.isPlaying ? avPlayer.pause() : avPlayer.play()}// 停止按鈕Button {text: "停止"onClicked: avPlayer.stop()}
}
快進/快退
// 快進 10 秒
Button {text: "快進"onClicked: avPlayer.seek(avPlayer.position + 10000)
}// 快退 5 秒
Button {text: "快退"onClicked: avPlayer.seek(avPlayer.position - 5000)
}
截屏
Button {text: "截屏"onClicked: {const image = videoOutput.captureFrame()image.save("screenshot.png")}
}
3. 進階功能
播放速度控制
// 2 倍速播放
player.setSpeed(2.0);// 0.5 倍慢放
player.setSpeed(0.5);
音量控制
player.audio()->setVolume(0.5); // 0~1.0
獲取播放信息
qint64 totalTime = player.duration(); // 總時長(毫秒) play播放后才能獲取到
qint64 currentTime = player.position(); // 當前進度
bool isPlaying = player.isPlaying();
4. 信號與槽(監聽狀態)
// 監聽播放狀態變化
connect(&player, &AVPlayer::stateChanged, [](QtAV::AVPlayer::State state) {if (state == QtAV::AVPlayer::PlayingState) {qDebug() << "開始播放";} else if (state == QtAV::AVPlayer::PausedState) {qDebug() << "已暫停";}
});// 監聽進度變化
connect(&player, &AVPlayer::positionChanged, [](qint64 pos) {qDebug() << "當前進度:" << pos;
});
5. 完整示例(C++ 播放器)
#include <QApplication>
#include <QtAV>
#include <QtAV/AVPlayer.h>
#include <QtAV/VideoOutput.h>int main(int argc, char *argv[]) {QApplication a(argc, argv);QtAV::AVPlayer player;QtAV::VideoOutput output;output.setRenderer(&player);player.setFile("video.mp4");player.play();// 窗口顯示output.widget()->show();return a.exec();
}
總結
功能 | C++ 方法 | QML 屬性/方法 |
---|---|---|
播放 | player.play() | avPlayer.play() |
暫停 | player.pause() | avPlayer.pause() |
停止 | player.stop() | avPlayer.stop() |
快進/快退 | player.seek(pos + 10000) | avPlayer.seek(pos + 10000) |
截屏 | videoOutput->frame().save() | videoOutput.captureFrame() |
倍速播放 | player.setSpeed(2.0) | avPlayer.playbackRate = 2.0 |
將 QtAV 播放窗口集成到自定義界面(C++ & QML)
你可以通過 Qt Widgets(C++) 或 QML 方式將 QtAV 的播放窗口嵌入到自己的 UI 中,并在下方添加控制按鈕。以下是兩種實現方法:
1. C++ 方式(Qt Widgets)
目標布局
+-----------------------+
| QtAV 播放窗口 |
+-----------------------+
| [播放] [暫停] [停止] ... |
+-----------------------+
代碼實現
#include <QApplication>
#include <QtAV>
#include <QtAV/AVPlayer.h>
#include <QtAV/VideoOutput.h>
#include <QPushButton>
#include <QVBoxLayout>
#include <QWidget>int main(int argc, char *argv[]) {QApplication app(argc, argv);// 主窗口QWidget mainWindow;mainWindow.setWindowTitle("自定義播放器");mainWindow.resize(800, 600);// 垂直布局QVBoxLayout *layout = new QVBoxLayout(&mainWindow);// 1. 添加 QtAV 播放窗口QtAV::AVPlayer *player = new QtAV::AVPlayer;QtAV::VideoOutput *videoOutput = new QtAV::VideoOutput;player->setRenderer(videoOutput);player->setFile("video.mp4");// 將 VideoOutput 的 QWidget 添加到布局layout->addWidget(videoOutput->widget());// 2. 添加控制按鈕QHBoxLayout *buttonLayout = new QHBoxLayout;QPushButton *playButton = new QPushButton("播放");QPushButton *pauseButton = new QPushButton("暫停");QPushButton *stopButton = new QPushButton("停止");QPushButton *screenshotButton = new QPushButton("截屏");buttonLayout->addWidget(playButton);buttonLayout->addWidget(pauseButton);buttonLayout->addWidget(stopButton);buttonLayout->addWidget(screenshotButton);layout->addLayout(buttonLayout);// 按鈕信號槽連接QObject::connect(playButton, &QPushButton::clicked, [player]() {player->play();});QObject::connect(pauseButton, &QPushButton::clicked, [player]() {player->pause();});QObject::connect(stopButton, &QPushButton::clicked, [player]() {player->stop();});QObject::connect(screenshotButton, &QPushButton::clicked, [videoOutput]() {QImage image = videoOutput->frame();image.save("screenshot.png");qDebug() << "截圖已保存!";});mainWindow.show();return app.exec();
}
關鍵點
VideoOutput::widget()
將 QtAV 的視頻渲染器轉換為QWidget
,嵌入到你的布局中。- 使用
QVBoxLayout
+QHBoxLayout
垂直排列播放窗口和按鈕欄,水平排列按鈕。 - 信號槽控制播放器
通過按鈕的clicked
信號調用AVPlayer
的對應方法。
2. QML 方式(更簡潔的 UI 設計)
目標布局
ColumnLayout {VideoOutput { /* 播放窗口 */ }RowLayout { /* 按鈕行 */ }
}
代碼實現
import QtQuick 2.15
import QtQuick.Controls 2.15
import QtQuick.Layouts 1.15
import QtAV 1.7ApplicationWindow {width: 800height: 600visible: truetitle: "QML 自定義播放器"ColumnLayout {anchors.fill: parent// 1. 播放窗口VideoOutput {id: videoOutputLayout.fillWidth: trueLayout.fillHeight: truesource: avPlayer}// 2. 按鈕控制欄RowLayout {Layout.alignment: Qt.AlignHCenterButton {text: avPlayer.isPlaying ? "暫停" : "播放"onClicked: avPlayer.isPlaying ? avPlayer.pause() : avPlayer.play()}Button {text: "停止"onClicked: avPlayer.stop()}Button {text: "快進+10s"onClicked: avPlayer.seek(avPlayer.position + 10000)}Button {text: "截屏"onClicked: {const image = videoOutput.captureFrame()image.save("screenshot.png")console.log("截圖已保存!")}}}}// 播放器實例AVPlayer {id: avPlayersource: "video.mp4"}
}
關鍵點
VideoOutput
綁定AVPlayer
通過source: avPlayer
關聯播放器和渲染窗口。- 動態按鈕文本
avPlayer.isPlaying
控制“播放/暫停”按鈕的文本切換。 captureFrame()
截屏
直接調用VideoOutput
的接口保存當前幀。
3. 進階優化
(1) 進度條控制(C++ 示例)
// 添加 QSlider 到布局
QSlider *progressSlider = new QSlider(Qt::Horizontal);
layout->addWidget(progressSlider);// 更新進度條
QObject::connect(player, &QtAV::AVPlayer::positionChanged, [=](qint64 pos) {progressSlider->setValue(pos);
});
QObject::connect(progressSlider, &QSlider::sliderMoved, [=](int value) {player->seek(value);
});
(2) 音量控制(QML 示例)
Slider {from: 0to: 100value: 50onMoved: avPlayer.audio.volume = value
}