1. 程式人生 > 實用技巧 >Qt音視訊開發13-mpv錄影儲存

Qt音視訊開發13-mpv錄影儲存

一、前言

用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為新的檔名稱即可。

二、功能特點

  1. 多執行緒實時播放視訊流+本地視訊等。
  2. 支援windows+linux+mac。
  3. 多執行緒顯示影象,不卡主介面。
  4. 自動重連網路攝像頭。
  5. 可設定是否儲存到檔案以及檔名。
  6. 可直接拖曳檔案到mpvwidget控制元件播放。
  7. 支援h265視訊流+rtmp等常見視訊流。
  8. 可暫停播放和繼續播放。
  9. 支援儲存單個視訊檔案和定時儲存視訊檔案。
  10. 自定義頂部懸浮條,傳送單擊訊號通知,可設定是否啟用。
  11. 可設定畫面拉伸填充或者等比例填充。
  12. 可對視訊進行截圖(原始圖片)和截圖。
  13. 錄影檔案儲存MP4檔案。
  14. 支援qsv、dxva2、d3d11va等硬解碼。

三、效果圖

四、相關站點

  1. 國內站點:https://gitee.com/feiyangqingyun/QWidgetDemo
  2. 國際站點:https://github.com/feiyangqingyun/QWidgetDemo
  3. 個人主頁:https://blog.csdn.net/feiyangqingyun
  4. 知乎主頁:https://www.zhihu.com/people/feiyangqingyun/
  5. 體驗地址: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());
    }
}