溫馨提示×

溫馨提示×

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

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

Qt mpv讀取和控制怎么實現(xiàn)

發(fā)布時間:2021-12-15 10:04:42 來源:億速云 閱讀:192 作者:iii 欄目:互聯(lián)網(wǎng)科技

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

一、前言

用mpv來讀取文件的信息,以及設置當前播放進度,音量、靜音等,和當時vlc封裝的功能一樣,只不過vlc是通過調(diào)用函數(shù)接口去處理,而mpv是通過讀取和設置屬性來處理,vlc支持定時器或者線程中函數(shù)方法去讀取狀態(tài),也支持事件回調(diào)去拿到對應的狀態(tài)改變,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表示繼續(xù)

  6. 視頻文件時長 duration

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

  8. 音量 volume int值0-100

  9. 獲取播放進度 time-pos

  10. 設置播放進度 seek

  11. 當前音軌 aid

  12. 音軌數(shù)量 track-list/count

  13. 截圖 screenshot-to-file

二、功能特點

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

  2. 支持windows+linux+mac。

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

  4. 自動重連網(wǎng)絡攝像頭。

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

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

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

  8. 可暫停播放和繼續(xù)播放。

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

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

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

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

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

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

三、效果圖

Qt mpv讀取和控制怎么實現(xiàn)

四、核心代碼

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

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

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

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

    //本地文件播放結(jié)束
    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()
{
    //在視頻流模式下,不是暫停狀態(tài),當前的位置和上一次的位置一致則表示斷了
    //進度為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讀取和控制怎么實現(xiàn)”的學習就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關知識,請繼續(xù)關注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

向AI問一下細節(jié)

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

qt
AI