现在有一个需求,需要使用QT写界面,使用vlc进行视频的操作,显示在QLable上面。
借鉴了雷神大佬的博客,使用的环境是vs2015+Qt5.9.0。第一先介绍了vlc的下载和配置。二和三是雷神大佬的例子,用来测试。四介绍了完成需求的主要代码和流程。
源码下载地址

一、下载配置vlc

本文使用的vlc版本下载地址是: http://get.videolan.org/vlc/3.0.3/win32/ 下面的vlc-3.0.3-win32.7z
比如下载到:C:\Users\czf\Downloads\vlc-3.0.3-win32\vlc-3.0.3\

  • vs配置vlc的头文件位置(vs工程-设置-VC++目录-包含目录添加C:\Users\czf\Downloads\vlc-3.0.3-win32\vlc-3.0.3\sdk\include)
  • vs配置vlc的lib位置(vs工程-设置-VC++目录-库目录添加C:\Users\czf\Downloads\vlc-3.0.3-win32\vlc-3.0.3\sdk\lib)
  • 编译完工程后,需要把C:\Users\czf\Downloads\vlc-3.0.3-win32\vlc-3.0.3目录下的dll文件和plugins文件夹拷贝到和生成的exe同级目录(没有dll无法运行,没有plugins可能会崩溃)

二、测试例子:播放本地视频(最简单的基于libVLC的例子:最简单的基于libVLC的视频播放器)

demo

/*** 最简单的基于libVLC的播放器* Simplest libVLC Player** 雷霄骅 Lei Xiaohua* leixiaohua1020@126.com* 中国传媒大学/数字电视技术* Communication University of China / Digital TV Technology* http://blog.csdn.net/leixiaohua1020** 本程序是一个最简单的基于libVLC的视频播放器。* 适合初学者学习libVLC。** This example is the simplest Video Player based on libVLC.* Suitable for the beginner of libVLC.*/
#include <Windows.h>
#include "vlc/vlc.h"int main(int argc, char* argv[]){libvlc_instance_t * inst;libvlc_media_player_t *mp;libvlc_media_t *m;libvlc_time_t length;int width;int height;int wait_time=5000;//libvlc_time_t length;/* Load the VLC engine */inst = libvlc_new (0, NULL);//Create a new item//Method 1:m = libvlc_media_new_location (inst, "file:///C:\\Users\\czf\\Desktop\\cuc_ieschool.flv");//Screen Capture//m = libvlc_media_new_location (inst, "screen://");//Method 2://m = libvlc_media_new_path (inst, "cuc_ieschool.flv");/* Create a media player playing environement */mp = libvlc_media_player_new_from_media (m);/* No need to keep the media now */libvlc_media_release (m);// play the media_playerlibvlc_media_player_play (mp);//wait until the tracks are created_sleep (wait_time);length = libvlc_media_player_get_length(mp);width = libvlc_video_get_width(mp);height = libvlc_video_get_height(mp);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 (mp);// Free the media_playerlibvlc_media_player_release (mp);libvlc_release (inst);return 0;}

基本介绍

libvlc_media_t的创建
创建libvlc_media_t有两种方法:libvlc_media_new_path()和libvlc_media_new_location()。
简单描述一下这两个函数的区别:libvlc_media_new_location()用于打开协议,而libvlc_media_new_path()用于打开文件。因而传递给libvlc_media_new_path()的就是普通的文件路径(绝对路径例如D:\xxx.flv,或者相对路径例如xxx.flv),而传递给libvlc_media_new_location()的就是协议地址(例如“udp://….”,“http://”)。但是这里有一点需要注意,在VLC中“文件”也属于一种广义上的“协议”。因此使用libvlc_media_new_location()也可以打开文件,但是必须在文件路径前面加上“文件协议”的标记“file:///”。例如打开“F:\movie\cuc_ieschool.flv”下的视频,实际使用的代码如下所示。
libvlc_media_new_location (inst, “file:///F:\movie\cuc_ieschool.flv”);
此外,VLC还支持很多“神奇”的协议,比如输入“screen://”协议就可以进行屏幕录制,代码如下。
libvlc_media_new_location (inst, “screen://”);

三、测试例子:推流(最简单的基于libVLC的推流器)

/*** 最简单的基于libVLC的推流器* Simplest libVLC Streamer** 雷霄骅 Lei Xiaohua* leixiaohua1020@126.com* 中国传媒大学/数字电视技术* Communication University of China / Digital TV Technology* http://blog.csdn.net/leixiaohua1020** 本程序是一个最简单的基于libVLC的推流器。* 适合初学者学习libVLC。** This example is the simplest Streamer based on libVLC.* Suitable for the beginner of libVLC.*/#include <Windows.h>
#include "vlc/vlc.h"int main(int argc, char **argv) {libvlc_instance_t *vlc;const char *url;//Send File//Transcode it. Video codec use x264. Audio codec use mpga.//Mux it to mpegts format.//And stream it to udp://233.233.233.233:6666/*const char *sout = "#transcode{vcodec=h264,fps=25,venc=x264{preset=ultrafast,"\"profile=main,tune=zerolatency},vb=512,scale=0.5,"                        \"acodec=mpa,aenc=ffmpeg,ab=64,channels=2}"                                \":standard{access=udp,mux=ts,dst=233.233.233.233:6666}";*///Send and playing at same timeconst char *sout = "#transcode{vcodec=h264,fps=25,venc=x264{preset=ultrafast,"\"profile=baseline,tune=zerolatency},vb=512,"                              \"acodec=mpga,ab=64,channels=2}"                                           \":duplicate{dst=display,dst=standard{access=udp,mux=ts,dst=233.233.233.233:6666}}";const char *media_name = "Lei's test";//Screen Capture//url = "screen://";url = "cuc_ieschool.flv";vlc = libvlc_new(0, NULL);libvlc_vlm_add_broadcast(vlc, media_name, url, sout, 0, NULL, true, false);libvlc_vlm_play_media(vlc, media_name);//play 30s_sleep(30000); libvlc_vlm_stop_media(vlc, media_name);libvlc_vlm_release(vlc);return 0;
}

该推流器流程:

libvlc_new():创建libvlc_instance_t。
libvlc_vlm_add_broadcast():增加一个广播(broadcast)。
libvlc_vlm_play_media():播放指定名称的广播(broadcast)。
libvlc_vlm_stop_media():停止指定名称的广播(broadcast)。
libvlc_vlm_release():释放ibvlc_instance_t。

本示例的输入视频文件为“cuc_ieschool.flv”。这个推流器实现了:

  • 输入视频转码为H.264
  • 音频转码为mp2
  • 封装格式设置为MPEG-TS
  • 以UDP的形式发送至组播地址“udp://233.233.233.233:6666”

使用QT实现一个播放器

调用

int main(int argc, char *argv[])
{QApplication a(argc, argv);//CMediaPlayer::TestLocalPlayerVedio();//CMediaPlayer::TestRtmpPlayerVedio();testqt w;  //testqt是一个QMainWindow,上面有一个QLablew.show();// 获取w上面的qlable控件,传入handle,显示视频到QLabelQLabel* label = w.findChild<QLabel*>("lb");CMediaPlayer t;t.PlayVedio("", (HWND)label->winId());return a.exec();
}

实现

void CMediaPlayer::PlayVedio(const char *pstIp, HWND handle)
{char szPlayerUrl[255] = {0};sprintf_s(szPlayerUrl, "rtsp://admin:admin123%s", pstIp);libvlc_media_t *pMedia = libvlc_media_new_path(m_pInstant, "C:\\Users\\czf\\Desktop\\cuc_ieschool.flv"); //本地播放//libvlc_media_new_location(m_pInstant, szPlayerUrl);  //拉流播放if ( NULL == pMedia){return;}libvlc_media_player_t *pPlayer = libvlc_media_player_new_from_media(pMedia);if (NULL == pPlayer){return;}libvlc_media_player_set_hwnd(pPlayer, handle);int iRet = libvlc_media_player_play(pPlayer);if (0 != iRet){libvlc_media_player_stop(pPlayer);libvlc_media_player_retain(pPlayer);return;}
}

流程介绍:
建立一个QT工程,只有一个QMainWindow,在QMainWindow添加一个QLable,读取该lable的Handle,传给vlc,vlc在该lable上进行视频显示。

参考博文

最简单的基于libVLC的例子:最简单的基于libVLC的视频播放器
最简单的基于libVLC的视频播放器(图形界面版)
最简单的基于libVLC的推流器

遇到的问题

1.问题描述:
解决方法:
2.问题描述:运行到libvlc_media_new_path崩溃
原因:m_pInstant = libvlc_new(0, NULL);为NULL
解决方法:把C:\Users\czf\Downloads\vlc-3.0.3-win32\vlc-3.0.3\文件夹下的plugins文件夹拷贝到exe同级目录下。
3.使用vlc会出现错误,typedef ssize_t (*libvlc_media_read_cb)(void *opaque, unsigned char *buf,size_t len);
解决方法:在文件中定义libvlc_media.h

typedef int ssize_t; //添加这一句
typedef ssize_t (*libvlc_media_read_cb)(void *opaque, unsigned char *buf, size_t len);

QT实现一个视频播放器(vlc)相关推荐

  1. 嵌入式Qt 开发一个视频播放器

    上篇文章:嵌入式 Qt开发一个音乐播放器,使用Qt制作了一个音乐播放器,并在OK3568开发板上进行了运行测试,实际测试效果还不错. 本篇继续来实现一个Qt视频播放器软件,可以实现视频列表的显示与选择 ...

  2. FFmpeg开发(四)——Qt实现一个视频播放器(参考了暴风影音、迅雷影音)

    FFmpeg开发(四)--Qt实现一个视频播放器(参考了暴风影音.迅雷影音) 本系列文章目录: FFmpeg开发(一)一Qt Creator配置FFmpeg FFmpeg开发(二)--(FFmpeg基 ...

  3. 记录一个视频播放器VLC media player

    VLC media player VLC 是一款自由.开源的跨平台多媒体播放器及框架,可播放大多数多媒体文件,以及 DVD.音频 CD.VCD 及各类流媒体协议. https://www.videol ...

  4. java课程设计视频播放器_在Java实现视频播放器(vlc)

    学习Java几个月,刚刚入门.昨天看到极客学院的Java的入门视频最后有一个简易播放器的制作,因为最近学校要做一个项目,正好需要加入一个视频播放器,就按照视频的方法来做,但是在做时发现N多问题,都是在 ...

  5. 用QT5做一个视频播放器

    作为一个菜鸟有空的时候都会做一些QT小项目拿来练练手,今天做的是一个视频播放器,暂时只实现了本地视频的播放,后续会继续完善实现网络播放功能. (1)因为图片都是自己网上随便找的,做的界面有点丑,后续有 ...

  6. 用Pyqt5写一个视频播放器

    用Pyqt5写一个视频播放器 编写方式: Qt Designer设计,pyuic5转化为.py文件. 播放器效果: 代码链接:https://github.com/GRF-Sunomikp31/Qt_ ...

  7. linux下qt实现vlc视频播放器,Qt封装本地视频播放器(VLC二次开发)

    Qt本地视频播放器 1.使用vlc官方sdk封装,并在QLabel上面播放 2.首先到vlc官网下载vlc的sdk环境,下载地址:http://download.videolan.org/pub/vi ...

  8. java media player_MediaPlayerForJava(创建一个视频播放器)

    利用VLC自制一个java视频播放器 1.下载相关文件 1.1 下载vlc播放器 1.1.1 必须匹配Java 虚拟机的CPU体系结构和本机LibVLC库 - 如果使用32位JVM,则必须使用32位版 ...

  9. python实现视频播放器_对目前的视频播放器不满意?教你用Python做一个视频播放器...

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. 以下文章来源于Charles的皮卡丘 ,作者白露未晞me Python爬虫.数据分析.网站开 ...

最新文章

  1. 后台获取视图对应的字符串
  2. iOS开发中标签控制器的使用——UITabBarController
  3. 【Flutter】Future 与 FutureBuilder 异步编程代码示例 ( FutureBuilder 构造函数设置 | 处理 Flutter 中文乱码 | 完整代码示例 )
  4. 培养这10个习惯,你就离UNIX高手更进一步了
  5. Vue前后端对接时判断是否与后端连接成功
  6. MEF(可扩展框架)使用总结
  7. [sqlite] android create db in SD card
  8. python中tile的用法_Python:numpy中的tile函数
  9. go在ubuntu下安装
  10. word---尾注法插入参考文献
  11. 租车汽车租赁系统开发
  12. 个人简历网站的需求分析
  13. Havel-Hakimi定理(判断一个度序列是否可图)
  14. 计算机软件基础-数据结构与算法
  15. 谷歌注册手机无法验证解决办法2023亲测有效非常迅速
  16. 优质github项目集合-珍藏版
  17. #python#异常处理练手
  18. 聊聊小程序的登录逻辑
  19. day43--插入排序
  20. moviepy音视频开发:使用volumex调节音量大小及其花式用法

热门文章

  1. 机床的轴越多越好吗,五轴机床到底应该怎么选?
  2. 奇艺QSV文件格式简单分析
  3. 安装tensorflow-federated-nightly
  4. 高级实训任务二U-Net图像分割实验报告
  5. 如何将电脑和手机连起来,实现同步打字?
  6. [附源码]java毕业设计企业招标系统
  7. 大佬带你看DevOps
  8. 「洗脑」利用了哪些心理学原理?人脑发生了哪些生理变化?
  9. ubuntu上安装谷歌浏览器
  10. javascript面对对象编程指南第三章 函数