轉(zhuǎn)帖|產(chǎn)品更新|編輯:鮑佳佳|2021-07-12 11:59:01.563|閱讀 1441 次
概述:Qt 5 中的 Qt 多媒體有一個(gè)相當(dāng)松散定義的范圍。不同后端對(duì) API 不同部分的支持并不一致,而且 API 本身的部分也不容易跨平臺(tái)使用。對(duì)于 Qt 6,新版本嘗試在一定程度上縮小范圍,并致力于開發(fā)一組一致的功能,這些功能適用于所有支持的平臺(tái)。但還沒有達(dá)到這個(gè)目標(biāo),但希望通過 Qt 6.2.0 的發(fā)布填補(bǔ)大部分實(shí)施空白。
# 界面/圖表報(bào)表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關(guān)鏈接:
Qt開發(fā)便捷控件-讓應(yīng)用程序擁有與時(shí)俱進(jìn)的功能區(qū)UI:
Qt 6.2 的第一個(gè)測(cè)試版剛剛發(fā)布,并在多個(gè)其他新附加組件中加入了全新的 Qt 多媒體模塊。(查看Qt6.2功能詳情)
Qt Multimedia 是一個(gè)模塊,它在 Qt 6 中發(fā)生了一些相當(dāng)大的變化。在很多方面,它是一個(gè)新的 API 和實(shí)現(xiàn),即使重新使用了 Qt 5.15 中的一些代碼。
雖然新版本試圖為我們的大多數(shù)模塊保持 Qt 5 和 Qt 6 之間盡可能多的源代碼兼容性,但又不得不在進(jìn)行大量更改以使 API 和實(shí)現(xiàn)適合未來,最終決定以最好的為目標(biāo)API 而不是最大的兼容性。如果您一直在 Qt 5 中使用 Qt Multimedia,則需要對(duì)您的實(shí)現(xiàn)進(jìn)行更改。
Qt 5 中的 Qt 多媒體有一個(gè)相當(dāng)松散定義的范圍。不同后端對(duì) API 不同部分的支持并不一致,而且 API 本身的部分也不容易跨平臺(tái)使用。
對(duì)于 Qt 6,新版本嘗試在一定程度上縮小范圍,并致力于開發(fā)一組一致的功能,這些功能適用于所有支持的平臺(tái)。但還沒有達(dá)到這個(gè)目標(biāo),但希望通過 Qt 6.2.0 的發(fā)布填補(bǔ)大部分實(shí)施空白。
新版本希望在 Qt 6.2 中支持的主要用例是:
據(jù)我們所知,這些功能涵蓋了我們用戶過去使用 Qt 多媒體的大部分用例。我們的目標(biāo)是首先關(guān)注那些核心用例,并確保它們?cè)谖覀?的所有平臺(tái)上一致工作,然后再使用新功能擴(kuò)展模塊。
Qt 5 中的 Qt 多媒體具有復(fù)雜的基于插件的架構(gòu),使用多個(gè)插件來實(shí)現(xiàn)不同的前端功能。一個(gè)完整的多媒體后端實(shí)現(xiàn)將包含不少于 4 個(gè)插件。用于實(shí)現(xiàn)這些插件的后端 API 是公開的,很難調(diào)整和改進(jìn)這些后端的功能。
構(gòu)建的架構(gòu)非常難以維護(hù)和開發(fā)模塊。在 Qt6 中,我們選擇顯著簡(jiǎn)化這一過程并移除插件基礎(chǔ)設(shè)施?,F(xiàn)在在編譯時(shí)選擇后端并編譯到 Qt Multimedia 的共享庫中。現(xiàn)在只有一個(gè)后端 API 涵蓋了所有多媒體,消除了我們?cè)?Qt 5 中人為拆分成多個(gè)后端的問題。最后,我們選擇將后端 API 設(shè)為私有,以便我們將來可以輕松調(diào)整和擴(kuò)展它。
完成后,我們可以仔細(xì)查看平臺(tái)相關(guān)后端代碼所需的 API 和接口。我們?cè)O(shè)法將實(shí)現(xiàn)多媒體后端所需的類集從 40 個(gè)減少到 15 個(gè),并減少了純虛擬方法的數(shù)量,為許多非必要功能提供了后備實(shí)現(xiàn)。
新的后端 API 在某種程度上模仿了我們?cè)?Qt Gui 中用于窗口系統(tǒng)集成的 QPA 架構(gòu),并且新的QPlatformMediaIntegration類現(xiàn)在確實(shí)作為一個(gè)通用的入口點(diǎn)和工廠類來實(shí)例化平臺(tái)相關(guān)的后端對(duì)象。在大多數(shù)情況下,我們現(xiàn)在的目標(biāo)是在公共 API 中的類和實(shí)現(xiàn)該功能的類之間建立一對(duì)一的關(guān)系。因此,公共QMediaPlayer API 有一個(gè)QPlatformMediaPlayer類實(shí)現(xiàn)平臺(tái)相關(guān)功能。
通過這些更改,我們還可以刪除大量在前端和后端之間重復(fù)的代碼,并避免它們之間的大量呼叫轉(zhuǎn)移。有了這個(gè),我們還可以將許多跨平臺(tái)功能和驗(yàn)證移到代碼的共享、平臺(tái)獨(dú)立部分中。
總而言之,這極大地簡(jiǎn)化了我們的代碼庫,并在不丟失大量功能的情況下大大減少了代碼大小。5.15 中的 Qt Multimedia 大約有 140.000 行代碼,而我們目前在 Qt 6 中減少到大約 74.000 行代碼。
在 Qt 6 中,我們還重新審視了支持的后端,并將其縮減為我們認(rèn)為將來可以支持的一組。例如,在 Qt 5 中,我們?cè)?Windows 上有三個(gè)完全不同的后端實(shí)現(xiàn),使用 DirectShow、WMF 和一個(gè)單獨(dú)的基于 WMF 的 WinRT 實(shí)現(xiàn)。
在 Qt 6 中,當(dāng)前支持的集合是:
Qt 6.3 計(jì)劃支持 QNX。可能還會(huì)在 6.2 中及時(shí)在 WebAssembly 上使用低級(jí)音頻。此外,我們?nèi)杂惺褂?PulseAudio 或 ALSA 在 Linux 上支持低級(jí)音頻的代碼,但目前尚未測(cè)試或支持這些代碼。根據(jù)需求,我們可能會(huì)在以后的版本中將它們帶回來。
Qt Multimedia的公共 API由 5 個(gè)大型功能塊組成。其中三個(gè)塊已經(jīng)存在于 Qt 5 中,但是這些塊中的 API 發(fā)生了重大變化。功能塊是:
在做新的 API 的時(shí)候,我們也希望在 C++ 和 QML 之間有一個(gè)統(tǒng)一的 API。這使我們可以刪除大量代碼,這些代碼只是簡(jiǎn)單地包裝了 C++ API 并以稍微不同的方式將其暴露給 QML。對(duì)于大多數(shù)公共 C++ 類,現(xiàn)在有一個(gè)相應(yīng)的同名 QML 項(xiàng)。所以QMediaPlayer并例如具有相應(yīng)QML MediaPlayer的具有相同的API作為C ++類的項(xiàng)目。
讓我們深入了解不同功能塊的更多細(xì)節(jié):
讓我們從設(shè)備發(fā)現(xiàn)開始。新的QMediaDevices 類旨在為您提供有關(guān)可用音頻和視頻設(shè)備的信息。它將允許您列出可用的音頻輸入(通常是麥克風(fēng))、音頻輸出(揚(yáng)聲器和耳機(jī))和攝像頭。您可以檢索默認(rèn)設(shè)備,類還會(huì)通知您有關(guān)配置的任何更改,例如,當(dāng)用戶連接外部耳機(jī)時(shí)。
QMediaDevices devices; connect(&devices, &QMediaDevices::audioInputsChanged, []() { qDebug() << “available audio inputs have changed”; }
此功能塊有助于使用原始 PCM 數(shù)據(jù)處理低電平音頻,并直接從音頻設(shè)備讀取或?qū)懭朐摂?shù)據(jù)。
這個(gè)塊在架構(gòu)上仍然與我們?cè)?Qt 5 中的非常相似,但很多細(xì)節(jié)都發(fā)生了變化。最值得注意的是,讀取或?qū)懭胍纛l設(shè)備的低級(jí)類已更改名稱。它們現(xiàn)在稱為QAudioSource 和QAudioSink。命名反映了它們的低級(jí)性質(zhì),并釋放了我們?cè)?Qt 5 中的舊名稱(QAudioInput和QAudioOutput)以用于播放和捕獲 API。
所述QAudioFormat API已被清理和簡(jiǎn)化,現(xiàn)在支撐4最常用的PCM數(shù)據(jù)格式(8位無符號(hào)整型,16和32位有符號(hào)整數(shù)和浮點(diǎn)數(shù)據(jù))。QAudioFormat還獲得了新的 API 來處理音頻通道的定位信息,但目前后端尚未完全支持。
我們還刪除了已棄用的QSound類。QSoundEffect是它以低延遲播放短聲音的替代品。QSoundEffect目前仍要求您使用 WAV 作為效果格式,但我們計(jì)劃擴(kuò)展此格式,并允許在 6.2 之后通過類播放壓縮的音頻數(shù)據(jù)。
處理媒體文件播放的主要類是QMediaPlayer。QMediaPlayer的API已經(jīng)比Qt 5簡(jiǎn)化了,我們現(xiàn)在已經(jīng)從該模塊中刪除了所有的播放列表功能,這些功能是內(nèi)置于Qt 5媒體播放器的,但使其API和實(shí)現(xiàn)變得復(fù)雜。我們計(jì)劃在6.2之后將播放列表功能作為一個(gè)單獨(dú)的獨(dú)立類,如果需要,你可以將其連接到QMediaPlayer。目前,如果需要,你可以在 "播放器 "的例子中找到一些處理播放列表的代碼。
另一方面,QMediaPlayer獲得了渲染字幕的能力,你現(xiàn)在可以使用setActiveAudioTrack()、setActiveVideoTrack()和setActiveSubtitleTrack()方法來檢查和選擇想要的音頻、視頻或字幕軌道。
Qt 6中的QMediaPlayer要求你使用setAudioOutput()和setVideoOutput()方法主動(dòng)連接到音頻和視頻輸出。不設(shè)置音頻輸出將意味著該媒體播放器不播放音頻。這是對(duì)Qt 5的改變,在Qt 5中,默認(rèn)的音頻輸出總是被選中。這個(gè)改變是為了讓音頻和視頻之間有一個(gè)對(duì)稱的API,并簡(jiǎn)化與QML的整合。
一個(gè)用C++實(shí)現(xiàn)的最小的媒體播放器看起來像這樣。
QMediaPlayer player; QAudioOutput audioOutput; // chooses the default audio routing player.setAudioOutput(&audioOutput); QVideoWidget *videoOutput = new QVideoWidget; player.setVideoOutput(videoOutput); player.setSource(“mymediafile.mp4”); player.play();
基于 C++/Widgets 的播放器示例具有更完整的實(shí)現(xiàn),它還支持字幕和音頻語言選擇以及顯示與媒體文件關(guān)聯(lián)的元數(shù)據(jù):
或使用 QML:
Window { MediaPlayer { id: mediaPlayer audioOutput: AudioOutput {} // 使用默認(rèn)的音頻路由 videoOutput: videoOutput source: “mymediafile.mp4” } VideoOutput { id: videoOutput anchors.fill : parent } Component.onCompleted: mediaPlayer.play() }
還有一個(gè)全新的基于 QML 的媒體播放器示例,使用 Qt Quick Controls 可用,您可以使用它:
除了QMediaPlayer 之外,Qt 6 還具有跨平臺(tái)支持,可以使用QAudioDecoder類將音頻文件解碼為原始 PCM 數(shù)據(jù)。該功能存在于 Qt 5 的某些平臺(tái)上,但并未在所有平臺(tái)上實(shí)現(xiàn)。
捕獲和記錄功能在 Qt 6 中經(jīng)歷了最大的 API 更改。在 Qt 5 中,您必須神奇地將相機(jī)連接到記錄器,而 Qt 6 現(xiàn)在帶有更明確的 API 來設(shè)置捕獲管道。
Qt 6 中的中心類是QMediaCaptureSession。錄制音頻/視頻或捕獲圖像時(shí)始終需要此類。要設(shè)置錄音會(huì)話,您可以使用setAudioInput()將音頻輸入連接到會(huì)話,如果您想從相機(jī)錄制,請(qǐng)使用setCamera()將相機(jī)連接到它。
這里要注意的一件事是QAudioInput和QCamera充當(dāng)兩個(gè)輸入通道。使用QAudioInput::setDevice()或QCamera::setCameraDevice()選擇要使用的物理設(shè)備。選擇設(shè)備后,QAudioInput和QCamera允許您更改該設(shè)備的屬性,例如設(shè)置音量或相機(jī)的分辨率和幀速率。
QMediaCaptureSession允許將音頻和視頻輸出連接到它以進(jìn)行預(yù)覽和監(jiān)視。要拍攝靜止圖像,請(qǐng)使用setImageCapture()將QImageCapture對(duì)象連接到它
QMediaCaptureSession session; QCamera camera; session.addCamera(&camera); QImageCapture imageCapture; session.addImageCapture(&imageCapture); camera.start(); imageCapture.captureToFile(“myimage.jpg”);
要錄制音頻和視頻,請(qǐng)將QMediaRecorder連接到會(huì)話。QMediaRecorder允許通過指定一個(gè)請(qǐng)求記錄特定的文件格式和編解碼器QMediaFormat。在 Qt 6 中,我們沒有在此處提供跨平臺(tái) API,使用不同格式和編解碼器的枚舉。由于編解碼器支持取決于平臺(tái),您還可以查詢QMediaFormat以獲取支持的文件格式和編解碼器集。后端還將始終嘗試將請(qǐng)求的格式解析為支持的格式。因此,例如,如果您請(qǐng)求帶有 H265 視頻編解碼器的 MPEG4 文件,但不支持 H265,則它可能會(huì)回退到 H264 或其他受支持的編解碼器。
QMediaRecorder recorder; session.setRecorder(&recorder); QMediaFormat format(QMediaFormat::MPEG4); format.setAudioCodec(QMediaFormat::AudioCodec::AAC); format.setVideoCodec(QMediaFormat::VideoCodec::H265); recorder.setMediaFormat(format); recorder.setOutputLocation(“mycapture.mp4”); recorder.record();
除了設(shè)置格式之外,您還可以在編碼器上設(shè)置其他屬性,例如質(zhì)量、分辨率和幀率。
====================================================
想要了解或購買Qt正版授權(quán)的朋友,歡迎,限時(shí)咨詢送開發(fā)教程!
Qt技術(shù)交流群現(xiàn)已開通,QQ搜索群號(hào)“765444821”或者掃描下方二維碼即可加入
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請(qǐng)務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請(qǐng)郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自: