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

article/2025/10/1 18:37:35

=====================================================

最简单的基于libVLC的例子文章列表:

最简单的基于libVLC的例子:最简单的基于libVLC的视频播放器

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

最简单的基于libVLC的例子:最简单的基于libVLC的推流器

=====================================================

本文记录使用libVLC开发的一个简单的图形界面的视频播放器。由于是示例程序,只包含了最简单的媒体播放方面的功能。其中有一些功能还不完善,有时间以后再做修改。



最简单的基于libVLC的视频播放器(图形界面版)

这是使用libVLC基于MFC开发的一个示例播放器。实现了一个播放器的基本功能:播放,暂停/继续,停止,播放时间轴的显示,以及从任一点开始播放媒体。并且支持将媒体文件拖拽至播放器进行播放。播放前将媒体文件的路径输入到“URL”栏中,然后单击“Start”即可开始播放。


播放时候的效果截图如下所示。


源代码比较长,不再详细记录。简单记录一下其中几个主要功能的实现机制。

视频的播放/暂停/继续/停止

播放

视频“播放”的源代码如下所示。简单来说,完成了以下视频播放的初始化工作:
(1) 输入的URL转换为UTF-8编码(后文详细记录)
(2) 将显示视频画面的控件的句柄提供给libVLC
(3) 初始化libVLC并开始播放
(4) 开启定时器,用于更新视频播放的进度(后文详细记录)
void CplayerGUIDlg::OnBnClickedStart()
{CStringW cstr_url;#ifdef _UNICODEm_url.GetWindowText(cstr_url);
#elseUSES_CONVERSION;CStringA cstr_urla;m_url.GetWindowText(cstr_urla);cstr_url.Format(L"%s",A2W(cstr_urla));
#endifstd::string str_url;UNICODE_to_UTF8(cstr_url, str_url);const char *char_url=str_url.c_str();if(strcmp(char_url,"")==0){AfxMessageBox(_T("Input URL is NULL!"));return;}HWND screen_hwnd=NULL;screen_hwnd = this->GetDlgItem(IDC_SCREEN)->m_hWnd; if(playerstate!=STATE_PREPARE){AfxMessageBox(_T("Media is playing now."));return;}/* Create a new item *///m = libvlc_media_new_location (libvlc_inst, "http://mycool.movie.com/test.mov");libvlc_m = libvlc_media_new_path (libvlc_inst, char_url);/* Create a media player playing environement */libvlc_mp = libvlc_media_player_new_from_media (libvlc_m);/* No need to keep the media now */libvlc_media_release (libvlc_m);//on windowslibvlc_media_player_set_hwnd (libvlc_mp,screen_hwnd);/* play the media_player */int x=libvlc_media_player_play (libvlc_mp);//_sleep (30000); /* Let it play a bit */playerstate=STATE_PLAY;SetBtn(STATE_PLAY);SetTimer(1,1000,NULL);
}

暂停/继续

视频“暂停/继续”的源代码如下所示。其中调用了libvlc_media_player_set_pause()设定“暂停”或者是“继续”。
void CplayerGUIDlg::OnBnClickedPause()
{if(playerstate==STATE_PLAY){libvlc_media_player_set_pause(libvlc_mp,1);playerstate=STATE_PAUSE;GetDlgItem(ID_PAUSE)->SetWindowText(_T("Resume"));}else if(playerstate==STATE_PAUSE){libvlc_media_player_set_pause(libvlc_mp,0);playerstate=STATE_PLAY;GetDlgItem(ID_PAUSE)->SetWindowText(_T("Pause"));}
}

停止

视频“停止”的源代码如下所示。其中调用了libvlc_media_player_stop()停止视频播放,并且调用libvlc_media_player_release()释放相应的libvlc_media_player_t结构体。
void CplayerGUIDlg::OnBnClickedStop()
{if(libvlc_mp!=NULL){libvlc_media_player_stop (libvlc_mp);libvlc_media_player_release (libvlc_mp);KillTimer(1);}SystemClear();
}

视频播放进度杂时间轴的显示

随着视频的播放,需要在视频播放进度的时间轴上更新播放进度信息。在程序中使用了一个定时器完成这个功能。
在视频开始播放的时候,调用SetTimer()开启定时器。时间间隔设置为1000ms。
SetTimer(1,1000,NULL);
在视频停止播放的时候,调用KillTimer()结束定时器。
KillTimer(1);
在定时器的消息响应函数中,调用libvlc_media_player_get_time()获取当前视频的播放进度,此外调用libvlc_media_player_get_length()获取视频的总时长。
经过计算之后,就可以把计算的结果设置到相应的编辑框(Edit Control)以及滑动控制条(Slider Control)上。
void CplayerGUIDlg::OnTimer(UINT_PTR nIDEvent)
{if (nIDEvent == 1){CString curtimestr,durationstr;int curtime;int duration;int tns, thh, tmm, tss;int progress;//mscurtime = libvlc_media_player_get_time(libvlc_mp);if(curtime!=0){//change to secondtns = curtime/1000;thh  = tns / 3600;tmm  = (tns % 3600) / 60;tss  = (tns % 60);curtimestr.Format(_T("%02d:%02d:%02d"),thh,tmm,tss);m_curtime.SetWindowText(curtimestr);}duration  = libvlc_media_player_get_length(libvlc_mp);if(duration!=0){tns = duration/1000;thh  = tns / 3600;tmm  = (tns % 3600) / 60;tss  = (tns % 60);durationstr.Format(_T("%02d:%02d:%02d"),thh,tmm,tss);m_duration.SetWindowText(durationstr);progress=curtime*100/duration;m_progress.SetPos(progress);}}//Stop in the endif(libvlc_media_player_get_state(libvlc_mp)==libvlc_Ended)OnBnClickedStop();CDialogEx::OnTimer(nIDEvent);
}


视频播放点的调整

当鼠标拖动滑动控制条(Slider Control)控件上的滑块的时候,需要根据拖动的位置设置视频的播放进度。此时调用libvlc_media_player_set_position()设定视频的播放进度。消息响应函数中的代码如下所示。
void CplayerGUIDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{if (pScrollBar->GetSafeHwnd() == m_progress.GetSafeHwnd()){float posf=0.0;if(nSBCode==SB_THUMBPOSITION){posf=(float)nPos/100.0;libvlc_media_player_set_position(libvlc_mp,posf);}}CDialogEx::OnHScroll(nSBCode, nPos, pScrollBar);
}

libVLC中输入中文文件路径问题

libVLC使用英文作为输入路径的时候是没有问题的。但是当我们直接传递中文路径的时候,会出现libVLC将中文解析为乱码从而导致无法播放的问题。这个问题卡了我一阵子时间。造成这一问题的原因在于VLC的输入文件路径是使用UTF-8编码的。因此我们需要将输入路径转码为UTF-8编码。转码之后这一问题即得到了解决。

Unicode转码为UTF-8的函数代码如下所示。
void CplayerGUIDlg::UNICODE_to_UTF8(CStringW& unicodeString, std::string& str)
{int stringLength = ::WideCharToMultiByte(CP_UTF8, NULL, unicodeString, wcslen(unicodeString), NULL, 0, NULL, NULL);char* buffer = new char[stringLength + 1];::WideCharToMultiByte(CP_UTF8, NULL, unicodeString, wcslen(unicodeString), buffer, stringLength, NULL, NULL);buffer[stringLength] = '\0';str = buffer;delete[] buffer;
}

下载


Simplest libVLC Example


项目主页

SourceForge:https://sourceforge.net/projects/simplestlibvlcexample/

Github:https://github.com/leixiaohua1020/simplest_libvlc_example

开源中国:http://git.oschina.net/leixiaohua1020/simplest_libvlc_example


CDSN下载地址: http://download.csdn.net/detail/leixiaohua1020/8342413


本工程是包含了一些基于libVLC的示例程序。一共包含了如下几个子程序。
playerGUI: 最简单的基于libVLC的播放器-图形界面版。
simplest_libvlc_example: 最简单的基于libVLC的播放器。
simplest_libvlc_streamer: 最简单的基于libVLC的推流器。


http://chatgpt.dhexx.cn/article/cdPJ3gdL.shtml

相关文章

基于libVLC的视频播放器之二:使用VLC-Qt播放RTSP流

此篇是 使用VLC浏览器插件播放RTSP流的姊妹篇。 一.直接使用libVLC libVLC是VLC media player多媒体框架的核心引擎和接口,开发者使用它能轻松的创建大量具有VLC特性的应用。 最简单的基于libVLC的例子:最简单的基于libVLC的视频播放器详细介绍了libVL…

最简单的基于libVLC的例子:最简单的基于libVLC的视频播放器

最简单的基于libVLC的例子文章列表: 最简单的基于libVLC的例子:最简单的基于libVLC的视频播放器 最简单的基于libVLC的例子:最简单的基于libVLC的视频播放器(图形界面版) 最简单的基于libVLC的例子:最简…

用VLC开发视频播放器/组件(两种方式:libVLC / VLC-Qt)

测试环境 MSVC-2015Qt 5.14.2QCreator 1. libVLC(关键步骤) 参考:心流剑 libVLC 各版本 下载链接 我的下载版本为:3.0.11 sdk/lib文件夹目录 qmake vlc 部分的配置(路径根据自己的修改)只需要&#…

idea如何取消debug所有断点

1、debug模式下,在idea左下方找到【View Breakpoints】按钮或者直接按【CtrlShiftF8】快捷键,如下图: 2、在左侧窗口中,点击【Java Line Breakpoints】前方的全选框,如下图: 3、取消 【Java Line Breakp…

Idea断点for循环调试

前言 作为一个开发,最高兴和痛苦的事情就是排查问题,调试代码解决问题,掌握一些技巧可以提升效率,今天就讲讲for循环断点调试的技巧for循环断点调试 操作步骤: 1.在断点调试处加断点 2.点击断点处,鼠标右击…

IntelliJ IDEA-Debug断点调试 看这篇文章就够了

详解IntelliJ IDEA-Debug断点调试 如今,IntelliJ IDEA 目前深受广大开发者喜爱,我们在实际开发工作中,不管是用来阅读源码还是在开发过程中都需要进行代码调试。 以下为大家准备了一篇关于IntelliJ IDEA-Debug断点调试的文章,如…

IDEA 的基本介绍使用及断点调试

文章目录 1、IDE(集成开发环境)- IDEA2、IDE(集成开发环境)- Eclipse3、IDEA 的基本介绍和使用3.1、设置字体 和 颜色主题3.2、编译文件和源代码3.3、IDEA 常用快捷键3.4、模板/自定义模板 4、断点调试(debug)4.1、实际需求4.2、定…

idea debug调式进不了断点

问题: 在启动debug断点调试时,代码无法进入断点。 解决方案: 在网上搜索解决方案,看到说在settings——>Debugger下勾选如下位置即可。本人并未亲自测试,所以就做了一波搜集党。 我的解决方法:去掉如下…

idea断点调试jar包

本文以springbootdemo-0.0.1-SNAPSHOT.jar 为例,jar内容需与idea保持一致。 1、启动命令 常规jar启动:java -jar springbootdemo-0.0.1-SNAPSHOT.jar jar包断点调试启动:java -Xdebug -agentlib:jdwptransportdt_socket,servery,suspendn,ad…

如何在idea中打debug断点

在调试代码的时候,你的项目得debug模式启动,也就是点那个绿色的甲虫启动服务器,然后,就可以在代码里面断点调试啦。 下面不要在意,这个快捷键具体是啥,因为,这个keymap是可以自己配置的&#xf…

【IDEA 断点调试】

IDEA 断点调试 断点类型 行断点 【红色圆点】 点击左侧空白区域 、或 在行上ctrlF8 详细断点 【黄色圆点】 shift单击左侧空白区域,同时弹窗选择断点详细设置 方法断点 【红色菱形】 点击方法名所在左侧空白区域 。 进入方法后每一行都是挂起,打在接口…

IDEA debug 断点调试技巧

1、首先看下IDEA中Debug模式下的界面: ① 以Debug模式启动服务,左边的一个按钮则是以Run模式启动。在开发中,我一般会直接启动Debug模式,方便随时调试代码。 ② 断点:在左边行号栏单击左键,或者快捷键Ctrl…

IDEA 加断点debug时阻塞问题

今天有朋友提到一个问题,“我在springBoot项目中建一个Controller,然后写两个方法,方法1中加个断点,然后请求方法1,进入断点之后再请求方法二,此时方法二会一直等待,等方法一执行完才能再执行方…

Idea 进行断点调试的 快捷键

快捷键 功能描述 F8 单步调试,不进入函数内部 F7 单步调试,进入函数内部 ShiftF7 选择要进入的函数 ShiftF8 跳出函数 AltF9 运行到断点 AltF8 执行表达式查看结果 F9 继续执行,进入下一个断点或执行完程序 CtrlF8 设置/取消当前行断…

IDEA中断点调试

调试在开发中大量应用: 【1】Debug的优化设置:更加节省内存空间: 设置Debug连接方式,默认是Socket。 Shared memory是Windows 特有的一个属性,一般在Windows系统下建议使用此设置, 内存占用相对较少。 【…

idea debug无法打断点 以及解决办法

idea debug无法打断点 以及解决办法 今天工作中调试代码时候遇见一个问题 一行很普通的 map.put()代码 无法 进行断点调试 效果如图 出现这种情况大概有两种可能,一种是断点打在了错误的地方,程序进不到这里;第二种是有可能需要重新编译。…

IDEA的Debug断点调试

首先说一下我的IDEA的版本是windows Intelli IDEA2021.1.2 Debug 先打开IDEA中的Debug, 任意点击一个Debug的图标就可以打开下方的窗口 1.Debug模式启动服务,左边的一个按钮则是以Run模式启动。 2.断点:在左边行号栏单击左键即可建立一个断…

Intellij IDEA debug断点调试技巧总结

版本 IDEA 2019.3 主题:material dark。 操作系统:Mac OS command 对应 ctrloption 对于 alt 为项目配置了运行配置后,可以通过按 ShiftF9 在调试模式下启动它。 在 “调试工具” 窗口中,您可以看到框架和线程的状态、变量和表…

关于idea的八种断点调试

背景:在日常开发中,我们经常会使用到idea,那么debug就更不用说了,但是你真的会打断点么,看完这篇文章再下结论吧 (ps,部分图片因为公司做过内部分享,所以打码) 一&#…

idea 断点调试,点击Run to Cursor后,不进入断点

idea 断点调试,点击Run to Cursor后,不进入断点 解决方法: 点击run to cursor 后,第二次不进入断点了,此时点击右侧窗口的 pause ,暂停程序 点击 Resume Program,恢复程序,即可重新进断点