Qt音視訊開發13-mpv錄影儲存
阿新 • • 發佈:2020-08-19
一、前言
用mpv來做錄影儲存,儲存視訊檔案,從來都沒有如此的方便,直接設定屬性stream-record對應的檔案路徑即可,我的乖乖,一行程式碼,如此精簡美麗大方,搞得我都不敢相信自己的眼睛,mpv除了支援主流的win、linux、mac三大作業系統外,還支援手機安卓IOS等,尤其是居然支援各種嵌入式linux,記得vlc想要在嵌入式linux上交叉編譯成功的話,難於上青天,各種外掛的依賴實在是太多了,直到你放棄為止,在X86的linux系統還是比較方便一些的,而在這塊,mpv簡直是完爆vlc啊,直接命令列都可以在嵌入式linux上安裝呢,內建的ffmpeg超強解碼器,使得你可以直接命令列呼叫mpv來播放音視訊,這在一些嵌入式linux上Qt無法播放音視訊的場景,非常有用,本人在全志H3板子上使用的就是mpv來播放音視訊,預設GPU解碼使得CPU佔用極地。
前面幾篇文章寫過vlc的錄影儲存和ffmpeg的錄影儲存,都是同時支援了儲存成一個視訊檔案和定時儲存成不同的視訊檔案,這個功能都採用了同樣的策略,那就開個定時器來處理,比如開啟了定時儲存的話,到了時間先停止錄影,然後再重新開始錄影,重新設定新的視訊檔名稱,這樣來實現的,同樣的在mpv這裡也是這樣處理的,先設定屬性stream-record為空字串則表示停止錄影,然後再重新設定屬性stream-record為新的檔名稱即可。
二、功能特點
- 多執行緒實時播放視訊流+本地視訊等。
- 支援windows+linux+mac。
- 多執行緒顯示影象,不卡主介面。
- 自動重連網路攝像頭。
- 可設定是否儲存到檔案以及檔名。
- 可直接拖曳檔案到mpvwidget控制元件播放。
- 支援h265視訊流+rtmp等常見視訊流。
- 可暫停播放和繼續播放。
- 支援儲存單個視訊檔案和定時儲存視訊檔案。
- 自定義頂部懸浮條,傳送單擊訊號通知,可設定是否啟用。
- 可設定畫面拉伸填充或者等比例填充。
- 可對視訊進行截圖(原始圖片)和截圖。
- 錄影檔案儲存MP4檔案。
- 支援qsv、dxva2、d3d11va等硬解碼。
三、效果圖
四、相關站點
- 國內站點:https://gitee.com/feiyangqingyun/QWidgetDemo
- 國際站點:https://github.com/feiyangqingyun/QWidgetDemo
- 個人主頁:https://blog.csdn.net/feiyangqingyun
- 知乎主頁:https://www.zhihu.com/people/feiyangqingyun/
- 體驗地址:https://blog.csdn.net/feiyangqingyun/article/details/97565652
五、核心程式碼
void MpvThread::initSave()
{
if (!saveFile) {
return;
}
if (saveInterval == 0) {
saveVideo(fileName);
}
}
void MpvThread::saveVideo()
{
if (!saveFile) {
return;
}
//重新設定檔名稱
QString dirName = QString("%1/%2").arg(savePath).arg(QDATE);
newDir(dirName);
fileName = QString("%1/%2_%3.mp4").arg(dirName).arg(fileFlag).arg(STRDATETIME);
saveVideo(fileName);
}
void MpvThread::saveVideo(const QString &fileName)
{
if (mpvPlayer) {
//轉成平臺的路徑,否則中文目錄可能不認識
QString file = QDir::toNativeSeparators(fileName);
QByteArray data = file.toUtf8();
setValue("stream-record", "");
setValue("stream-record", data.constData());
}
}