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


    ❓什么是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()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32


    🎂视频播放器实现

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

    #include 
    #include 
    #include 
    #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 
    		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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87

    运行效果(后面背景就是播放的那个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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

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

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


    🏠总结

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

  • 相关阅读:
    小红书推广怎么做?小红书推广需要注意什么?
    Spring Security 中的 BCryptPasswordEncoder
    Spring @Scheduled学习
    MongoDB vs MySQL vs Hive
    结构体(Struct)
    JavaScript——数据类型、类型转换
    Web前端vueDemo—实现图片切换功能(二)
    STM32框架之按键扫描新思路
    串口通信之计算校验和
    R语言入门看这一章就够了(上)
  • 原文地址:https://blog.csdn.net/Jacksqh/article/details/128058988