测试环境

  • 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)相关推荐

  1. 前端系列——vue2+高德地图web端开发(poi搜索两种方式)

    前端系列--vue2+高德地图web端开发(poi搜索) 前言 基础 什么是poi搜索 1. 输入提示结合poi搜索 官方代码 步骤 1.进行plugins插件注册 2.data中编写placeSea ...

  2. 微信开发网页授权的两种方式

    第一步在微信公众平台中找到网页授权 然后再填写授权回调页面,这里的页面如同手册里面一样  以xxx.xxxxx.com 即可  而且此处的域名一定要和代码中回调地址在同一个域名之下. 关于网页授权的两 ...

  3. Autofac 设置方法拦截器的两种方式

    前提 1.Nuget安装Autofac 4.0以下版本  4.0及4.0 以上版本暂时没找到合适的方案 2.Nuget安装Autofac.Extras.DynamicProxy2 3.创建一个类似下面 ...

  4. iOS开发图片纯色填充(两种方式)和缩小图片

    UIImage图标换色和变换大小 这里的图片大都指只有两个色的图标,有时候我们的图标需要根据不同的状态显示不同的颜色,有一种简单的处理方式是,将不同状态的颜色图标都切出来,变换状态的时候直接使用相应的 ...

  5. typescript 从零开发视频播放器

    typescript 从零开发视频播放器 前言 项目架构设计 技术栈 双端支持 元素的显示和隐藏说明 组件化开发 组件之间的通讯 拖拽行为 初始化模板 video 标签组件 控制器的显示和隐藏 显示时 ...

  6. 只有你项目不到,Electron也可以开发视频播放器

    一.桌面版视频播放器 今天又发现一款强大的开源软件,electron 开发的一个可以播放国内主流视频(腾讯.爱奇艺.优酷.芒果.乐视)的播放器.而且播放视频可直接跳过广告.好的开源项目第一时间分享给大 ...

  7. 只有你想不到,Electron也可以开发视频播放器

    ## 一.桌面版视频播放器 今天又发现一款强大的开源软件,electron 开发的一个可以播放国内主流视频(腾讯.爱奇艺.优酷.芒果.乐视)的播放器.而且播放视频可直接跳过广告.好的开源项目第一时间分 ...

  8. 【JetPack】视图绑定 ( ViewBinding ) 各种应用 ( 视图绑定两种方式 | Activity 布局 | 对话框布局 | 自定义组件布局 | RecyclerView 列表布局 )

    文章目录 I . 视图绑定 ( ViewBinding ) 界面的两种方式 II . Activity 界面中 应用 视图绑定 ( ViewBinding ) III . Dialog 对话框界面中 ...

  9. 【REACT NATIVE 系列教程之十三】利用LISTVIEW与TEXTINPUT制作聊天/对话框获取组件实例常用的两种方式...

    本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/react-native/2346.html ...

最新文章

  1. Spring Security 实战干货:自定义配置类入口 WebSecurityConfigurerAdapter
  2. openStack 租户控制台修改虚拟机账户密码
  3. MooTools教程(4):函数和MooTools
  4. fork他人仓库clone到本地
  5. php+js实现异步图片上传,JavaScript实现异步图像上传功能
  6. loading窗口动画 web_loading动画
  7. python热图怎么截取对角线的一半_python-控制seaborn热图中的单个线宽
  8. React-Native 在 mac 下 build 问题
  9. 关于面向对象和面向过程等小例子(持续更新)
  10. 程序员记录每天工作日志软件_程序员日志记录简介
  11. 国内首款 FeliCa协议NFC读卡器芯片 FSV9512 国产替代NXP PN512 同时可兼容 A卡 B卡 每月KK级出货量
  12. 【软件与系统安全】栈溢出利用的分析
  13. .lrc 格式的歌词乱码,如何修改后正常显示
  14. docker安装mssql
  15. PHP LOL接口,电竞数据API接口|英雄联盟lol|联赛统计|API调用示例代码
  16. Perfectly Secret Encryption
  17. 一些最基本的健身知识分享
  18. lumerical安装教程
  19. 手机不小心把计算机隐藏了怎么恢复出厂设置,图标隐藏了怎么弄出来(手机图标隐藏了怎么恢复)...
  20. python怎么爬取excel_求教! Python爬取的数据 怎么写入Excel表格中

热门文章

  1. 万能进制转换器——栈应用
  2. 图片和图形之硬件加速(7)
  3. CASIA-SURF 和 CASIA-SURF-CeFA(活体检测数据库 / 跨种族面部反欺骗数据集)
  4. 如何查询快递单号物流未签收的单号
  5. mysql常用 的数据库引擎
  6. 案例|PIGOSS TOCBSM完美结合,服务于首信社保部
  7. 《OSPF和IS-IS详解》一1.2 ARPANET
  8. C语言程序设计(第三版)何钦铭著 习题3-5
  9. Centos7更换163镜像源安装kubernetes
  10. Javascript编写翻页时钟(包括定时和闹钟功能)