百行代码实现VLC简易视频播放器【详细环境配置过程+可执行源码注释完整】
创始人
2024-02-18 19:49:44
0

文章目录

  • ❓什么是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 
#include 
#include 
#include "vlc.h"
//将unicode转换为utf-8的编码(如果你的MP4文件使用中文那么就得用这个函数进行转换,要不然会出问题)
std::string Unicode2Utf8(const std::wstring& strIn)
{std::string str;//获取转义以后的长度的lengthint length = ::WideCharToMultiByte(CP_UTF8, 0, strIn.c_str(), strIn.size(), NULL, 0, NULL, NULL);//设置str的lengthstr.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编码的stringlibvlc_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");//获得playerlibvlc_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 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;//获取转义以后的长度的lengthint length = ::WideCharToMultiByte(CP_UTF8, 0, strIn.c_str(), strIn.size(), NULL, 0, NULL, NULL);//设置str的lengthstr.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的简易视频播放器到此结束,希望这一篇文章能够对您有所帮助,如果在看这篇文章的过程中有任何问题请和我沟通交流,只要我有看到评论一定会尽快回复😀
在这里插入图片描述

相关内容

热门资讯

原创 揪... 现在买新能源车,谁都被大尺寸中控屏吸引。刷剧、打游戏、听音乐,指尖一划全搞定。车机就像移动娱乐厅。大...
中公教育(002607)披露新... 截至2025年12月19日收盘,中公教育(002607)报收于2.82元,较前一交易日上涨3.68%...
原创 比... 最近国际金融圈炸了个大雷,欧盟刚宣布把俄罗斯的钱“无限期看管”,俄罗斯就直接把官司砸了过来,一开口就...
ST岭南最新公告:公司及控股子... ST岭南(002717.SZ)公告称,截至2025年12月18日,公司及控股子公司连续十二个月内新增...
瑞茂通(600180)全资子公... 瑞茂通(600180)12月20日公告,公司旗下全资子公司河南瑞茂通粮油有限公司于近日收到河南省郑州...
国脉文化(600640)披露内... 截至2025年12月19日收盘,国脉文化(600640)报收于12.32元,较前一交易日上涨0.57...
两部门:在政府采购中实施本国产... 中新社北京12月19日电 (记者 赵建华)中国国务院办公厅9月印发《关于在政府采购中实施本国产品标准...
虚构用途多次借款后,连人带债“... ◆李某平在自身无偿还能力的情况下,虚构借款用途,骗取多名村民财物,得手后即隐匿行踪、逃避返还,主观上...
士兰微:拟申请不超过15亿元新... 人民财讯12月19日电,士兰微(600460)12月19日晚公告称,为保障 “12英寸高端模拟集成电...
辅警工作近6年因有文身被辞退,... 2019年9月起,男子刘某入职吉林省农安县公安局交通管理大队,任警务辅助人员,一直到2023年12月...