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

本文记录使用libVLC的开发的最简单的视频播放器示例。VLC Media Player是一款优秀的播放器,但是由于它的源代码编译的难度比较大,一直没有深入研究过它的开发方面的技术。此前触到了一些VLC开发方面的东西,因此总结了一下libVLC的开发示例程序。

如何获取VLC的SDK

VLC开发所需的库文件可以有2种获取方法:

1. 自行编译
2. 直接从安装目录里面拷贝出来

第一种方法难度要大一些。尤其是在Windows下编译VLC是个比较麻烦的事情。一般情况下可以选择第二种方法获取VLC开发所需的文件。
开发VLC所需的文件的位置:

1. 动态链接库*.dll:安装目录下的libvlc.dll,libvlccore.dll以及plugins目录下的所有文件。
PS:VLC支持非常多的plugin。因此plugins目录的体积确实是非常大的。
2. 静态链接库*.lib:安装目录/sdk/lib
3. 头文件*.h:安装目录/sdk/include

新建一个VC工程后,把上述三类文件分别拷贝至新工程目录下,并且配置它们的路径之后,就可以使用libVLC进行开发了。

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

使用libVLC开发一个播放器十分的容易。最简单的基于libVLC的视频播放器的流程图如下图所示。

流程图中包含了3个结构体:

libvlc_instance_t:代表一个libVLC的实例。
libvlc_media_t:代表一个可以播放的媒体。
libvlc_media_player_t:代表一个VLC媒体播放器(一个视频播放器播放一个视频)。注意VLC并不仅仅用于媒体播放。

创建或者以上3个结构体通过以下6个函数:

libvlc_new():创建libvlc_instance_t。
libvlc_media_new_path():创建libvlc_media_t。
libvlc_media_player_new_from_media():创建libvlc_media_player_t。
libvlc_media_player_release():释放libvlc_media_player_t
libvlc_media_release():释放libvlc_media_t。
libvlc_release():释放libvlc_instance_t。

可以已通过下面的函数控制媒体的播放或者暂停,这些函数都需要使用libvlc_media_player_t作为参数。这里处于简化的目的,只使用了播放和停止函数:

libvlc_media_player_play():播放。
libvlc_media_player_pause():暂停。
libvlc_media_player_stop():停止。

除了上述3个函数之外,还包括libvlc_media_player_set_position()等函数,这里不再一一记录。

几点注意事项

libvlc_media_t的创建

创建libvlc_media_t有两种方法:libvlc_media_new_path()和libvlc_media_new_location()。简单描述一下这两个函数的区别:libvlc_media_new_location()用于打开协议,而libvlc_media_new_path()用于打开文件。因而传递给libvlc_media_new_path()的就是普通的文件路径(绝对路径例如D:\xxx.flv,或者相对路径例如xxx.flv),而传递给libvlc_media_new_location()的就是协议地址(例如“udp://….”,“http://”)。但是这里有一点需要注意,在VLC中“文件”也属于一种广义上的“协议”。因此使用libvlc_media_new_location()也可以打开文件,但是必须在文件路径前面加上“文件协议”的标记“file:///”。例如打开“F:\movie\cuc_ieschool.flv”下的视频,实际使用的代码如下所示。

libvlc_media_new_location (inst, "file:///F:\\movie\\cuc_ieschool.flv");

此外,VLC还支持很多“神奇”的协议,比如输入“screen://”协议就可以进行屏幕录制,代码如下。

libvlc_media_new_location (inst, "screen://");

把libVLC的弹出窗口嵌入到程序中

在这里我只实践过Windows下把libVLC的弹出窗口嵌入到程序中。将窗口或者控件的句柄传递给libvlc_media_player_set_hwnd()函数即可。
这里有一点需要注意,如果把libVLC弹出窗口嵌入到程序中的话,“全屏”功能就不能使用了。

关于libVLC加载的问题

在libVLC中可以通过libvlc_media_player_get_length(),libvlc_video_get_width(),libvlc_video_get_height()等函数获取到视频的时长,宽,高等信息。但是有一个很奇怪的现象:如果在调用完libvlc_media_player_play()之后立即调用上述3个函数的话,返回的值都是0,只有“等待”一段时间(例如调用sleep())后再调用上述函数,才能得到正确的数值。对于这种现象,我觉得可能是libVLC加载完成之后,才能通过上述几个函数获得正确的值(自己推测的,还没有深究)。

代码

/**
 * 最简单的基于libVLC的播放器
 * Simplest libVLC Player
 *
 * 雷霄骅 Lei Xiaohua
 * [email protected]
 * 中国传媒大学/数字电视技术
 * Communication University of China / Digital TV Technology
 * http://blog.csdn.net/leixiaohua1020
 *
 * 本程序是一个最简单的基于libVLC的视频播放器。
 * 适合初学者学习libVLC。
 *
 * This example is the simplest Video Player based on libVLC.
 * Suitable for the beginner of libVLC.
 */
#include <Windows.h>
#include "vlc/vlc.h"

int main(int argc, char* argv[])
 {
     libvlc_instance_t * inst;
     libvlc_media_player_t *mp;
     libvlc_media_t *m;

	 libvlc_time_t length;
	 int width;
	 int height;
	 int wait_time=5000;

	 //libvlc_time_t length;

     /* Load the VLC engine */
     inst = libvlc_new (0, NULL);

     //Create a new item
	 //Method 1:
     //m = libvlc_media_new_location (inst, "file:///F:\\movie\\cuc_ieschool.flv");
	 //Screen Capture
	 //m = libvlc_media_new_location (inst, "screen://");
	 //Method 2:
     m = libvlc_media_new_path (inst, "cuc_ieschool.flv");

     /* Create a media player playing environement */
     mp = libvlc_media_player_new_from_media (m);

     /* No need to keep the media now */
     libvlc_media_release (m);

     // play the media_player
     libvlc_media_player_play (mp);

	 //wait until the tracks are created
	 _sleep (wait_time);
	 length = libvlc_media_player_get_length(mp);
	 width = libvlc_video_get_width(mp);
	 height = libvlc_video_get_height(mp);
	 printf("Stream Duration: %ds\n",length/1000);
	 printf("Resolution: %d x %d\n",width,height);
	 //Let it play
     _sleep (length-wait_time); 

     // Stop playing
     libvlc_media_player_stop (mp);

     // Free the media_player
     libvlc_media_player_release (mp);

     libvlc_release (inst);

     return 0;
 }

运行结果

程序运行后,会弹出一个窗口播放“cuc_ieschool.flv”文件。

下载

Simplest libVLC Example

SourceForge项目主页: https://sourceforge.net/projects/simplestlibvlcexample/
CDSN下载地址: http://download.csdn.net/detail/leixiaohua1020/8342413

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

时间: 2024-10-12 22:15:38

最简单的基于libVLC的例子:最简单的基于libVLC的视频播放器的相关文章

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

===================================================== 最简单的基于libVLC的例子文章列表: 最简单的基于libVLC的例子:最简单的基于libVLC的视频播放器 最简单的基于libVLC的例子:最简单的基于libVLC的视频播放器(图形界面版) 最简单的基于libVLC的例子:最简单的基于libVLC的推流器 ===================================================== 本文记录基于libVL

转:基于libVLC的视频播放器

本文来自于:http://blog.csdn.net/leixiaohua1020/article/details/42363079 ? 最简单的基于libVLC的例子:最简单的基于libVLC的视频播放器 本文记录使用libVLC的开发的最简单的视频播放器示例.VLC Media Player是一款优秀的播放器,但是由于它的源代码编译的难度比较大,一直没有深入研究过它的开发方面的技术.此前触到了一些VLC开发方面的东西,因 此总结了一下libVLC的开发示例程序. 如何获取VLC的SDK VL

100行代码实现最简单的基于FFMPEG+SDL的视频播放器(SDL1.x)【转】

转自:http://blog.csdn.net/leixiaohua1020/article/details/8652605 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] 简介 流程图 simplest_ffmpeg_player标准版代码 simplest_ffmpeg_player_suSU版代码 结果 FFMPEG相关学习资料 补充问题 ===================================================== 最简单的基于FFmp

一个简单的 ASP.NET MVC 例子演示如何在 Knockout JS 的配合下,使用 TypeScript 。

前言 TypeScript 是一种由微软开发的自由和开源的编程语言.它是JavaScript的一个超集,而且本质上向这个语言添加了可选的静态类型和基于类的面向对象编程.安德斯·海尔斯伯格,C#的首席架构师,已工作于TypeScript的开发.TypeScript扩展了 JavaScript 的句法,所以任何现有的JavaScript程序可以不加改变的在TypeScript下工作.TypeScript是为大型应用之开发而设计,而编译时它产生 JavaScript 以确保兼容性.TypeScript

最简单的基于DirectShow的示例:视频播放器自定义版

本文记录一个简单的基于DirectShow的自定义的视频播放器.这里所说的"自定义播放器",实际上指的是自己在Filter Graph中手动逐个添加Filter,并且连接这些Filter的后运行的播放器.这么做相对于使用RenderFile()这种"智能"创建Filter Graph的方法来说要复杂不少,但是可以让我们更加了解DirectShow的体系. 流程图 最简单的基于DirectShow的自定义的视频播放器的流程如下图所示. 该流程图中包含如下变量: IGr

最简单的基于DirectShow的示例:视频播放器

本文记录一个最简单的基于DirectShow的视频播放器.DirectShow是一个庞大的框架,可以在Windows下实现多种多样的视频处理需求.但是它的"庞大"也使得新手不太容易学习它的使用.本文的例子正是为解决这一问题而做的,它只包含了使用DirectShow播放一个视频文件所需要的最重要的函数. 流程图 最简单的使用DirectShow播放视频文件的流程如下图所示. 流程图中涉及到几个接口如下所示. IGraphBuilder:继承自IFilterGraph,用于构建Filter

最简单的基于FFMPEG+SDL的视频播放器 ver2 (采用SDL2.0)

简介 之前做过一个FFMPEG+SDL的简单播放器:<100行代码实现最简单的基于FFMPEG+SDL的视频播放器>.该播放器采用SDL1.2显示视频.最近有不少人反映SDL已经升级到2.0版本了,甚至官网的Wiki上都只有SDL2.0的文档了,因此下载了SDL 2.0 并且进行了简单的研究.随后对此前的播放器进行了修改,将SDL1.2换成了SDL2.0. 注:<100行代码实现最简单的基于FFMPEG+SDL的视频播放器>文章中提到的很多知识这里不再重复.本文重点记录SDL1.2

最简单的基于FFMPEG+SDL的视频播放器:拆分-解码器和播放器

本文补充记录<最简单的基于FFMPEG+SDL的视频播放器>中的两个例子:FFmpeg视频解码器和SDL像素数据播放器.这两个部分是从视频播放器中拆分出来的两个例子.FFmpeg视频解码器实现了视频数据到YUV数据的解码,而SDL像素数据播放器实现了YUV数据的显示.简而言之,原先的FFmpeg+SDL视频播放器实现了: 视频数据->YUV->显示器 FFmpeg视频解码器实现了: 视频数据->YUV SDL像素数据播放器实现了: YUV->显示器 FFmpeg视频解码

C语言基于GTK+Libvlc实现的简易视频播放器

小编心语:现下,各种视频播放软件层出不穷,竞争也越演越烈,不知道大家有木有这个想法,小编有时在想能不能做一款属于自己的视频播放器呢~小编特意去实验楼,整理出了这篇关于如何实现简易视频播放器的博文.简易播放器,你值得拥有~ 友情提示:这里只是前篇,只是一些简单的功能,其他功能将会在后篇为大家介绍-- C语言基于GTK+Libvlc实现的简易视频播放器 一.课程说明 如果你学习过之前上线的pygtk实现有道词典的项目课,那应该对gtk的使用有一些了解了,这个项目课学起来会相对轻松一些. 关于Gtk或