qt显示rgba8888 如何改 frame_Qt音视频开发2-vlc回调处理
## 一、前言
用句柄來顯示視頻,方便是很方便,但是有個(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對(duì)應(yīng)Qt中的Format_RGB32,RGBA對(duì)應(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. 支持h265視頻流+rtmp等常見視頻流。
11. 可暫停播放和繼續(xù)播放。
12. 支持回調(diào)模式和句柄兩種模式。
13. 支持線程讀取進(jìn)度等信息和事件回調(diào)兩種處理模式。
14. 自動(dòng)將當(dāng)前播放位置和音量大小是否靜音以信號(hào)發(fā)出去。
15. 提供接口設(shè)置播放位置和音量及設(shè)置靜音。
16. 支持存儲(chǔ)單個(gè)視頻文件和定時(shí)存儲(chǔ)視頻文件。
17. 自定義頂部懸浮條,發(fā)送單擊信號(hào)通知,可設(shè)置是否啟用。
## 三、效果圖
## 四、相關(guān)站點(diǎn)
1. 國內(nèi)站點(diǎn):[https://gitee.com/feiyangqingyun/QWidgetDemo](https://gitee.com/feiyangqingyun/QWidgetDemo)
2. 國際站點(diǎn):[https://github.com/feiyangqingyun/QWidgetDemo](https://github.com/feiyangqingyun/QWidgetDemo)
3. 個(gè)人主頁:[https://blog.csdn.net/feiyangqingyun](https://blog.csdn.net/feiyangqingyun)
4. 知乎主頁:[https://www.zhihu.com/people/feiyangqingyun/](https://www.zhihu.com/people/feiyangqingyun/)
5. 體驗(yàn)地址:[https://blog.csdn.net/feiyangqingyun/article/details/97565652](https://blog.csdn.net/feiyangqingyun/article/details/97565652)
## 五、核心代碼
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;}//####################總結(jié)
以上是生活随笔為你收集整理的qt显示rgba8888 如何改 frame_Qt音视频开发2-vlc回调处理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python三个点画正弦线_python
- 下一篇: python1到1000的质数_pyth