日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

【C/C++】LibVLC库在逐帧提取的开发中回调设置帧格式

發(fā)布時間:2023/12/14 c/c++ 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【C/C++】LibVLC库在逐帧提取的开发中回调设置帧格式 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

  • 前言
  • 一、應(yīng)用場景
  • 二、API介紹
    • 1. libvlc_video_set_callbacks ()
    • 2. libvlc_video_set_format ()
    • 3. libvlc_video_set_format_callbacks ()
  • 二、逐幀提取
    • 1. 開發(fā)者設(shè)置幀格式
    • 2. 回調(diào)設(shè)置幀格式
  • 總結(jié)


前言

提示:libvlc_video_set_format_callbacks

在LibVLC對視頻媒體的逐幀提取開發(fā)中,void libvlc_video_set_format () 通常被開發(fā)者用來設(shè)置視頻的格式,但是不同視頻的格式是不同的,所以該函數(shù)是應(yīng)用于用戶已知媒體視頻的格式,用戶進行手動設(shè)置。接下來我將介紹由libvlc提供的void libvlc_video_set_format_callbacks () 回調(diào)設(shè)置視頻的原始幀格式,該函數(shù)也可以幫助開發(fā)者在視頻媒體播放前獲取到幀格式。


提示:以下是本篇文章正文內(nèi)容,下面案例可供參考

一、應(yīng)用場景

當(dāng)開發(fā)者需要對視頻媒體的幀進行處理、保存幀圖像、實現(xiàn)多屏播放等應(yīng)用場景時,逐幀提取是一個關(guān)鍵的技術(shù)。libvlc幫我們實現(xiàn)了逐幀提取的相關(guān)API,理解這些API是實現(xiàn)上述場景的核心。

二、API介紹

您可在https://videolan.videolan.me/vlc/group__libvlc__media__player.html#ga612605f2e5c638d9f4ed59021d714bf0查看這些API。

1. libvlc_video_set_callbacks ()

void libvlc_video_set_callbacks ( // 設(shè)置回調(diào),將解碼后的幀渲染并存儲到內(nèi)存中的自定義區(qū)域。libvlc_media_player_t * mp,libvlc_video_lock_cb lock,libvlc_video_unlock_cb unlock,libvlc_video_display_cb display,void * opaque )

2. libvlc_video_set_format ()

void libvlc_video_set_format ( // 配置幀的解碼格式libvlc_media_player_t * mp, const char * chroma, unsigned width, unsigned height, unsigned pitch )

3. libvlc_video_set_format_callbacks ()

版本:LibVLC 2.0.0 or later

libvlc_video_set_format_callbacks ( // 設(shè)置回調(diào),配置幀的解碼格式libvlc_media_player_t * mp, libvlc_video_format_cb setup, libvlc_video_cleanup_cb cleanup )

二、逐幀提取

1. 開發(fā)者設(shè)置幀格式

因為我看到很多的平臺都由相關(guān)的 libvlc_video_set_format () 使用介紹,所以在此我不再贅述。如果有需要,可以參考https://jishuin.proginn.com/p/763bfbd2afc3。

2. 回調(diào)設(shè)置幀格式

代碼如下(示例):
因為本人是在Qt + VLC的開發(fā)環(huán)境下,所以會使用部分Qt的工具,如果你是純C++開發(fā)者,你可以用C++相應(yīng)的工具替換它們。
本人的開發(fā)環(huán)境:Linux、Qt、C++

#include <QDebug> #include <QMutex> #include <QThread>struct Context {QMutex mutex;int width;int height;uchar * pixels; };static Context *g_pContxt = nullptr;static void *lock(void */*opaque*/, void **planes) {g_pContxt->mutex.lock();*planes = g_pContxt->pixels;return NULL; }static void unlock(void */*opaque*/, void */*picture*/, void *const *planes) {unsigned char *data = (unsigned char *)*planes; // planes即為幀數(shù)據(jù)/*處理幀數(shù)據(jù)data*/g_pContxt->mutex.unlock(); }static void display(void *opaque, void *picture) {(void)opaque; }static unsigned setup(void** /*opaque*/, char* chroma, unsigned *width, unsigned *height, unsigned *pitches, unsigned *lines) {qDebug() << "chroma:" << QString(chroma) << "width:" << *width << ", height:" << *height;/* 開辟存放圖像數(shù)據(jù)的內(nèi)存塊 */if (g_pContxt){if (g_pContxt->pixels){delete[] g_pContxt->pixels;g_pContxt->pixels = NULL;}delete g_pContxt;g_pContxt = NULL;}int w = *width;int h = *height;g_pContxt = new Context;g_pContxt->pixels = new uchar[w * h * 4]; // 申請大小也為4通道的像素memset(g_pContxt->pixels, 0, g_pContxt->width * g_pContxt->height * 4);memcpy(chroma, "RV32", 4);g_pContxt->width = w;g_pContxt->height = h;*pitches= w * 4;*lines= h;return 1; }int main() {const char *fileName= "1.mp4"; // 設(shè)置你自己的媒體文件路徑名libvlc_instance_t *m_pVlcInst = libvlc_new(0, NULL);libvlc_media_t *pMedia = libvlc_media_new_path(m_pVlcInst, fileName); // 媒體libvlc_media_player_t *m_pVlcPlayer = libvlc_media_player_new_from_media(pMedia);libvlc_media_release(pMedia); // 釋放媒體對象pMedia = nullptr;/* 設(shè)置逐幀提取 */libvlc_video_set_callbacks(m_pVlcPlayer, lock, unlock, display, NULL); // 設(shè)置幀回調(diào),用來抓取解碼后的幀libvlc_video_set_format_callbacks(m_pVlcPlayer, setup, NULL); // 設(shè)置格式回調(diào),用來設(shè)置解碼后的幀格式/* 播放和停止媒體 */libvlc_media_player_play(m_pVlcPlayer);QThread::sleep(100);libvlc_media_player_stop(m_pVlcPlayer);/* 釋放資源 */libvlc_media_player_release(m_pVlcPlayer);m_pVlcPlayer = nullptr;libvlc_release(m_pVlcInst);m_pVlcInst = nullptr;if (g_pContxt){if (g_pContxt->pixels){delete[] g_pContxt->pixels;g_pContxt->pixels = nullptr;}delete g_pContxt;g_pContxt = nullptr;} }

總結(jié)

如果用戶需要對不同視頻媒體進行逐幀提取時,用戶需要重復(fù)設(shè)置不同的幀格式。因為保持相同的幀格式應(yīng)用在不同的視頻媒體上,往往會帶來幀的橫向或縱向的拉伸。而回調(diào)設(shè)置幀格式的方法很好的解決了開發(fā)者手動設(shè)置幀格式的繁瑣和弊端。
希望您能仔細閱讀,因為發(fā)現(xiàn)和指正文章中的不足之處,是對我莫大的提升,謝謝!

總結(jié)

以上是生活随笔為你收集整理的【C/C++】LibVLC库在逐帧提取的开发中回调设置帧格式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。