用VLC开发视频播放器/组件(两种方式:libVLC / VLC-Qt)
测试环境
- 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_ReleaseTARGET = 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:// 创建一个流媒体(视频/音频对象)pMedia = libvlc_media_new_path(pInstance, "C:\\Users\\YuLei\\Desktop\\ch4.mp4");if (!pMedia){qDebug() << "libvlc_media_new_path fail!!!";return -1;}// 创建一个播放窗口(环境),加载流pPlayer = libvlc_media_player_new_from_media(pMedia);/* No need to keep the media now */libvlc_media_release(pMedia);// play the media_playerlibvlc_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 playinglibvlc_media_player_stop(pPlayer);// Free the media_playerlibvlc_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 版本 链接
- qmake 配置
##################### VLC 库 ############################
INCLUDEPATH += $$PWD/../vlc_qt/include
LIBS += -L$$PWD/../vlc_qt/lib
CONFIG(debug, debug|release){LIBS += -lVLCQtCoredLIBS += -lVLCQtWidgetsd
}
else{LIBS += -lVLCQtCoreLIBS += -lVLCQtWidgets
}############ 设置输出路径、文件名、加载的链接库 ###############
CONFIG(debug, debug|release){DESTDIR =$$PWD/../bin_Debug # 输出目录TARGET = QVLCDemod # 输出文件名
}
else{DESTDIR =$$PWD/../bin_ReleaseTARGET = QVLCDemo
}
抽帧
libVLC
参考链接1
参考链接2
/*** 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 480struct Context {QMutex mutex;uchar *pixels;
};static void *lock(void *opaque, void **planes)
{struct Context *ctx = static_cast(opaque);ctx->mutex.lock();// 告诉 VLC 将解码的数据放到缓冲区中*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开发视频播放器/组件(两种方式:libVLC / VLC-Qt)相关推荐
- 前端系列——vue2+高德地图web端开发(poi搜索两种方式)
前端系列--vue2+高德地图web端开发(poi搜索) 前言 基础 什么是poi搜索 1. 输入提示结合poi搜索 官方代码 步骤 1.进行plugins插件注册 2.data中编写placeSea ...
- 微信开发网页授权的两种方式
第一步在微信公众平台中找到网页授权 然后再填写授权回调页面,这里的页面如同手册里面一样 以xxx.xxxxx.com 即可 而且此处的域名一定要和代码中回调地址在同一个域名之下. 关于网页授权的两 ...
- Autofac 设置方法拦截器的两种方式
前提 1.Nuget安装Autofac 4.0以下版本 4.0及4.0 以上版本暂时没找到合适的方案 2.Nuget安装Autofac.Extras.DynamicProxy2 3.创建一个类似下面 ...
- iOS开发图片纯色填充(两种方式)和缩小图片
UIImage图标换色和变换大小 这里的图片大都指只有两个色的图标,有时候我们的图标需要根据不同的状态显示不同的颜色,有一种简单的处理方式是,将不同状态的颜色图标都切出来,变换状态的时候直接使用相应的 ...
- typescript 从零开发视频播放器
typescript 从零开发视频播放器 前言 项目架构设计 技术栈 双端支持 元素的显示和隐藏说明 组件化开发 组件之间的通讯 拖拽行为 初始化模板 video 标签组件 控制器的显示和隐藏 显示时 ...
- 只有你项目不到,Electron也可以开发视频播放器
一.桌面版视频播放器 今天又发现一款强大的开源软件,electron 开发的一个可以播放国内主流视频(腾讯.爱奇艺.优酷.芒果.乐视)的播放器.而且播放视频可直接跳过广告.好的开源项目第一时间分享给大 ...
- 只有你想不到,Electron也可以开发视频播放器
## 一.桌面版视频播放器 今天又发现一款强大的开源软件,electron 开发的一个可以播放国内主流视频(腾讯.爱奇艺.优酷.芒果.乐视)的播放器.而且播放视频可直接跳过广告.好的开源项目第一时间分 ...
- 【JetPack】视图绑定 ( ViewBinding ) 各种应用 ( 视图绑定两种方式 | Activity 布局 | 对话框布局 | 自定义组件布局 | RecyclerView 列表布局 )
文章目录 I . 视图绑定 ( ViewBinding ) 界面的两种方式 II . Activity 界面中 应用 视图绑定 ( ViewBinding ) III . Dialog 对话框界面中 ...
- 【REACT NATIVE 系列教程之十三】利用LISTVIEW与TEXTINPUT制作聊天/对话框获取组件实例常用的两种方式...
本站文章均为 李华明Himi 原创,转载务必在明显处注明: 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/react-native/2346.html ...
最新文章
- Spring Security 实战干货:自定义配置类入口 WebSecurityConfigurerAdapter
- openStack 租户控制台修改虚拟机账户密码
- MooTools教程(4):函数和MooTools
- fork他人仓库clone到本地
- php+js实现异步图片上传,JavaScript实现异步图像上传功能
- loading窗口动画 web_loading动画
- python热图怎么截取对角线的一半_python-控制seaborn热图中的单个线宽
- React-Native 在 mac 下 build 问题
- 关于面向对象和面向过程等小例子(持续更新)
- 程序员记录每天工作日志软件_程序员日志记录简介
- 国内首款 FeliCa协议NFC读卡器芯片 FSV9512 国产替代NXP PN512 同时可兼容 A卡 B卡 每月KK级出货量
- 【软件与系统安全】栈溢出利用的分析
- .lrc 格式的歌词乱码,如何修改后正常显示
- docker安装mssql
- PHP LOL接口,电竞数据API接口|英雄联盟lol|联赛统计|API调用示例代码
- Perfectly Secret Encryption
- 一些最基本的健身知识分享
- lumerical安装教程
- 手机不小心把计算机隐藏了怎么恢复出厂设置,图标隐藏了怎么弄出来(手机图标隐藏了怎么恢复)...
- python怎么爬取excel_求教! Python爬取的数据 怎么写入Excel表格中