Qt開源作品2-視頻流播放vlc內核

## 一、前言

上一個作品是ffmpeg內核做的,由於ffmpeg太過於強大,很多初學者會看的雲裡霧裡懵逼狀態,也有很多用戶只需要一個簡單的播放視頻流即可,根本不需要涉及到負責的解碼轉碼等,於是vlc就上場了,他就是直接對ffmpeg做了深層次的封裝,提供了友好的接口,具備這種境界的還有個mpv之類的,mpv相比於vlc還更牛逼在庫文件就一個,貌似是封裝成了靜態庫,不想vlc還要帶一堆的動態庫文件和插件文件,當然vlc的簡單在於只需要幾行代碼就可以擼起來,讓初學者看到效果很重要,很興奮,可以更快速的進行下一步的編碼中,體驗編碼的樂趣。

## 二、代碼思路

<code>第一步:引入vlc的頭文件
```c++
# ifdef __cplusplus
extern "C" {
# endif

#ifdef vlc3
#include <libvlc.h>
#include <libvlc>
#include <libvlc>
#include <libvlc>
#include <libvlc>
#include <libvlc>
#include <libvlc>
#include <libvlc>
#include <libvlc>
#include <libvlc>
#include <libvlc>
#include <deprecated.h>
#else
#include <libvlc.h>
#include <libvlc>
#include <libvlc>
#include <libvlc>
#include <libvlc>
#include <libvlc>
#include <libvlc>
#include <libvlc>
#include <libvlc>
#include <libvlc>
#include <deprecated.h>
#endif

# ifdef __cplusplus
}
# endif
```

第二步:設置句柄打開視頻流
```c++
bool VlcThread::init()
{
const char *tempArg = "";
const char *vlc_args[9] = {"-I", "dummy", "--no-osd", "--no-stats", "--ignore-config", "--no-video-on-top", "--no-video-title-show", "--no-snapshot-preview", tempArg};
vlcInst = libvlc_new(sizeof(vlc_args) / sizeof(vlc_args[0]), vlc_args);

if (vlcInst == NULL) {
return false;
}

vlcMedia = libvlc_media_new_location(vlcInst, url.toUtf8().constData());
vlcPlayer = libvlc_media_player_new_from_media(vlcMedia);
if (vlcPlayer == NULL) {
return false;
}

//設置播放句柄
VlcWidget *w = (VlcWidget *)this->parent();
#if defined(Q_OS_WIN)
libvlc_media_player_set_hwnd(vlcPlayer, (void *)w->winId());
#elif defined(Q_OS_LINUX)
libvlc_media_player_set_xwindow(vlcPlayer, w->winId());
#elif defined(Q_OS_MAC)
libvlc_media_player_set_nsobject(vlcPlayer, (void *)w->winId());
#endif

//設置硬件加速 none auto any d3d11va dxva2
setOption(QString(":avcodec-hw=%1").arg("none"));
//設置通信協議 tcp udp
setOption(QString(":rtsp-%1").arg("tcp"));
//設置緩存時間 默認500毫秒
setOption(QString(":network-caching=%1").arg(300));

libvlc_media_player_play(vlcPlayer);
//qDebug() << TIMEMS << "init vlc finsh";
return true;
}
```

第三步:暫停及釋放資源
```c++
void VlcThread::pause()
{
if (vlcPlayer != NULL) {
libvlc_media_player_pause(vlcPlayer);
}
}

void VlcThread::next()
{
if (vlcPlayer != NULL) {
libvlc_media_player_pause(vlcPlayer);
}

}

void VlcThread::free()
{
if (vlcInst != NULL) {
libvlc_release(vlcInst);
vlcInst = NULL;
}

if (vlcMedia != NULL) {
libvlc_media_release(vlcMedia);
vlcMedia = NULL;
}

if (vlcPlayer != NULL) {
libvlc_media_player_release(vlcPlayer);
vlcPlayer = NULL;
}

//qDebug() << TIMEMS << "close vlc ok";
}/<deprecated.h>/<libvlc>/<libvlc>/<libvlc>/<libvlc>/<libvlc>/<libvlc>/<libvlc>/<libvlc>/<libvlc>/<libvlc.h>/<deprecated.h>/<libvlc>/<libvlc>/<libvlc>/<libvlc>/<libvlc>/<libvlc>/<libvlc>/<libvlc>/<libvlc>/<libvlc>/<libvlc.h>/<code>

## 三、效果圖


Qt開源作品2-視頻流播放vlc內核


## 四、開源主頁

1. 國內站點:[https://gitee.com/feiyangqingyun/QWidgetDemo](https://gitee.com/feiyangqingyun/QWidgetDemo)

2. 國際站點:[https://github.com/feiyangqingyun/QWidgetDemo](https://github.com/feiyangqingyun/QWidgetDemo)


分享到:


相關文章: