【Qt】之音視頻編程2:QtAV的使用篇

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();
}

關鍵點

  1. VideoOutput::widget()
    將 QtAV 的視頻渲染器轉換為 QWidget,嵌入到你的布局中。
  2. 使用 QVBoxLayout + QHBoxLayout
    垂直排列播放窗口和按鈕欄,水平排列按鈕。
  3. 信號槽控制播放器
    通過按鈕的 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"}
}

關鍵點

  1. VideoOutput 綁定 AVPlayer
    通過 source: avPlayer 關聯播放器和渲染窗口。
  2. 動態按鈕文本
    avPlayer.isPlaying 控制“播放/暫停”按鈕的文本切換。
  3. 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
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/80964.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/80964.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/80964.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

歌詞滾動效果

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><!-- 設置標簽頁圖標 --><link rel"shortcut icon&…

基于大模型的TIA診療全流程智能決策系統技術方案

目錄 一、多模態數據融合與預處理系統1.1 數據接入模塊1.2 數據預處理偽代碼二、TIA智能預測模型系統2.1 模型訓練流程2.2 混合模型架構偽代碼三、術中智能監測系統3.1 實時監測流程3.2 實時預測偽代碼四、智能診療決策系統4.1 手術方案推薦流程4.2 麻醉方案生成偽代碼五、預后…

Java 日期解析與格式化:從標準格式到自然語言解析

使用 Java 搭配 Apache Commons Lang3 和 Natty 庫&#xff0c;實現靈活高效的日期解析與格式化。 一、背景 將不同格式的日期統一成一個格式。日期格式可能有以下幾種類型&#xff1a; 標準格式&#xff1a;2024-02-28、14/05/2022、2002年5月6日非英文月份縮寫&#xff1a;…

Room持久化庫:從零到一的全面解析與實戰

簡介 在Android開發中,Room作為官方推薦的數據庫持久化庫,提供了對SQLite的抽象層,使得數據庫操作更加安全、高效且易于維護。 Room通過注解處理器和編譯時驗證,顯著降低了數據庫操作的復雜度,同時支持響應式編程模式,使開發者能夠輕松實現數據變化的實時監聽。對于企業…

MySQL(6)如何刪除數據庫和表?

在 MySQL 中刪除數據庫和表是常見的管理操作。下面將詳細介紹如何使用 SQL 語句以及圖形化工具來刪除數據庫和表。 步驟一&#xff1a;連接 MySQL 服務器 首先&#xff0c;連接到 MySQL 服務器&#xff0c;可以使用命令行工具 mysql 或圖形化工具如 MySQL Workbench。 使用命…

攜固態電池、新形態鋼殼疊片電池等產品 豪鵬科技將亮相CIBF 2025

攜固態電池、新形態鋼殼疊片電池等產品 豪鵬科技將亮相CIBF 2025 來源&#xff1a; 電池百人會-電池網 豪鵬科技&#xff08;展位號:14W001&#xff09;將攜固態電池、新形態鋼殼疊片電池及高安全性鈉離子電池等前沿技術產品亮相CIBF 2025&#xff0c;憑借多年的技術積累和產…

React學習———useEffect和useLayoutEffect

useEffect useEffect是React的一個Hook&#xff0c;用于在函數組件中處理副作用。副作用包括數據獲取、訂閱、手動DOM操作以及其他需要再渲染后執行的操作 基本用法 useEffect(() > {// 副作用邏輯return () > {// 可選的清理函數} }, [依賴數組])第一個參數&#xff…

“天神之眼”計算平臺的算力設計(預計500-1000 TOPS)

關于比亞迪“天神之眼”計算平臺的算力設計&#xff08;預計500-1000 TOPS&#xff09;&#xff0c;其技術路徑和行業意義值得深入探討。以下從實現方式、技術挑戰和行業影響三個維度展開分析&#xff1a; 1. 多芯片互聯的技術實現路徑 &#xff08;1&#xff09;芯片選型方案…

FPGA: Xilinx Kintex 7實現PCIe接口

在Xilinx Kintex-7系列FPGA上實現PCIe&#xff08;Peripheral Component Interconnect Express&#xff09;接口&#xff0c;通常使用Xilinx提供的7 Series Integrated Block for PCIe IP核&#xff0c;結合Vivado設計流程。以下是實現PCIe接口的詳細步驟和關鍵點&#xff0c;適…

ArcGIS Desktop使用入門(二)常用工具條——圖形

系列文章目錄 ArcGIS Desktop使用入門&#xff08;一&#xff09;軟件初認識 ArcGIS Desktop使用入門&#xff08;二&#xff09;常用工具條——標準工具 ArcGIS Desktop使用入門&#xff08;二&#xff09;常用工具條——編輯器 ArcGIS Desktop使用入門&#xff08;二&#x…

JT/T 808 通訊協議及數據格式解析

文章目錄 一、引言二、協議數據幀結構三、消息頭結構&#xff08;Message Header&#xff09;四、常用消息類型&#xff08;Message ID&#xff09;五、典型消息體結構解析六、數據轉義規則七、校驗碼計算方法八、終端與平臺通信流程示意&#xff08;簡要&#xff09;九、平臺接…

Rust 輸出到命令行

Rust 輸出到命令行 引言 Rust 是一門系統編程語言&#xff0c;以其高性能、內存安全、并發支持和零成本抽象等特性而聞名。在開發過程中&#xff0c;將 Rust 程序的輸出傳遞到命令行是常見的需求。本文將詳細介紹 Rust 輸出到命令行的多種方法&#xff0c;幫助讀者掌握這一技…

從字符串轉換到矩陣快速冪:解決多次轉換后的長度問題

引言 在編程競賽和算法問題中&#xff0c;我們經常會遇到需要對字符串進行多次轉換的問題。本文將介紹一個有趣的問題&#xff1a;給定一個字符串和轉換規則&#xff0c;計算經過多次轉換后字符串的長度。由于直接模擬會導致性能問題&#xff0c;我們將使用矩陣快速冪來高效解…

Vue2 elementUI 二次封裝命令式表單彈框組件

需求&#xff1a;封裝一個表單彈框組件&#xff0c;彈框和表單是兩個組件&#xff0c;表單組件以插槽的形式動態傳入彈框組件中。 外部組件使用的方式如下&#xff1a; 直接上代碼&#xff1a; MyDialog.vue 彈框組件 <template><el-dialog:titletitle:visible.syn…

React Hooks:從“這什么鬼“到“真香“的奇幻之旅

寫在前面:一個讓React老手都拍案叫絕的魔法 “等等,函數組件怎么能有狀態?!” —— 這是2018年我第一次聽說React Hooks時的反應。當時我正在用class組件寫一個復雜的表單,生命周期方法亂得像一碗意大利面。直到我看到了這段代碼: function Counter() {const [count, s…

論文閱讀筆記——雙流網絡

雙流網絡論文 視頻相比圖像包含更多信息&#xff1a;運動信息、時序信息、背景信息等等。 原先處理視頻的方法&#xff1a; CNN LSTM&#xff1a;CNN 抽取關鍵特征&#xff0c;LSTM 做時序邏輯&#xff1b;抽取視頻中關鍵 K 幀輸入 CNN 得到圖片特征&#xff0c;再輸入 LSTM&…

SpringBoot Vue MySQL酒店民宿預訂系統源碼(支付寶沙箱支付)+代碼講解視頻

&#x1f497;博主介紹&#x1f497;&#xff1a;?在職Java研發工程師、專注于程序設計、源碼分享、技術交流、專注于Java技術領域和畢業設計? 溫馨提示&#xff1a;文末有 CSDN 平臺官方提供的老師 Wechat / QQ 名片 :) Java精品實戰案例《700套》 2025最新畢業設計選題推薦…

右值引用的學習

傳統的C語法中就有引用的語法&#xff0c;而C11中新增了的右值引用語法特性&#xff0c;所以從現在開始我們之前學習的引用就叫做左值引用。無論左值引用還是右值引用&#xff0c;都是給對象取別名。 左值引用和右值引用 在講之前&#xff0c;我們先來看一下什么是左值和右值…

PHP黑白膠卷底片圖轉彩圖功能 V2025.05.15

關于底片轉彩圖 傳統照片底片是攝影過程中生成的反色圖像&#xff0c;為了欣賞照片&#xff0c;需要通過沖印過程將底片轉化為正像。而隨著數字技術的發展&#xff0c;我們現在可以使用數字工具不僅將底片轉為正像&#xff0c;還可以添加色彩&#xff0c;重現照片原本的色彩效…

【Three.js基礎學習】36.particles-morphing-shader

前言 通過著色器如何實現粒子之間動態切換 一、代碼 script.js import * as THREE from three import { OrbitControls } from three/addons/controls/OrbitControls.js import { GLTFLoader } from three/addons/loaders/GLTFLoader.js import { DRACOLoader } from three/a…