中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Qt mpv讀取和控制怎么實現

發布時間:2021-12-15 10:04:42 來源:億速云 閱讀:200 作者:iii 欄目:互聯網科技

這篇文章主要介紹“Qt mpv讀取和控制怎么實現”,在日常操作中,相信很多人在Qt mpv讀取和控制怎么實現問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Qt mpv讀取和控制怎么實現”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

一、前言

用mpv來讀取文件的信息,以及設置當前播放進度,音量、靜音等,和當時vlc封裝的功能一樣,只不過vlc是通過調用函數接口去處理,而mpv是通過讀取和設置屬性來處理,vlc支持定時器或者線程中函數方法去讀取狀態,也支持事件回調去拿到對應的狀態改變,mpv當然也支持,而且還更方便,主要的工作量或者花費的時間在如何知道有哪些屬性、分別是什么功能含義,這個在官方都列出來了(http://mpv.io/manual/master/#options、http://mpv.io/manual/master/#list-of-input-commands、http://mpv.io/manual/master/#properties),不過都是英文就是,大部分程序員應該是沒有什么難度的,大不了鼠標右鍵翻譯成中文即可,哈哈,相信不少人都這么干過,很多瀏覽器默認就支持鼠標右鍵菜單翻譯的,實在是很方便的,本人在查閱很多英文文檔的時候,用的也是蠻多的,包括Qt官方的文檔和BUG報告頁面,但是建議在搜索問題的時候還是建議盡量用英文的描述去搜索,這樣才能搜索的更精確。

常用的一些屬性:

  1. 視頻原始寬度高度 width height

  2. 視頻縮放后寬度高度 dwidth dheight

  3. 保存視頻文件 stream-record 為空則表示停止錄像

  4. 視頻寬高比 video-aspect

  5. 暫停播放 pause yes表示暫停no表示繼續

  6. 視頻文件時長 duration

  7. 靜音 mute yes表示靜音no表示非靜音

  8. 音量 volume int值0-100

  9. 獲取播放進度 time-pos

  10. 設置播放進度 seek

  11. 當前音軌 aid

  12. 音軌數量 track-list/count

  13. 截圖 screenshot-to-file

二、功能特點

  1. 多線程實時播放視頻流+本地視頻等。

  2. 支持windows+linux+mac。

  3. 多線程顯示圖像,不卡主界面。

  4. 自動重連網絡攝像頭。

  5. 可設置是否保存到文件以及文件名。

  6. 可直接拖曳文件到mpvwidget控件播放。

  7. 支持h365視頻流+rtmp等常見視頻流。

  8. 可暫停播放和繼續播放。

  9. 支持存儲單個視頻文件和定時存儲視頻文件。

  10. 自定義頂部懸浮條,發送單擊信號通知,可設置是否啟用。

  11. 可設置畫面拉伸填充或者等比例填充。

  12. 可對視頻進行截圖(原始圖片)和截屏。

  13. 錄像文件存儲MP4文件。

  14. 支持qsv、dxva2、d3d11va等硬解碼。

三、效果圖

Qt mpv讀取和控制怎么實現

四、核心代碼

void MpvThread::readMediaInfo()
{
    if (mpvPlayer != NULL) {
        QVariant width = getValue("width");
        QVariant height = getValue("height");
        videoWidth = width.toInt();
        videoHeight = height.toInt();
        qDebug() << TIMEMS << url << "videoWidth:" << videoWidth << "videoHeight:" << videoHeight;
    }
}

void MpvThread::readPlayInfo()
{
    //定義長度變量用于存儲文件時長
    uint length = getLength();
    //定義變量存儲聲音大小,默認值1
    int volume = getVolume();
    //定義變量存儲是否靜音
    bool mute = getMute();

    //發送文件時長信號
    emit fileLengthReceive(length);
    //發送當前音量值信號
    emit fileVolumeReceive(volume, mute);

    //改變標志位啟動讀取播放進度
    if (!callbackevent) {
        isReadPosition = true;
    }
}

void MpvThread::readPosition()
{
    //獲取播放進度位置
    int position = getPosition();
    //獲取是否播放結束
    bool isPlay = (position != 0);
    if (position > 0 && !isRtsp) {
        emit filePositionReceive(position, isPlay);
    }

    //本地文件播放結束
    if (!isPlay && !isRtsp && suffix != "dshow") {
        this->stop();
    }
}

void MpvThread::setSize()
{
    if (mpvPlayer != NULL) {
        double width = playWidget->width();
        double height = playWidget->height();
        setValue("video-aspect", width / height);
    }
}

bool MpvThread::getIsPlaying()
{
    //在視頻流模式下,不是暫停狀態,當前的位置和上一次的位置一致則表示斷了
    //進度為0表示沒有播放成功也需要重新加載
    bool isPlay = this->isRunning();
    if (isPlay && isRtsp && !getValue("pause").toBool()) {
        int position = getPosition();
        if (position == 0 || this->position == position) {
            isPlay = false;
        }

        this->position = position;
    }

    return isPlay;
}

uint MpvThread::getLength()
{
    uint length = 0;
    if (mpvPlayer != NULL) {
        QVariant value = getValue("duration");
        length = value.toDouble() * 1000;
    }

    return length;
}

uint MpvThread::getPosition()
{
    uint positon = 0;
    if (mpvPlayer != NULL) {
        QVariant value = getValue("time-pos");
        positon = value.toDouble() * 1000;
    }

    return positon;
}

void MpvThread::setPosition(int position)
{
    if (mpvPlayer != NULL && !isRtsp) {
        command(QVariantList() << "seek" << position / 1000 << "absolute");
    }
}

bool MpvThread::getMute()
{
    bool ok = false;
    if (mpvPlayer != NULL) {
        QVariant value = getValue("mute");
        ok = !value.toBool();
    }

    return ok;
}

void MpvThread::setMute(bool mute)
{
    if (mpvPlayer != NULL) {
        setValue("mute", mute ? "yes" : "no");
    }
}

int MpvThread::getVolume()
{
    int volume = 0;
    if (mpvPlayer != NULL) {
        QVariant value = getValue("volume");
        volume = value.toInt();
    }

    return volume;
}

void MpvThread::setVolume(int volume)
{
    if (mpvPlayer != NULL) {
        setValue("volume", volume);
    }
}

int MpvThread::getTrack()
{
    int track = 0;
    if (mpvPlayer != NULL) {
        QVariant value = getValue("aid");
        track = value.toInt();
    }

    return track;
}

int MpvThread::getTrackCount()
{
    int trackCount = 0;
    if (mpvPlayer != NULL) {
        QVariant value = getValue("track-list/count");
        trackCount = value.toInt();
    }

    return trackCount;
}

void MpvThread::setTrack(int track)
{
    if (mpvPlayer != NULL) {
        setValue("aid", track);
    }
}

到此,關于“Qt mpv讀取和控制怎么實現”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

qt
AI

西充县| 邹平县| 彰化县| 宝坻区| 平原县| 天台县| 清原| 邹平县| 民乐县| 叶城县| 安西县| 台东县| 平度市| 遵义县| 乌恰县| 大渡口区| 额尔古纳市| 洪雅县| 塘沽区| 汤原县| 太康县| 双牌县| 邓州市| 武义县| 惠安县| 营口市| 温宿县| 从化市| 萝北县| 怀来县| 大理市| 南安市| 九寨沟县| 阳新县| 大城县| 平顶山市| 宝坻区| 连江县| 拉孜县| 行唐县| 新野县|