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

news2025/2/28 6:37:24

文章目录

  • ❓什么是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的包,步骤是一样的
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的简易视频播放器到此结束,希望这一篇文章能够对您有所帮助,如果在看这篇文章的过程中有任何问题请和我沟通交流,只要我有看到评论一定会尽快回复😀
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/39068.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

学生HTML网页作业作品:HTML+CSS网站设计与实现【红色喜庆邀请函 3页】

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

朗道-西格尔零点猜想(the Landau-Siegel Zeros Conjecture)

1 简介 朗道-西格尔零点猜想&#xff08;the Landau-Siegel Zeros Conjecture&#xff09;&#xff0c;是一个数学难题。 要理解朗道-西格尔零点猜想&#xff0c;首先需要理解黎曼猜想&#xff0c;进而需理解广义黎曼猜想&#xff0c;以及狄利克雷L函数。断言L函数没有异常零…

【OneDrive篇】OneDrive禁用个人保管库(网页端)

【OneDrive篇】OneDrive禁用"个人保管库"&#xff08;网页端&#xff09; 最近OneDrive个人保管库一直同步出错&#xff0c;把文件全部移出来还是一样&#xff0c;就选择直接禁用"个人保管库"功能了—【蘇小沐】 文章目录【OneDrive篇】OneDrive禁用"…

Windowns编译OpenSSL

前言 开发过程中需要上传数据&#xff0c;URL是https的&#xff0c;Qt默认是http网络请求&#xff0c;访问https需要用到SSL认证&#xff0c;而Qt默认不支持&#xff0c;需要自己编译OpenSSL库。 一、下载OpenSSL 环境&#xff1a;Qt 5.12.2 MSVC 2017,32bit ,可通过下面代码…

[附源码]Python计算机毕业设计高校国防教育管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

关于webpack(v5.74.0)的钩子在插件中的应用

常用监听钩子 compiler 钩子 compiler.hooks.entryOption 在 webpack 选项中的 entry 被处理过之后调用。一般用来获取入口。 compiler.hooks.compile beforeCompile 之后立即调用&#xff0c;但在一个新的 compilation 创建之前。这个钩子 不会 被复制到子编译器。能获取…

C++智能指针之shared_ptr

C智能指针之shared_ptr前言一、Shared_ptr1.1 shared_ptr类的操作1.2 make_shared函数1.3 shared_ptr的拷贝赋值1.4 shared_ptr的自动销毁对象内存机制1.5 使用动态生存期的资源的类1.6 shared_ptr与new结合使用1.7 不要混合使用普通/智能指针1.8 不要使用 get 初始化另一个智能…

Keras深度学习实战(38)——图像字幕生成

Keras深度学习实战&#xff08;38&#xff09;——图像字幕生成0. 前言1. 模型与数据集分析1.1 数据集分析1.2 模型分析2. 实现图像字幕生成模型2.1 数据集加载与预处理2.2 模型构建与训练3. 使用束搜索生成字幕3.1 束搜索原理3.2 利用束搜索改进预测结果小结系列链接0. 前言 …

Springboot——Controller层开发、请求与响应、RESTful开发规范

目录 一、入门案例&#xff08;小了解&#xff0c;没啥用&#xff09; 1.1 创建Springboot工程 1.2 导入maven坐标 1.3 controller层代码 1.4 postman测试 二、 REST常用注解 2.1 Controller 2.2 RequestMapping&#xff08;请求映射路径&#xff09; 2.3 Response…

Python学习基础笔记十三——函数

1、函数的定义&#xff1a; 函数是一段具有特定功能的、可重用的语句组。 说明&#xff1a;过程语言&#xff0c;程序员是按照顺序一行一行的编写代码&#xff0c;然后是顺序执行&#xff0c;很容易出现大量重复的代码行&#xff0c;那么有人就考虑将相同的代码提取出来&…

Mybatis源码解析(六):查询数据库主流程

Mybatis源码系列文章 手写源码&#xff08;了解源码整体流程及重要组件&#xff09; Mybatis源码解析(一)&#xff1a;环境搭建 Mybatis源码解析(二)&#xff1a;全局配置文件的解析 Mybatis源码解析(三)&#xff1a;映射配置文件的解析 Mybatis源码解析(四)&#xff1a;s…

.NET 6 支持Cookie与JWT混合认证、授权的方法

从.NET 5开始&#xff0c;.Net Core 与.NET Fremework 合并成了 .NET 5&#xff0c;所以标题也很让人尴尬&#xff0c;不知道该写成是.NET Core还是.NET X。因为这个方法支持.NET 5、6、7。 目录前言Cookie 认证JWT认证总结前言 不知道大家有没有过这样的需求&#xff0c;为了…

基于matlab的异步(感应)电机直接转矩控制系统

目 录 摘要 I 第1章 绪论 1 1.1 课题研究背景 1 1.2直接转矩控制技术的发展现状 1 1.2.1直接转矩控制的现状及发展趋势 1 1.2.2目前的热点研究问题及解决方法 2 1.3本文研究的主要内容 3 第2章 直接转矩控制系统理论 4 2.1概述 4 2.2 异步电动机的数学模型 4 2.3 逆变器的数学模…

【机器学习项目实战10例】(三):基于K近邻的葡萄酒质量检测项目

💥 项目专栏:【机器学习项目实战10例】 文章目录 一、基于K近邻的葡萄酒质量检测项目二、数据集介绍三、导包四、读取数据五、绘制空间分布六、划分训练集、测试集七、构建K近邻模型八、绘制聚类效果九、网格搜索一、基于K近邻的葡萄酒质量检测项目 葡萄酒数据集是一个经典…

[附源码]SSM计算机毕业设计实验教学过程管理平台JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Ajax复习(62nd)

1、 Ajax 基础 1.1 传统网站中存在的问题 1、网速慢的情况下&#xff0c;页面加载时间长&#xff0c;用户只能等待 2、表单提交后&#xff0c;如果一项内容不合格&#xff0c;需要重新填写所有表单内容 3、页面跳转&#xff0c;重新加载页面&#xff0c;造成资源浪费&#xf…

基于matlab的BOC调制信号捕获仿真

目录 1.算法描述 2.仿真效果预览 3.MATLAB部分代码预览 4.完整MATLAB程序 1.算法描述 随着全球导航卫星系统的高速发展,导航系统的数量也越来越多,比如使用最广泛的GPS导航系统,以及越来越备受关注的中国北斗导航系统等.因此导航频段变得越来越拥挤,且各个频段内的信号相互…

activiti-api-impl

activiti-api-impl目录概述需求&#xff1a;设计思路实现思路分析1.CommonModelAutoConfiguration2.RuntimeEventImpl3.ProcessModelAutoConfiguration4.DefaultServiceTaskBehavior5.APIVariableInstanceConverterTaskModelAutoConfiguration参考资料和推荐阅读Survive by day…

Flutter高仿微信-第53篇-群聊-删除并退出

Flutter高仿微信系列共59篇&#xff0c;从Flutter客户端、Kotlin客户端、Web服务器、数据库表结构、Xmpp即时通讯服务器、视频通话服务器、腾讯云服务器全面讲解。 详情请查看 效果图&#xff1a; 实现代码&#xff1a; //删除并退出对话框 void _deleteAndExistDialog(){Load…

图解LeetCode——1752. 检查数组是否经排序和轮转得到(难度:简单)

一、题目 给你一个数组 nums 。nums 的源数组中&#xff0c;所有元素与 nums 相同&#xff0c;但按非递减顺序排列。 如果 nums 能够由源数组轮转若干位置&#xff08;包括 0 个位置&#xff09;得到&#xff0c;则返回 true &#xff1b;否则&#xff0c;返回 false 。 源数…