LibVLC研究笔记

什么是VLC

VLC多媒体播放器(最初命名为VideoLAN客户端)是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持DVD影音光盘,VCD影音光盘及各类流式协议。它也能作为unicast或 multicast的流式服务器在IPv4或 IPv6的高速网络连接下使用。它融合了FFmpeg计划的解码器与libdvdcss程序库使其有播放多媒体文件及加密DVD影碟的功能。

什么是LibVLC

LibVLCVLC媒体播放器的外部编程接口。

libvlc

如何获取VLC的SDK

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

1. 自行编译

2. 直接从安装目录里面拷贝出来

3.从官方FTP服务器上下载(见相关链接5)

 开发VLC所需的文件的位置

1. 动态链接库*.dll:安装目录下的libvlc.dll,libvlccore.dll以及plugins目录下的所有文件。

2. 静态链接库*.lib:安装目录/sdk/lib(2.1.0以后移除)(如没有libvlc.lib与libvlccore.lib请参考相关链接2从dll生成)

3. 头文件:安装目录/sdk/include [v_error]使用官方的,而非自己手动生成lib(相关链接2)将在Release下抛错[/v_error]

配置

1.自行在vs中设置include和lib的路径(如上) 2.复制libvlc.dll, libvlccore.dll,plugins目录到工程debug目录,如果是release需要复制到release目录 3.如想发布供他人使用请静态编译:工程属性, C/C++ , 运行时库选择/MT

Demo

基于libvlc的播放器Dome网上一搜一大把,这里给出两个有代表性的

官方WIKI:

#include 
 #include 
 #include <vlc/vlc.h>

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

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

     /* Create a new item */
     m = libvlc_media_new_location (inst, "http://mycool.movie.com/test.mov");
     //m = libvlc_media_new_path (inst, "/path/to/test.mov");

     /* 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);

 #if 0
     /* This is a non working code that show how to hooks into a window,
      * if we have a window around */
      libvlc_media_player_set_xwindow (mp, xid);
     /* or on windows */
      libvlc_media_player_set_hwnd (mp, hwnd);
     /* or on mac os */
      libvlc_media_player_set_nsobject (mp, view);
  #endif

     /* play the media_player */
     libvlc_media_player_play (mp);

     sleep (10); /* Let it play a bit */

     /* Stop playing */
     libvlc_media_player_stop (mp);

     /* Free the media_player */
     libvlc_media_player_release (mp);

     libvlc_release (inst);

     return 0;
 }

来自百度的精简版,只留下了主要代码(出处不详,望告知)

#include 
#include 

#include "vlc/vlc.h"
#pragma comment(lib, "libvlc.lib")
#pragma comment(lib, "libvlccore.lib")

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

    inst = libvlc_new (0, NULL);        /* Load the VLC engine */   
    m = libvlc_media_new_path (inst, "D:\\music\\amani.wma");  // 必须为英文路径  
    mp = libvlc_media_player_new_from_media (m);    /* Create a media player playing environement */    
    libvlc_media_release (m);           /* No need to keep the media now */

    // 播放文件
    libvlc_media_player_play (mp);      /* play the media_player */   
    Sleep (100 * 1000);                 /* Let it play a bit */

    libvlc_media_player_stop (mp);      /* Stop playing */   
    libvlc_media_player_release (mp);   /* Free the media_player */
    libvlc_release (inst);
    return 0;
}

libvlc_media_new_path()和libvlc_media_new_location()的区别

libvlc_media_new_path()用于打开文件,而libvlc_media_new_location()用于打开协议

传递给libvlc_media_new_path()的参数就是文件路径(相对路径或绝对路径)

传递给libvlc_media_new_location()的参数就是协议地址(如“udp://”“http://”)

需要注意的是libvlc_media_new_location()也可以打开文件,但是必须在文件路径前面加上“file:///”,举个栗子

libvlc_media_new_location (inst, "file:///E:\\test.avi");  

VLC还支持很多特有的协议,比如“screen://”协议可以进行屏幕录制,具体可参考官方WIKI

疑难杂症

中文乱码

VLC使用的是UTF-8,因此将unicode转码为UTF-8即可解决

在Release下抛错

请勿使用官方的lib,自己手动生成lib(相关链接2)

 

相关链接:

FrostMiKu
Built with Hugo
主题 StackJimmy 设计