• 基于libVLC(VLC SDK)的视频播放Demo


    由于实习项目需要,最近在研究VLC Media Player,该播放器来源于École Centrale Paris(巴黎中央理工学校)的一个学术项目,名为VideoLAN,VLC意为VideoLAN Client。后发展为一个由志愿者组成的非营利性组织,开发并提供免费、开源的多媒体解决方案。

    我的工作是利用该播放器提供的开发工具libVLC来实现一个功能自定义的媒体播放器,使用C++语言。

    在摸索的过程中参考了几篇博客,也参考了官方给出的入门教程,所以说代码不是问题。对我来说问题是如何配置VLC的开发环境。

    经过几番折腾,终于找到了一个可行的方案,下面按步骤来说明。

      Step 0:

        在VLC官网上下载最新的软件安装包;

        链接:http://www.videolan.org/vlc/index.html

        记住安装目录,定位sdk文件夹;

        

      Step 1:

        新建一个Win32控制台应用程序(本人在Visual Studio 2012下);

        

        简单设置

        

      Step 2:

        在项目属性设置页面中,添加包含目录;

        

        新建一行包含目录;

        

        选择sdk文件夹下的include文件夹;

        

        同理,添加库目录,路径为sdk文件夹下的lib文件夹,设置后如下;

        

        设置附加依赖项;

        

        添加两个库文件vlclib.lib、vlclibcore.lib;

        

        

      Step 3:

        新建源文件,键入源代码;

     1 #include <windows.h>
     2 #include <vlc/vlc.h>
     3 #include <time.h>
     4 
     5 int main(int argc, char* argv[])
     6 {
     7     libvlc_instance_t *     vlc_ins    = NULL;
     8     libvlc_media_player_t * vlc_player = NULL;
     9     libvlc_media_t *        vlc_media  = NULL;
    10 
    11     const char * vlc_args[] = 
    12     {
    13         "-I",
    14         "dummy",
    15         "--ignore-config",
    16         "--extraintf=logger",
    17         "--verbose=2", 
    18     };  
    19 
    20     // 创建一个VLC实例
    21     vlc_ins = libvlc_new(sizeof(vlc_args)/sizeof(vlc_args[0]), vlc_args);
    22     if(vlc_ins != NULL)
    23     {
    24         // 创建一个VLC播放器
    25         vlc_player = libvlc_media_player_new(vlc_ins);
    26         if(vlc_player != NULL)
    27         {
    28             // 通过文件路径创建一个媒体实例,这里是我的测试文件
    29             vlc_media = libvlc_media_new_path(vlc_ins, "g:\123.hlv");
    30             if(vlc_media != NULL)
    31             {
    32                 // 解析媒体实例
    33                 libvlc_media_parse(vlc_media);
    34                 // 获取媒体文件的播放长度,  返回 ms
    35                 libvlc_time_t duration = libvlc_media_get_duration(vlc_media);
    36 
    37                 // 此处是获取媒体包含多个的视频和音频轨以及其他类型的轨道信息
    38                 libvlc_media_track_info_t *media_tracks = NULL;
    39                 int trackCount = libvlc_media_get_tracks_info(vlc_media, &media_tracks);
    40                 // 这里是释放内存,但我测试的时候会有问题,还没仔细研究是为何
    41                 // free(media_tracks);  // crash?
    42 
    43                 // 把打开的媒体文件设置给播放器
    44                 libvlc_media_player_set_media(vlc_player, vlc_media);
    45 
    46                 // 因为是windows系统,所以需要设置一个HWND给播放器作为窗口,这里就直接使用桌面窗口,这里仅是测试
    47                 libvlc_media_player_set_hwnd(vlc_player, ::GetDesktopWindow());
    48                 // 开始播放视频
    49                 libvlc_media_player_play(vlc_player);
    50 
    51                 // 这里仅是为了打印一些信息出来,20秒后退出
    52                 time_t last_time = time(NULL);
    53                 while((time(NULL) < (last_time + 200)))
    54                 {
    55                     Sleep(10);
    56                     // 获取当前播放位置
    57                     libvlc_time_t play_time = libvlc_media_player_get_time(vlc_player);
    58                     printf("playing time : %lld ms
    ", (__int64)(play_time));
    59 
    60                     // 获取媒体的状态
    61                     // libvlc_state_t media_state = libvlc_media_get_state(vlc_media);
    62                     // printf("
    media state : %d
    ", (int)(media_state));
    63                 }
    64                 // 停止
    65                 libvlc_media_player_stop(vlc_player);
    66                 // 释放
    67                 libvlc_media_release(vlc_media);
    68             }
    69             // 释放
    70             libvlc_media_player_release(vlc_player);
    71         }
    72         // 释放
    73         libvlc_release(vlc_ins);
    74     }
    75     return 0;
    76 }

        参考链接1:http://blog.sina.com.cn/s/blog_62a8419a01014eey.html

        参考链接2:http://www.oschina.net/code/snippet_230937_45237

        参考链接3:https://wiki.videolan.org/LibVLC_Tutorial/

      Step 4:

        此时运行代码会出现“core libvlc error: No plugin found”的错误。还需要手动导入VLC的plugin文件夹;

        进入VLC安装路径:C:Program Files (x86)VideoLANVLC,将其下plugin文件夹拷贝至VS项目的Debug文件夹下;

        

        另外可能必要的操作是将VLC安装目录下的libvlc.dll以及libvlccore.dll拷贝至项目Debug路径下,如上图篮框;

      至此,设置完毕,运行项目,可以正常播放指定路径下的本地视频。

  • 相关阅读:
    mysql的四种隔离
    mysql-事物
    Mysql数据备份
    线程池
    springboot整合log4j2
    springboot项目部署
    数组去重
    倒叙输出算法
    使用LLDB和debugserver对ios程序进行调试
    Linux使用pyinstaller 编译py成可执行程序
  • 原文地址:https://www.cnblogs.com/zmt0429/p/4352584.html
Copyright © 2020-2023  润新知