VLC介绍以及库的使用

article/2025/10/1 17:54:38

VLC原指VideoLAN客户端(VideoLANClient),是一款开源的、跨平台的、可扩展的、多媒体播放器、流媒体服务器及框架,可播放大多数多媒体文件,以及DVD、音频CD、VCD及各类流媒体协议,现更名为VLC media player,最新版本为2.2.0。

VideoLanServer(VLS)的功能已经合并到VLC中,所以VLC不仅仅是一个音/视频播放器,它也可以作为小型的视频服务器(或作为流媒体服务器使用),更可以一边播放一边转码,把视频流发送到网络上。VLC最为突出的就是网络流的播放功能。

VLC通常不影响也不依赖于系统中自带的解码器。

VLC的license是GPL

VLC采用多线程并行解码架构,线程之间通过单独的一个线程控制所有线程的状态,解码器采用filter模式,组织方式为模块架构

VLC播放一个视频大致分为4个步骤:(1)、access,从不同的源获取流;(2)、demux,就是把通常合在一起的音频和视频分离(还有可能的字幕);(3)、decode,解码,包括音频和视频的解码;(4)、output,输出,也分为音频和视频的输出(aout和vout)。

VLC能够处理的流类型包括:(1)、ES(ElementaryStreams);(2)、PS(Program Stream);TS(Transport Stream)

下面简单说明下源码中各个目录的作用,其实源码中大部分每个.h、.c文件的开始处都对此文件的作用进行了简单描述:

1.        /autotools:

2.        /bin:此目录下的winvlc.c文件用于生成.exe执行文件;

3.        /compat:生成libcompat库的源文件,此目录下包含了与平台相关的一些代码,比如Windows、POSIX、BSD等;

4.        /contrib:第三方库,此目录下包含很多空的目录,如果要想编译这些第三方库,需要自己单独下;

5.        /doc:一些log等说明信息;

6.        /extras:一些额外的文件;

7.        /include:所有头文件的集合;

8.        /lib:生成libvlc库的源文件;

9.        /m4:宏处理器;

10.    /modules:VLC的模块部分,这些模块只在程序载入它们时有效;每一个模块,可提供不同的功能,它们适合特定文件或某一特定的环境;此外,audio_output/video_output/interface模块都写成了可跨平台的代码,方便支持新的平台。如果你想编译某个模块可以通过:% ./configure --enable-module_name ;如果不想编译某个模块可以通过: %  ./configure  --disable-module_name ;如果想得到某个模块的帮助信息,可通过:%vlc --advanced -p module_name ;    

11.    /modules/access:从不同的源获取流;

12.  /modules/access_output:以不同的形式输出流;

13.  /modules/arm_neon:arm架构,一些汇编代码;

14.  /modules/audio_filter:各种音频滤波器;

15.  /modules/audio_mixer:音量设置模块;

16.  /modules/audio_output:音频输出模块,声音将会输出到你的音频系统中;

17.    /modules/codec:音视频编解码模块;

18.    /modules/control:动作控制功能,如鼠标手势控制vlc等;

19.    /modules/demux:将合在一起的音频和视频分离(还有可能包括字幕);

20.    /modules/gui:不同平台的用户界面模块;

21.    /modules/hw/vdpau:VDPAU(VideoDecode and Presentation API for Unix)的API可以让视频播放器把一部分的视频解码和视频图像补偿交给GPU,最初由NVIDIA开发;

22.    /modules/lua:与Lua脚本语言相关的模块;

23.    /modules/meta_engine:

24.    /modules/misc:杂项,包括webservice解析、xml解析、playlist输出模块等;

25.    /modules/mux:将视频、音频、字幕合并为某一个视频格式,如.avi、.mp4等;

26.    /modules/notify:notificationplugin;

27.    /modules/packetizer:音视频打包模块,如H264/AVC、MLP/TrueHD等;

28.    /modules/services_discovery:servicesdiscovery module;

29.    /modules/stream_filter:streamfilter;

30.    /modules/stream_out:流输出模块;

31.    /modules/text_renderer:文本渲染模块;

32.    /modules/video_chroma:图像格式转换默认,如YUV到RGB等;

33.    /modules/video_filter:视频各种滤波模块,例如对渲染的图像进行色度、对比度、饱和度的调整等;

34.    /modules/video_output:视频输出模块,允许VLC显示视频到你的屏幕上;

35.    /modules/video_splitter:视频分割模块;

36.    /modules/visualization:可视化模块,包括projectM、GOOM等;

37.    /po:i18n(语言翻译)文件;

38.    /share:图标、脚本等等;

39.    /src:生成libvlccore库的源文件;

40.    /src/Android:android平台专用模块;

41.    /src/audio_output:音频输出模块;

42.    /src/config:配置模块,从命令行和配置文件加载配置,提供功能模块的读取和写入配置;

43.    /src/darwin:Mac(Darwin)平台专用模块;

44.    /src/extras:一些平台的特殊代码;

45.    /src/input:获取流模块,建立并读取一个输入流,并且分离其中的音频和视频,然后把分离好的音频和视频流发送给解码器;

46.    /src/interface:用户接口模块,提供代码中可以调用的接口;

47.    /src/misc:libvlc库使用的其它部分功能,是被其它模块使用的杂项,如数据库管理、CPU检测、图像的读写等;

48.    /src/modules:模块管理;

49.    /src/network:提供网络接口(socket管理,网络错误等);

50.    /src/os2:OS/2平台专用模块;

51.    /src/playlist:播放列表控制模块;

52.    /src/posix:与POSIX(可移植操作系统接口)相关的模块;


53.    /src/stream_output:输出音频流和视频流到网络;

54.    /src/test:libvlccore库的测试模块;

55.    /src/text:字符集;

56.    /src/video_output:初始化视频播放器,把从解码器得到的视频画面转化格式(从YUV转为RGB)然后播放它们;

57.    /src/win32:windows平台专用模块;

58.    /test:一些脚本和测试代码;

VLC中所有的模块均以动态库(插件)方式来管理,就连main模块也不例外。可以在windows下查看VLC安装目录下的plugin目录,里面包含了所有的动态库。当VLC启动的时候,主模块采用动态加入的方式。采用宏定义将该模块的入口函数导出,以让其它函数调用,同时入口函数里面初始化了该模块相关的所有函数指针。

VLC采用全模块化结构,在系统内部,通过动态的载入所需的模块,放入一个module_bank的结构体中统一管理,连VLC的Main模块也是通过插件的方式动态载入的(通过module_InitBank函数在初始化建立module_bank时)。对于不支持动态载入插件的系统环境中,VLC也可以采用builtin的方式,在VLC启动的时候静态载入所需要的插件,并放入module_bank统一管理。VLC无论是作为流媒体服务器还是多媒体播放器,它的实质就是一个”播放器”,它实质处理的是ES、PES、PS、TS等流间的转换、传输与显示。

下来基于 VLC SDK来开发自己的播放器

1.先下载VLC player,  Official download of VLC media player, the best Open Source player - VideoLAN,  安装的时候要安装开发库(SDK)
2.用VC 6.0/2003/2005/2008/2010 IDE均可开发自己的测试程序
3.创建一个控制台程序,当然创建一个窗口程序更好,由于只是为了关注于如何使用VLC SDK,所以都无所谓的
4.在工程中设置好vlc的 include和lib路径,一般VLC sdk路径是C:\Program Files\VideoLAN\VLC\ 下的两个动态库和一个文件夹中的动态库。
5.复制libvlc.dll, libvlccore.dll,plugins目录到工程debug目录,如果是release需要复制到release目录,目录结构如图:

用C/C++开发基于VLC <wbr>SDK的视频播放器


 
之后 就是完整的代码:
#include
#include
#include
#include#include
#pragma comment(lib, "libvlc.lib")
#pragma comment(lib, "libvlccore.lib")int main(int argc, char* argv[])
{
libvlc_instance_t *     vlc_ins    = NULL;
libvlc_media_player_t * vlc_player = NULL;
libvlc_media_t *        vlc_media  = NULL;const char * vlc_args[] = 
{
"-I",
"dummy",
"--ignore-config",
"--extraintf=logger",
"--verbose=2", 
};  // 创建一个VLC实例
vlc_ins = libvlc_new(sizeof(vlc_args)/sizeof(vlc_args[0]), vlc_args);
if(vlc_ins != NULL)
{
// 创建一个VLC播放器
vlc_player = libvlc_media_player_new(vlc_ins);
if(vlc_player != NULL)
{
// 通过文件路径创建一个媒体实例,这里是我的测试文件
vlc_media = libvlc_media_new_path(vlc_ins, "d:\\clips\\org.mp4");
if(vlc_media != NULL)
{
// 解析媒体实例
libvlc_media_parse(vlc_media);
// 获取媒体文件的播放长度,  返回 ms
libvlc_time_t duration = libvlc_media_get_duration(vlc_media);// 此处是获取媒体包含多个的视频和音频轨以及其他类型的轨道信息
libvlc_media_track_info_t *media_tracks = NULL;
int trackCount = libvlc_media_get_tracks_info(vlc_media, &media_tracks);
// 此处获取信息...
// 释放内存
libvlc_media_tracks_release(&media_tracks, trackCount);
// 把打开的媒体文件设置给播放器
libvlc_media_player_set_media(vlc_player, vlc_media);// 因为是windows系统,所以需要设置一个HWND给播放器作为窗口,这里就直接使用桌面窗口,这里仅是测试
libvlc_media_player_set_hwnd(vlc_player, ::GetDesktopWindow());
// 开始播放视频
libvlc_media_player_play(vlc_player);// 这里仅是为了打印一些信息出来,20秒后退出
time_t last_time = time(NULL);
while((time(NULL) < (last_time + 20)))
{
Sleep(10);
// 获取当前播放位置
libvlc_time_t play_time = libvlc_media_player_get_time(vlc_player);
printf("playing time : %lld ms\r", (__int64)(play_time));// 获取媒体的状态
// libvlc_state_t media_state = libvlc_media_get_state(vlc_media);
// printf("\nmedia state : %d\n", (int)(media_state));
}
// 停止
libvlc_media_player_stop(vlc_player);
// 释放
libvlc_media_release(vlc_media);
}
// 释放
libvlc_media_player_release(vlc_player);
}
// 释放
libvlc_release(vlc_ins);
}
return 0;
}

 
编译运行,就可以在桌面上看到播放的视频了,用VLC SDK做自己的播放器是如此的简单。


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

相关文章

LibVLC —— 常用函数解析

函数 ● LIBVLC_API libvlc_instance_t *libvlc_new( int argc , const char *const *argv ); 功能&#xff1a;创建libvlc_instance_t对象。 用法&#xff1a; libvlc_instance_t *VlcInstance libvlc_new(0, nullptr);参数&#xff1a;                具体…

【玩转VLC】--- 基于libvlc写个最简单的播放器

通过【玩转VLC】--- ubuntu下编译vlc 我们已经把vlc编译哦了。生成了一系列的bin和libvlc.so. 接下来我们就用编译好的libvlc.so搞一个最简单的播放器。 我认为vlc的伟大之处有一点就是他并没有把整个播放器写成一个硬生生的bin。而是独立出来个libvlc库&#xff0c;其他的玩…

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

最简单的基于libVLC的例子文章列表&#xff1a; 最简单的基于libVLC的例子&#xff1a;最简单的基于libVLC的视频播放器 最简单的基于libVLC的例子&#xff1a;最简单的基于libVLC的视频播放器&#xff08;图形界面版&#xff09; 最简单的基于libVLC的例子&#xff1a;最简…

C++调用libVLC播放视频

1、下载libVLC的sdk Index of /pub/videolan/vlc/ 注意下载.7z结尾的 2、Visual Studio建立C的windows控制台项目 3、文件准备 &#xff08;1&#xff09;sdk文件夹解压缩到项目文件夹下 &#xff08;2&#xff09;在Debug下方压缩包内的几个文件 、 4、配置项目属性 注意…

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

最简单的基于libVLC的例子文章列表&#xff1a; 最简单的基于libVLC的例子&#xff1a;最简单的基于libVLC的视频播放器 最简单的基于libVLC的例子&#xff1a;最简单的基于libVLC的视频播放器&#xff08;图形界面版&#xff09; 最简单的基于libVLC的例子&#xff1a;最简…

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

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

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

最简单的基于libVLC的例子文章列表&#xff1a; 最简单的基于libVLC的例子&#xff1a;最简单的基于libVLC的视频播放器 最简单的基于libVLC的例子&#xff1a;最简单的基于libVLC的视频播放器&#xff08;图形界面版&#xff09; 最简单的基于libVLC的例子&#xff1a;最简…

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

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

idea如何取消debug所有断点

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

Idea断点for循环调试

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

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

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

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

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

idea debug调式进不了断点

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

idea断点调试jar包

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

如何在idea中打debug断点

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

【IDEA 断点调试】

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

IDEA debug 断点调试技巧

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

IDEA 加断点debug时阻塞问题

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

Idea 进行断点调试的 快捷键

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

IDEA中断点调试

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