百行代码实现VLC简易视频播放器【VLC环境配置过程+可执行源码注释完整】

2023-05-16

文章目录

  • ❓什么是VLC
  • 🚀VLC 库的集成
    • ⭐VLC环境配置演示【win10系统+vs2017+win64】
  • 🍎VLC 库的基本使用
  • 🎂视频播放器实现
    • ⭐自定义函数Unicode2Utf8讲解
  • 🏠总结

❓什么是VLC

VLC 是 Video Lan Client 的缩写,原先是几个法国的大学生做的项目,后来他们把 VLC 作为了一个开源的项目,吸引了来自世界各国的很多优秀程序员来共同编写和维护 VLC,才逐渐变成了现在这个样子。
它的支持情况
操作系统:Windows、WinCE、Linux、MacOSX、BEOS、BSD、Android
访问形式:文件、DVD/VCD/CD、http、ftp、mms、TCP、UDP、RTP、IP 组播、IPv6、rtsp
编码格式:MPEG*、DIVX、WMV、MOV、3GP、FLV、H.263、H.264、FLAC
视频字幕:DVD、DVB、Text、Vobsub
视频输出:DirectX、X11、XVideo、SDL、FrameBuffer、ASCII
控制界面:WxWidgets、QT4/5、Web、Telnet、Command line、MFC
浏览器插件:ActiveX、Mozilla(firefox)
缺点:对 Real Video 支持不算好,需要额外的插件;不支持 3GP 的 AMR 音频格式
VLC 有一个理念:一切都是流的播放



🚀VLC 库的集成

VLC 的git下载地址
可以将它下载下来然后在Linux下编译生成我们所需要的库,但是这样还是有点小麻烦的,所以在这我提供了使用VLC所需要的资源库和头文件(直接下载拿来用就可以了)👇
我的VLC资源下载地址[已经编译过的win64和win32两个版本而且还有一个MP4文件可以拿来等下用]
提取码:yxwi


⭐VLC环境配置演示【win10系统+vs2017+win64】

如果是win32的话就下载win32的包,步骤是一样的【github上win32版本的项目源码下载地址】
1.下载刚刚分享的地址上的资源
在这里插入图片描述

2.在vs2017新建控制台项目
在这里插入图片描述
3.打开刚刚新建的项目地址并将相关资源添加(dll后面再加,这里只加这三个文件夹)
在这里插入图片描述
4.在项目内部配置include路径和lib库(右键项目属性)
在这里插入图片描述
在这里插入图片描述
5.添加头文件#include "vlc.h"再生成解决方案
在这里插入图片描述
6.将vlc的两个dll和plugins放到可执行文件同级目录
在这里插入图片描述

到此我们就可以使用vlc的各种库函数了(๑•̀ㅂ•́)و✧



🍎VLC 库的基本使用

可以认真看看下面VLC的关键函数,想知道怎么用,可以参考最后提供的播放器源码

创建实例
libvlc_new()
加载媒体
libvlc_media_new_path()也可以用libvlc_media_new_location()(file:///、http://、rtsp://、screen://)
创建播放器
libvlc_media_player_new_from_media()
设置播放窗口
libvlc_media_player_set_hwnd()
开始播放
libvlc_media_player_play()
获取播放长度
libvlc_media_player_get_length()
获取播放媒体的宽/高
libvlc_video_get_width()/libvlc_video_get_height()
获取播放音量
libvlc_audio_get_volume()
设置播放的音量
libvlc_audio_set_volume()
获取播放位置
libvlc_media_player_get_position()
设置播放位置
libvlc_media_player_set_position()
暂停播放
libvlc_media_player_pause()
停止播放
libvlc_media_player_stop()
释放播放器
libvlc_media_player_release()
释放媒体
libvlc_media_release()
释放实例
libvlc_release()


🎂视频播放器实现

将刚刚网盘下载下来的MP4文件放到解决方案同级目录
在这里插入图片描述
.cpp文件:

#include <iostream>
#include <Windows.h>
#include <conio.h>
#include "vlc.h"
//将unicode转换为utf-8的编码(如果你的MP4文件使用中文那么就得用这个函数进行转换,要不然会出问题)
std::string Unicode2Utf8(const std::wstring& strIn)
{
	std::string str;
	//获取转义以后的长度的length
	int length = ::WideCharToMultiByte(CP_UTF8, 0, strIn.c_str(), strIn.size(), NULL, 0, NULL, NULL);
	//设置str的length
	str.resize(length + 1);
	::WideCharToMultiByte(CP_UTF8, 0, strIn.c_str(), strIn.size(), (LPSTR)str.c_str(), length, NULL, NULL);
	return str;
}
int main()
{
	int argc = 1;
	char* argv[2];
	//忽略配置
	argv[0] = (char*)"--ignore-config";
	//拿到vlc实例
	libvlc_instance_t*vlc_ins = libvlc_new(argc, argv);
	//拿到media实例
	//std::wstring str = L"foreman.mp4";//获取到unicode编码的string
	libvlc_media_t*media = libvlc_media_new_path(vlc_ins, "vlcTest.mp4");
	//media = libvlc_media_new_location(vlc_ins, "files:///E:\\Windows_MyselfProject\\vlcVedioPlayer\\foreman.mp4");
	//获得player
	libvlc_media_player_t* player = libvlc_media_player_new_from_media(media);

	do {
		int ret = libvlc_media_player_play(player);
		if (ret == -1)
		{
			std::cout << "error player" << std::endl;
			break;
		}
		//预防音量获取失败
		int vol = -1;
		while (vol == -1)
		{
			Sleep(200);
			vol = libvlc_audio_get_volume(player);
		}
		Sleep(500);//休眠300毫秒,必须media解析加载完成才会有下面这些参数
		//打印音量
		printf("volume:%d\n", vol);
		//设置音量
		//10表示的是10%比例的正常,100表示正常,0表示静音
		system("pause");
		//缩小音量
		libvlc_audio_set_volume(player, 10);
		system("pause");
		//放大音量(做好心理准备)
		libvlc_audio_set_volume(player, 100);
		//拿长度(其实是视频的毫秒数)
		libvlc_time_t timel = libvlc_media_player_get_length(player);
		printf("%02d:%02d:%02d:%03d\r\n", int(timel / 3600000), int((timel / 60000) % 60), int((timel / 1000) % 60), int(timel % 1000));
		int width = libvlc_video_get_width(player);
		int height = libvlc_video_get_height(player);
		printf("width=%d,height=%d\r\n", width, height);
		//包含头文件#include <conio.h>
		while (!_kbhit()) {//输入不为空
			//获取视频播放进度
			printf("%f%%\r", 100.0*libvlc_media_player_get_position(player));//"\r"“回车”,告诉打字机把打印头定位在左边界;
			Sleep(500);
		}
		//把刚刚退出来的控制符吃掉
		getchar();
		//暂停player(暂停播放视频)
		libvlc_media_player_pause(player);
		system("pause");
		//继续播放视频
		libvlc_media_player_play(player);
		system("pause");
		//不播放视频
		libvlc_media_player_stop(player);
	} while (0);

	//释放播放器
	libvlc_media_player_release(player);
	//释放媒体
	libvlc_media_release(media);
	//释放实例
	libvlc_release(vlc_ins);
	return 0;
}

运行效果(后面背景就是播放的那个MP4视频):
在这里插入图片描述

在这里插入图片描述


⭐自定义函数Unicode2Utf8讲解

std::string Unicode2Utf8(const std::wstring& strIn)
{
	std::string str;
	//获取转义以后的长度的length
	int length = ::WideCharToMultiByte(CP_UTF8, 0, strIn.c_str(), strIn.size(), NULL, 0, NULL, NULL);
	//设置str的length
	str.resize(length + 1);
	::WideCharToMultiByte(CP_UTF8, 0, strIn.c_str(), strIn.size(), (LPSTR)str.c_str(), length, NULL, NULL);
	return str;
}

如果我们用的MP4文件的名字为中文,比如:测试.mp4,那么我们不能直接用,我们得把这个字符串转换成utf-8才可以用。(当然最好还是别用中文,哈哈哈)

//将"测试.mp4"转换成unicode编码的字符串
std::wstring wStr = L"测试.mp4";
//利用自定义的函数将unicode字符串编程utf-8字符串
std::string str = Unicode2Utf8(wStr);


🏠总结

VLC的简易视频播放器到此结束,希望这一篇文章能够对您有所帮助,如果在看这篇文章的过程中有任何问题请和我沟通交流,只要我有看到评论一定会尽快回复😀
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

百行代码实现VLC简易视频播放器【VLC环境配置过程+可执行源码注释完整】 的相关文章

  • Xsens MTi传感器 ROS下配置

    Xsens MTi传感器 ROS 1 概述2 MTI设置 MTmanager3 ROS下信息发布 MTSDK4 找不到设备 xff15 参考链接 xff16 延伸阅读传感器配置节点程序分析经典SLAM 1 概述 主要介绍Ubuntu下对Xs
  • 雷达点云 PointCloud2 格式转换

    雷达点云 sensor msgs PointCloud2 pcl PointCloud 数据格式转换参考代码 官方对点云格式的介绍 xff0c 主要有四种 xff0c sensor msgs PointCloud已经弃用 参考 sensor
  • Gmapping 之安装与配置

    Gmapping 之安装与配置 1 概述2 安装2 1 github仓库 3 运行3 1 运行截图3 2 重采样时的提示信息3 3 tf树 96 rosrun rqt tf tree rqt tf tree 96 3 4 所有的坐标变换信息
  • Gmapping Dropped 100.00% of messages so far 解决办法

    Dropped 100 00 of messages so far解决办法 概述显示tf树正常情况报错情况参考链接Gmapping 概述 运行Gmappping时出现错误提示 xff0c 其他参数 xff1a 话题等都设置正确了 xff0c
  • LOAM SLAM安装与配置

    LOAM SLAM安装与配置 1 概述2 安装3 运行4 结果5 其他6 参考链接 1 概述 简单介绍LOAM SLAM的安装与配置 xff0c 希望能帮助大家 xff0c 同时供自己以后参考 2 安装 运行LOAM需要PCL等库支持 xf
  • 什么是MSB、LSB,什么是大端、小端,区别是什么?

    MSB是Most Significant Bit的缩写 xff0c 最高有效位 在二进制数中 xff0c MSB是最高加权位 与十进制数字中最左边的一位类似 通常 xff0c MSB位于二进制数的最左侧 xff0c LSB位于二进制数的最右
  • ROS报错 cant locate node 解决办法

    ROS报错 can 39 t locate node 解决办法 1 概述2 原因3 解决办法4 其他 1 概述 ROS突然出现不能运行节点的问题 xff0c 这里简单介绍一下自己的解决办法 这个方法还是有缺陷 xff0c 更新方法在ROS编
  • ubuntu 开机后 按键 鼠标不能用

    ubuntu 开机后 按键 鼠标不能用 1 现象2 解决办法3 参考链接 1 现象 版本ubuntu 1804安装bumblebee后 xff0c 重启机器出现不能使用鼠标 键盘的现象 xff0c 具体点就是 xff0c 只有开机后的桌面显
  • 相机标定之使用ROS节点程序

    相机标定之使用ROS节点程序 1 概述2 准备3 步骤4 相关链接 1 概述 简单介绍如何使用ROS节点程序进行针孔模型相机标定的步骤 xff0c 供自己以后参考 xff0c 同时希望给大家带来帮助 2 准备 提前准备好棋盘格并打印出来 x
  • 相机标定之使用Matlab工具箱

    相机标定之使用Matlab工具箱 1 概述2 准备3 步骤4 相关链接 1 概述 简单介绍如何使用Matlab进行针孔模型相机标定的步骤 xff0c 供自己以后参考 xff0c 同时希望给大家带来帮助 2 准备 提前准备好棋盘格并打印出来
  • QT安装教程

    QT安装教程 1 概述2 下载安装2 1 下载2 2 安装2 3 安装配置其他环境2 4 安装成功2 5 问题及解决 3 参考链接 1 概述 简单介绍如何在Ubuntu下安装QT xff0c 希望能够帮助大家 xff0c 同时给自己一个参考
  • C++面向过程

    参考文档 xff1a C 43 43 教程 C 43 43 简介 概述 C 43 43 是一种静态类型的 编译式的 通用的 大小写敏感的 不规则的编程语言 xff0c 支持过程化编程 面向对象编程和泛型编程 C 43 43 是 C 的一个超
  • vector 指针 的指针

    vector 不能用指针 xff0c 用指针 xff0c push back会报错 xff0c size 也不对 vector本身用对象 xff0c 内容 简化为A 可以用指针 xff0c 当指针对象中还有指针B时 xff0c 就要用new
  • cmake find_package opencv 找不到

    目录 cmakelist设置方法ok 环境变量设置方法ok linux写法 cmakelists txt完整示例 find opencv lib find package OpenCV REQUIRED NO MODULE should b
  • liveplayer

    npm i 64 liveqing liveplayer S lt template gt lt div class 61 34 live player 34 gt lt div style 61 34 width 640px height
  • DLT algorithm needs at least 6 points for pose estimation from 3D-2D point correspondences. (expecte

    DLT algorithm needs at least 6 points for pose estimation from 3D 2D point correspondences expected 39 count gt 61 6 39
  • 关于OSD

    OSD的主要实现方法和类型 目前有两种主要的OSD实现方法 xff1a 外部OSD发生器与视频处理器间的叠加合成 xff1b 视频处理器内部 支持OSD xff0c 直接在视频缓存内部叠加OSD信息 外部OSD发生器与视频处理器间的叠加合成
  • RTK使用笔记-千寻CORS模式

    一 千寻CORS模式 与基站 43 接收机1对1相比 xff0c 优点为携带方便 xff0c 也不用考虑10公里移动基站问题 xff1b 缺点为第一千寻CORS模式有自己基站涵盖范围 xff0c 所以需要提前确定好范围 xff08 下文有介
  • c/c++语言实现登陆界面

    C C 43 43 语言实现登陆界面 整体功能介绍 实现一个登陆界面 1 输出一个登陆界面 2 用户名能够实现邮箱验证 xff0c regex库 xff0c 密码要不可见 3 进度条的模拟实现 4 音乐播放 分步实现 1 输出一个登陆界面
  • _getch()函数的介绍

    getch 函数的介绍及实例演示 我们一般所使用的 getchar 函数在读入一个字符时必须按一下 Enter 键 xff0c 该代码才会继续运行 但是 getch 函数读入一个字符时 不用 enter 代码会继续跑 xff1b 最简单使用

随机推荐

  • 嵌入式常见面试题

    嵌入式LINUX常见面试问题总结 声明 xff1a 本文是将常见的面试问题进行汇总 xff0c 但大多数问题也是开发中较为常见的技术盲区 xff01 在此进行了汇总 xff0c 以便后续进行参考 xff01 所有的答案部分是自己编写 xff
  • LINUX基础试题大全(1)

    说明 xff1a 此文章由于题数庞大 xff0c 为方便阅读本人将其分为四篇文章为大家分享 xff01 答案会今后不断进行更新 xff01 LINUX基础试题大全 xff08 1 xff09 填空题题 LINUX基础试题大全 xff08 2
  • C语言 | 深入学习数组

    说明 xff1a 本文主要讨论一维数组 xff0c 适宜程度 xff1a 对C语言初步认识及想深入学习者 1 从编译器角度理解数组 从编译器角度理解来讲 xff0c 数组也是一个变量 xff0c 和普通的变量没有本质的区别 变量的本质指的是
  • C语言 结构体 联合体 | 嵌套使用

    一 简单的实例分析 题目 xff1a 获取0x12345678各个字节 答案 xff1a span class token comment 方法一 span span class token macro property span clas
  • Linux 网络编程笔记3 | 内存 系统调用

    七 内存 1 虚拟内存 物理内存 半导体内存和换页文件 虚拟内存 xff1a 地址空间 xff0c 虚拟的存储区域 xff0c 应用程序所访问的都是虚拟内存 物理内存 xff1a 存储空间 xff0c 实际的存储区域 xff0c 只有系统内
  • 树莓派替代品

    51单片机 转载于 https www cnblogs com wanghuaqiang p 11481958 html
  • C++ 笔记10 | 多态(polymorphic)

    span class token variable eg 实现图形库 xff0c 用于显示各种图形 span span class token variable 图形基类 span span class token punctuation
  • QT 笔记3 | Qt设计师使用 Qt创造器使用

    六 Qt设计师使用 designer 案例1 xff1a 使用设计师重构加法计算器 1 创建工程目录 mkdir Calculator2 2 进入工程目录 xff0c 执行 designer 启动设计师 1 xff09 在新建窗体界面 xf
  • QT 笔记5 |Qt多线程(QThread)

    一 Qt多线程 QThread 1 创建线程方法1 xff1a QObject moveToThread class Myclass public QObject Q OBJECT public slots void func void 耗
  • QT 笔记6 | Qt网络编程

    回顾 xff1a 1 Qt多线程 QThread 1 xff09 创建线程 方法1 xff1a moveToThread 方法2 xff1a 继承QThread xff0c 重写run函数 2 xff09 线程同步 互斥锁 xff1a QM
  • QT 笔记7 | UDP编程

    回顾 xff1a 1 xff09 控件类 QT 43 61 widgets QApplication Qt的gui应用程序 QWidget 控件基类 QLabel 标签 QPushButton 按钮 QDialog 对话框 QMainWin
  • 学习c语言

    今天学习了if语句和 xff45 xff4c xff53 xff45 运用 xff43 语言更加顺手 xff0c 之前一些都能实施 xff0c 真是太开心了 include lt stdio h gt int main 初始化 int pr
  • 求符合给定条件的整数集(做题)

    题目如上 xff1b 首先我们先想思路 xff1a 先来一个输入 xff0c 读入这个数 xff0c 然后我们需要三个变量来储存这三个数 xff1b 然后我们遍历所有的组合 xff0c 这个依靠循环 接下来是代码 xff1a include
  • 水仙花数(做题)

    代码如下 xff1a include lt stdio h gt int main int a scanf 34 d 34 amp a float t t 61 0 1 while a gt 0 t 61 t 10 a 判断几位数 int
  • 一分钟了解动态内存分配

    谈到这 xff0c 必然离不开malloc函数 在上面可以看出此函数需要一个头文件 include lt stdilb h gt 而且返回类型是void 传进去的是空间大小 xff0c 此函数申请的空间是字节为单位的 这其中的就分配了100
  • 动态内存分配深究

    接下来我们将探究以下三个问题 xff1a 1 相邻两次malloc得到的空间是否是连续的呢 xff1f 2 你得到的空间的实际大小是否就是你要求的大小呢 xff1f 3 如果你malloc零长度会得到什么结果呢 xff1f 第一个问题 xf
  • 同一个页面不打开两次

    lt script language 61 34 javascript 34 gt function popwin3 path window open path 34 cart 34 34 height 61 520 width 61 52
  • 超易懂!二分查找 详析

    二分算法的 本质 是 xff1a 假如我们可以找到事物的 某种性质 xff0c 这种性质 可以将区间一分为二 xff0c 一半满足 xff0c 一半不满足 我们就可以二分 另外 xff0c 有 连续性 必可以 二分 二分模板一共有两个 xf
  • 手摸手 Spring Cloud Gateway + JWT 实现登录认证

    你好 xff0c 我是悟空 前言 上篇我已经讲解了 Spring Cloud 的原理和实战 xff0c 这次就要结合 JWT 来实现登录认证的功能了 本文已收录至 深入剖析 Spring Cloud 底层架构原理 xff0c 已更新 18
  • 百行代码实现VLC简易视频播放器【VLC环境配置过程+可执行源码注释完整】

    文章目录 什么是VLC x1f680 VLC 库的集成 VLC环境配置演示 win10系统 43 vs2017 43 win64 x1f34e VLC 库的基本使用 x1f382 视频播放器实现 自定义函数Unicode2Utf8讲解 x1