測試環(huán)境
- MSVC-2015
- Qt 5.14.2
- QCreator
1. libVLC(關鍵步驟)
參考:心流劍
libVLC 各版本 下載鏈接
我的下載版本為:3.0.11
- sdk/lib文件夾目錄
- qmake vlc 部分的配置(路徑根據自己的修改)
- 只需要: libvlc.lib、libvlccore.lib
##################### VLC 庫 ############################
INCLUDEPATH += $$PWD/../vlc/sdk/include
LIBS += -L$$PWD/../vlc/sdk/lib
LIBS += -llibvlccore
LIBS += -llibvlc
############ 設置輸出路徑、文件名、加載的鏈接庫 ###############
CONFIG(debug, debug|release){
DESTDIR =$$PWD/../bin_Debug # 輸出目錄
TARGET = XVLCDemod # 輸出文件名
}
else{
DESTDIR =$$PWD/../bin_Release
TARGET = XVLCDemo
}
- 把 plugins 文件夾、libvlc.dll、libvlccore.dll 復制到 bin_Debug / bin_Release
#include <QCoreApplication>
#ifdef _WIN32
#include <basetsd.h>
typedef SSIZE_T ssize_t;
#endif
#include <QDebug>
#include "vlc/vlc.h"
int main(int argc, char *argv[])
{
// QCoreApplication a(argc, argv);
libvlc_instance_t * pInstance = nullptr;
libvlc_media_player_t * pPlayer = nullptr;
libvlc_media_t * pMedia = nullptr;
libvlc_time_t length;
int width;
int height;
int wait_time = 5000;
//libvlc_time_t length;
/* Load the VLC engine */
pInstance = libvlc_new(0, NULL);
//Create a new item
//Method 1:
//m = libvlc_media_new_location (inst, "file:///F:\\movie\\cuc_ieschool.flv");
//Screen Capture
//m = libvlc_media_new_location (inst, "screen://");
//Method 2:
// 創(chuàng)建一個流媒體(視頻/音頻對象)
pMedia = libvlc_media_new_path(pInstance, "C:\\Users\\YuLei\\Desktop\\ch4.mp4");
if (!pMedia)
{
qDebug() << "libvlc_media_new_path fail!!!";
return -1;
}
// 創(chuàng)建一個播放窗口(環(huán)境),加載流
pPlayer = libvlc_media_player_new_from_media(pMedia);
/* No need to keep the media now */
libvlc_media_release(pMedia);
// play the media_player
libvlc_media_player_play(pPlayer);
//wait until the tracks are created
_sleep(wait_time);
length = libvlc_media_player_get_length(pPlayer);
width = libvlc_video_get_width(pPlayer);
height = libvlc_video_get_height(pPlayer);
printf("Stream Duration: %ds\n", length / 1000);
printf("Resolution: %d x %d\n", width, height);
//Let it play
_sleep(length - wait_time);
// Stop playing
libvlc_media_player_stop(pPlayer);
// Free the media_player
libvlc_media_player_release(pPlayer);
libvlc_release(pInstance);
return 0;
// return a.exec();
}
2. VLC-Qt(關鍵步驟)
VLC-Qt 下載地址
參考鏈接1:鏈接
參考鏈接2:鏈接
- v1.1.1版本僅提供源碼
- 采用 v1.1.0 版本 鏈接
文章來源:http://www.zghlxwxcb.cn/news/detail-520188.html
- qmake 配置
##################### VLC 庫 ############################
INCLUDEPATH += $$PWD/../vlc_qt/include
LIBS += -L$$PWD/../vlc_qt/lib
CONFIG(debug, debug|release){
LIBS += -lVLCQtCored
LIBS += -lVLCQtWidgetsd
}
else{
LIBS += -lVLCQtCore
LIBS += -lVLCQtWidgets
}
############ 設置輸出路徑、文件名、加載的鏈接庫 ###############
CONFIG(debug, debug|release){
DESTDIR =$$PWD/../bin_Debug # 輸出目錄
TARGET = QVLCDemod # 輸出文件名
}
else{
DESTDIR =$$PWD/../bin_Release
TARGET = QVLCDemo
}
抽幀
libVLC
參考鏈接1
參考鏈接2文章來源地址http://www.zghlxwxcb.cn/news/detail-520188.html
/**
* mp:媒體播放器
* lock:回調以鎖定視頻內存(不能為 NULL)
* unlock:回調以解鎖視頻內存(如果不需要,則為 NULL)
* display:回調以顯示視頻(如果不需要,則為 NULL)
* opaque:這三個回調的私有指針(作為第一個參數)
*/
void libvlc_video_set_callbacks( libvlc_media_player_t *mp,
libvlc_video_lock_cb lock,
libvlc_video_unlock_cb unlock,
libvlc_video_display_cb display,
void *opaque );
// 當需要解碼新的視頻幀時,就會調用 lock 回調。
typedef void *(*libvlc_video_lock_cb)(void *opaque, void **planes);
// 當視頻幀解碼完成后,將調用 unlock 回調。
typedef void (*libvlc_video_unlock_cb)(void *opaque, void *picture,
void *const *planes);
// 當視頻幀需要顯示時,將調用 display 回調。
typedef void (*libvlc_video_display_cb)(void *opaque, void *picture);
#include
#include
#include
#include
#include
// 定義輸出視頻的分辨率
#define VIDEO_WIDTH 640
#define VIDEO_HEIGHT 480
struct Context {
QMutex mutex;
uchar *pixels;
};
static void *lock(void *opaque, void **planes)
{
struct Context *ctx = static_cast(opaque);
ctx->mutex.lock();
// 告訴 VLC 將解碼的數據放到緩沖區(qū)中
*planes = ctx->pixels;
return nullptr;
}
// 獲取 argb 圖片并保存到文件中
static void unlock(void *opaque, void *picture, void *const *planes)
{
Q_UNUSED(picture);
struct Context *ctx = static_cast(opaque);
unsigned char *data = static_cast<unsigned char *>(*planes);
static int frameCount = 1;
QImage image(data, VIDEO_WIDTH, VIDEO_HEIGHT, QImage::Format_ARGB32);
image.save(QString("frame_%1.png").arg(frameCount++));
ctx->mutex.unlock();
}
static void display(void *opaque, void *picture)
{
Q_UNUSED(picture);
(void)opaque;
}
int main()
{
const char *localMrl = "Sample.mkv";
struct Context ctx;
ctx.pixels = new uchar[VIDEO_WIDTH * VIDEO_HEIGHT * 4];
memset(ctx.pixels, 0, VIDEO_WIDTH * VIDEO_HEIGHT * 4);
libvlc_instance_t *instance;
libvlc_media_player_t *player;
libvlc_media_t *media;
instance = libvlc_new(0, nullptr);
media = libvlc_media_new_path(instance, localMrl);
player = libvlc_media_player_new_from_media(media);
// 設置回調,用于提取幀或者在界面上顯示。
libvlc_video_set_callbacks(player, lock, unlock, display, &ctx);
libvlc_video_set_format(player, "RGBA", VIDEO_WIDTH, VIDEO_HEIGHT, VIDEO_WIDTH * 4);
libvlc_media_player_play(player);
QThread::sleep(10);
libvlc_media_release(media);
libvlc_media_player_release(player);
libvlc_release(instance);
return 0;
}
到了這里,關于用VLC開發(fā)視頻播放器/組件(兩種方式:libVLC / VLC-Qt)的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!