溫馨提示×

溫馨提示×

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

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

Qt vlc回調(diào)處理方法是什么

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

本篇內(nèi)容介紹了“Qt vlc回調(diào)處理方法是什么”的有關(guān)知識,在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

一、前言

用句柄來顯示視頻,方便是很方便,但是有個(gè)缺點(diǎn)就是不能拿到實(shí)時(shí)視頻的每張圖片的數(shù)據(jù),這個(gè)就比較討厭,大部分的監(jiān)控行業(yè)的應(yīng)用,除了截圖以外,很可能需要拿到圖片自己做一些處理的,而且拿到圖片自己繪制的話,這個(gè)靈活性就大大增強(qiáng)了,比如繪制各種OSD標(biāo)簽,想怎么繪制就怎么繪制,想在那里繪制就在那里繪制,句柄的話還得搞個(gè)標(biāo)簽沒有父類自動(dòng)跟隨移動(dòng)非常討厭,一個(gè)通道就好幾個(gè)標(biāo)簽,32個(gè)通道那就快上百個(gè)標(biāo)簽了,效率蠻低的,處理方式看起來傻傻的,每次移動(dòng)這每個(gè)通道都要給標(biāo)簽自動(dòng)計(jì)算位置并move過去。

于是回調(diào)就很有必要的,一個(gè)好處是可以拿到圖片本身的數(shù)據(jù)用來額外的處理比如人工智能分析人臉分析等,還有一個(gè)好處是OSD標(biāo)簽等東西可以自己自由繪制,在vlc中回調(diào)的數(shù)據(jù)格式可以自行指定,比如RV32對應(yīng)Qt中的Format_RGB32,RGBA對應(yīng)Qt中的Format_RGBA8888,YUYV則可以直接用QOpenGlWidget來顯示,通過GPU來顯示還是很好地,大大降低CPU的占用。

二、功能特點(diǎn)

  1. 多線程實(shí)時(shí)播放視頻流和本地視頻。

  2. 支持windows+linux+mac,支持vlc2和vlc3。

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

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

  5. 可設(shè)置邊框大小即偏移量和邊框顏色。

  6. 可設(shè)置是否繪制OSD標(biāo)簽即標(biāo)簽文本或圖片和標(biāo)簽位置。

  7. 可設(shè)置兩種OSD位置和風(fēng)格。

  8. 可設(shè)置是否保存到文件以及文件名。

  9. 可直接拖曳文件到vlcwidget控件播放。

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

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

  12. 支持回調(diào)模式和句柄兩種模式。

  13. 支持線程讀取進(jìn)度等信息和事件回調(diào)兩種處理模式。

  14. 自動(dòng)將當(dāng)前播放位置和音量大小是否靜音以信號發(fā)出去。

  15. 提供接口設(shè)置播放位置和音量及設(shè)置靜音。

  16. 支持存儲(chǔ)單個(gè)視頻文件和定時(shí)存儲(chǔ)視頻文件。

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

三、效果圖

Qt vlc回調(diào)處理方法是什么

四、核心代碼

if (callback) {
    callbackData = new CallbackData;
    callbackData->thread = this;
    callbackData->pixels = new uchar[bufferWidth * bufferHeight * 4];
    memset(callbackData->pixels, 0, bufferWidth * bufferHeight * 4);

    int width = callbackData->thread->getBufferWidth();
    int height = callbackData->thread->getBufferHeight();

    //設(shè)置回調(diào)拿到每幀數(shù)據(jù)
    libvlc_video_set_callbacks(vlcPlayer, lock, unlock, display, callbackData);
    //設(shè)置每幀格式 RV32-Format_RGB32  RGBA-Format_RGBA8888 YUYV I420
    libvlc_video_set_format(vlcPlayer, "RV32", width, height, width * 4);
}

//#######拿到一幀數(shù)據(jù)回調(diào)
typedef struct CallbackData {
    QMutex mutex;
    VlcThread *thread;
    uchar *pixels;
} CallbackData;

static void *lock(void *op, void **plane)
{
    CallbackData *callbackData = (CallbackData *)op;
    callbackData->mutex.lock();
    *plane = callbackData->pixels;
    return NULL;
}

static void unlock(void *op, void *pic, void *const *plane)
{
    CallbackData *callbackData = (CallbackData *)op;
    uchar *data = (uchar *)*plane;
    int width = callbackData->thread->getBufferWidth();
    int height = callbackData->thread->getBufferHeight();
    QImage image(data, width, height, QImage::Format_RGB32);

    callbackData->thread->setImage(image);
    callbackData->mutex.unlock();
}

static void display(void *op, void *pic)
{
    (void)op;
}
//####################

“Qt vlc回調(diào)處理方法是什么”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

向AI問一下細(xì)節(jié)

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

AI