zoukankan      html  css  js  c++  java
  • 用C/C++开发基于VLC SDK的视频播放器

    在windows系统如果开发万能播放器,一般都是基本DirectShow来开发,开发也很简单,但缺点也很多,一个文件格式是否能够播放完全取决于你 是否安装了正确的解析器和解码器,即使现在有了万能解器安装包也会出现很多问题,不过自从很多开源软件的出现,比如大名鼎鼎的ffmpeg,vlc等,一 切都变得简单起来,基于ffmpeg sdk开发就不多介绍了,本文主要介绍基于 VLC SDK来开发自己的播放器,一切都是那么的简单.

     
    1.先下载VLC player, http://www.videolan.org/vlc/,  安装的时候要安装开发库(SDK)
    2.用VC 6.0/2003/2005/2008/2010 IDE均可开发自己的测试程序
    3.创建一个控制台程序,当然创建一个窗口程序更好,由于只是为了关注于如何使用VLC SDK,所以都无所谓的
    4.在工程中设置好vlc的 include和lib路径,一般VLC sdk路径是C:Program FilesVideoLANVLCsdk
    5.复制libvlc.dll, libvlccore.dll,plugins目录到工程debug目录,如果是release需要复制到release目录,目录结构如图:
                用C/C++开发基于VLC SDK的视频播放器

    之后 就是完整的代码:
     
    #include <stdio.h>
    #include <tchar.h>
    #include <time.h>
    #include <windows.h>
     
    #include <vlc/vlc.h>
    #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);
    // 这里是释放内存,但我测试的时候会有问题,还没仔细研究是为何
    // free(media_tracks);  // crash?
     
    // 把打开的媒体文件设置给播放器
    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 ", (__int64)(play_time));
     
    // 获取媒体的状态
    // libvlc_state_t media_state = libvlc_media_get_state(vlc_media);
    // printf(" media state : %d ", (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做自己的播放器是如此的简单。
     
     
    VLC SDK 怎么知道VLC 已经播放结束,急。

    我已经用VLC SDK 嵌入到MFC中,能播放视频,但是想知道视频播放的状态,就是知道什么时候结束的。

    ------解决方案--------------------------------------------------------
    里面有一个libvlc_media_player_get_state获取播放状态的函数,如果返回libvlc_Ended,则表示视频已经播放完了。
  • 相关阅读:
    sublime Text3 常用插件
    No input file specified. nginx服务器报错解决
    has~和belongsTo的区别?
    关于在phpStudy环境下,windows cmd中 php不是内部命令问题
    spring @RequestMapping注解技巧
    VIM快捷键
    Thinkphp5 模块的自动生成
    在php中define和const定义常量的区别
    go语言学习(六)——并发编程
    go语言学习(五)——面向对象编程
  • 原文地址:https://www.cnblogs.com/lidabo/p/4582399.html
Copyright © 2011-2022 走看看