zoukankan      html  css  js  c++  java
  • 最简单的基于libVLC的例子:最简单的基于libVLC的视频播放器

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

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

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

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

    最简单的基于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:moviecuc_ieschool.flv”下的视频,实际使用的代码如下所示。

    [cpp] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. libvlc_media_new_location (inst, "file:///F:\movie\cuc_ieschool.flv");  

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

    [cpp] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. 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加载完成之后,才能通过上述几个函数获得正确的值(自己推测的,还没有深究)。

    代码

    [cpp] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. /** 
    2.  * 最简单的基于libVLC的播放器 
    3.  * Simplest libVLC Player 
    4.  * 
    5.  * 雷霄骅 Lei Xiaohua 
    6.  * leixiaohua1020@126.com 
    7.  * 中国传媒大学/数字电视技术 
    8.  * Communication University of China / Digital TV Technology 
    9.  * http://blog.csdn.net/leixiaohua1020 
    10.  * 
    11.  * 本程序是一个最简单的基于libVLC的视频播放器。 
    12.  * 适合初学者学习libVLC。 
    13.  * 
    14.  * This example is the simplest Video Player based on libVLC. 
    15.  * Suitable for the beginner of libVLC. 
    16.  */  
    17. #include <Windows.h>  
    18. #include "vlc/vlc.h"  
    19.   
    20. int main(int argc, char* argv[])  
    21.  {  
    22.      libvlc_instance_t * inst;  
    23.      libvlc_media_player_t *mp;  
    24.      libvlc_media_t *m;  
    25.        
    26.      libvlc_time_t length;  
    27.      int width;  
    28.      int height;  
    29.      int wait_time=5000;  
    30.   
    31.      //libvlc_time_t length;  
    32.   
    33.      /* Load the VLC engine */  
    34.      inst = libvlc_new (0, NULL);  
    35.     
    36.      //Create a new item  
    37.      //Method 1:  
    38.      //m = libvlc_media_new_location (inst, "file:///F:\movie\cuc_ieschool.flv");  
    39.      //Screen Capture  
    40.      //m = libvlc_media_new_location (inst, "screen://");  
    41.      //Method 2:  
    42.      m = libvlc_media_new_path (inst, "cuc_ieschool.flv");  
    43.           
    44.      /* Create a media player playing environement */  
    45.      mp = libvlc_media_player_new_from_media (m);  
    46.   
    47.        
    48.      /* No need to keep the media now */  
    49.      libvlc_media_release (m);  
    50.    
    51.      // play the media_player  
    52.      libvlc_media_player_play (mp);  
    53.   
    54.      //wait until the tracks are created  
    55.      _sleep (wait_time);  
    56.      length = libvlc_media_player_get_length(mp);  
    57.      width = libvlc_video_get_width(mp);  
    58.      height = libvlc_video_get_height(mp);  
    59.      printf("Stream Duration: %ds ",length/1000);  
    60.      printf("Resolution: %d x %d ",width,height);  
    61.      //Let it play   
    62.      _sleep (length-wait_time);   
    63.       
    64.      // Stop playing  
    65.      libvlc_media_player_stop (mp);  
    66.    
    67.      // Free the media_player  
    68.      libvlc_media_player_release (mp);  
    69.    
    70.      libvlc_release (inst);  
    71.    
    72.      return 0;  
    73.  }  

    运行结果

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

    下载

    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://blog.csdn.net/leixiaohua1020/article/details/42363079

  • 相关阅读:
    装饰者模式
    Linux 编译的一些注意参数
    CodeBlocks使用静态链接库
    [BOOST] BOOST::String
    [BOOST] BOOST::Regex
    如何启动仿真环境里的网络联接?
    BlackCore
    Silverlight 中为Dialog添加委托
    c# windows应用程序或C# 控制台应用程序 添加web引用步骤
    Hyperv Server Q&A
  • 原文地址:https://www.cnblogs.com/liushui-sky/p/6861921.html
Copyright © 2011-2022 走看看