利用MFC调用libvlc.dll作一个简单的播放器

简单介绍MFC调用libvlc.dll作一个简单的播放器,抛砖引玉,各位VC++达人继续深入研究,Jeremiah对VC++确实不太感兴趣,所以就不做太深入的研究了。

2009.10.29修改:加入clip_children属性设置。参开第1步。

    环境:
      1) VC6SP5
       2)vlc-0.9.9a


    0. 引言
   根据上一篇博客的研究,任何一个VC环境都可以调用MinGW/Gcc编译得到的libvlc.dll。VLC在编译打包之后(也就是执行完makepackage-win32-base),或者去官网下载zip包解压之后,或者是安装完VLC之后,在vlc-0.9.9a目录下有个sdk文件夹,里面又包含两个文件夹:include--头文件及lib--库。这些都是我们用MFC调用libvlc.dll所必须的。头文件没啥好说的,库里面的libvlc.dll.a及libvlccore.dll.a就是上一篇博客所说的静态库,我们分别手动改成libvlc.lib及libvlccore.lib就可以在VC环境中调用啦。下面简要说一下调用的过程,对各位VC++达人来说绝对是小菜一碟。


    1. 建立工程
    新建MFCAppWizard(exe)工程,名字为:MFCVLC。选择项目为Dialogbased,点击完成。删除Dialog窗体上的所有的控件,包括“确定”、“取消”按钮及"TODO"静态文本。勾选窗口的clip_children属性,这样就会避免拖动、最大化最小化及全屏还原时找不到图像的缺陷。

利用MFC调用libvlc.dll作一个简单的播放器
   
    2. 画控件
   画四个控件,两个静态文本框,一个输入框,一个按钮。其中,第一个静态文本框修改Caption为“路径:”,第二个文本框为视频的显示区域,所以讲ID改为IDC_DISPLAY,Caption去掉。输入框关联一个变量,CString类型,命名为m_path。按钮的Caption改为“播放”,并为BN_CLICKED增加一个Function。在CMFCVLCdlg的构造方法中加入一下语句方便调试。

利用MFC调用libvlc.dll作一个简单的播放器m_path = _T("d:/01.avi");// 输入常用的视频地址


利用MFC调用libvlc.dll作一个简单的播放器
   
    3.拷贝vlc的相关库及头文件
   在资源管理器的MFCVLC工程目录下新建文件夹vlc,lib,将vlc-0.9.9a/sdk/include/vlc.h拷贝到MFCVLC工程目录下,将vlc-0.9.9a/sdk/include除了vlc.h之外的所有文件拷贝到vlc目录下,将vlc-0.9.9a/sdk/lib下的libvlc.dll.a及libvlccore.dll.a拷贝到lib下,并分别修改为libvlc.lib及libvlccore.lib。将vlc-0.9.9a目录下的libvlc.dll, libvlccore.dll,plugins目录拷贝到Debug目录下。如果有Cygwin环境,需要将stdint.h(/usr/include/stdint.h)这个头文件也拷贝到MFCVLC工程目录下。在VC6环境中FileView中新建文件夹及导入上述文件,最后入下图所示。

利用MFC调用libvlc.dll作一个简单的播放器

    4. 修改头文件
    1) 修改vlc.h,将所有的#include<***>改为 #include "***"

    2)修改stdint.h,将所有的long long替换为__int64
    3)修改libvlc_structures.h,#include<stdint.h>为#include"stdint.h"


    5. 编写代码
   在MFCVLCDlg.cpp中加入头文件导入。

利用MFC调用libvlc.dll作一个简单的播放器#include "vlc.h"


   在button的onclick关联函数中加入代码:
利用MFC调用libvlc.dll作一个简单的播放器voidCMFCVLCDlg::OnButton1()   
利用MFC调用libvlc.dll作一个简单的播放器{
利用MFC调用libvlc.dll作一个简单的播放器  //TODO: Add your control notification handler code here
利用MFC调用libvlc.dll作一个简单的播放器    char path[100];
利用MFC调用libvlc.dll作一个简单的播放器    this->GetDlgItemText(IDC_EDIT1,path, 100);
利用MFC调用libvlc.dll作一个简单的播放器    libvlc_exception_tex;
利用MFC调用libvlc.dll作一个简单的播放器   libvlc_exception_init(&ex);
利用MFC调用libvlc.dll作一个简单的播放器    int vlc_argc = 0;
利用MFC调用libvlc.dll作一个简单的播放器    char *vlc_argv[100];
利用MFC调用libvlc.dll作一个简单的播放器    vlc_argv[vlc_argc++] ="--ignore-config";
利用MFC调用libvlc.dll作一个简单的播放器    libvlc_instance_t*p_instance = libvlc_new(
利用MFC调用libvlc.dll作一个简单的播放器         vlc_argc,vlc_argv, &ex);
利用MFC调用libvlc.dll作一个简单的播放器    libvlc_media_t *p_media= libvlc_media_new(
利用MFC调用libvlc.dll作一个简单的播放器         p_instance,path, &ex);
利用MFC调用libvlc.dll作一个简单的播放器    libvlc_media_player_t*p_media_player   
利用MFC调用libvlc.dll作一个简单的播放器       =libvlc_media_player_new_from_media(
利用MFC调用libvlc.dll作一个简单的播放器          p_media,&ex);
利用MFC调用libvlc.dll作一个简单的播放器    libvlc_drawable_t hwnd=   
利用MFC调用libvlc.dll作一个简单的播放器       (libvlc_drawable_t)this->GetDlgItem(IDC_DISPLAY)->GetSafeHwnd();
利用MFC调用libvlc.dll作一个简单的播放器   libvlc_media_player_set_drawable(p_media_player, hwnd,&ex);
利用MFC调用libvlc.dll作一个简单的播放器   libvlc_media_player_play(p_media_player,&ex);
利用MFC调用libvlc.dll作一个简单的播放器}



    6. 关联静态库及编译运行
    打开ProjectSetting,在link标签的Object/library modules:下输入lib/libvlc.liblib/libvlccore.lib。
    build项目,应该没有错误。
    Execute Program就可以执行了。
    7. 一个BUG
   第6步执行的是Execute模式,如果是Debug模式,点击“播放”后,后台会显示加载的vlc的plugins的dll的信息,但是加载完最后一个dll的时候程序就Block住了。暂时不晓得为啥。经过更多的测试(win2003虚拟机里的vc6),发现Jeremiah的VC6可能真的有问题,debug的时候,打开Output窗口显示加载的dll的情况,就会block住。不打开Output窗口偶尔会set_drawable不成功,弹出新窗口。其他几位朋友测试则正常。

    8. 用VC6以上版本调试结果
   Jeremiah使用了vs2003及vs2005。
   1)  会两个重复定义的错误,解决方法是将stdint.h中注释掉:
利用MFC调用libvlc.dll作一个简单的播放器#ifndef __intptr_t_defined
利用MFC调用libvlc.dll作一个简单的播放器#define __intptr_t_defined
利用MFC调用libvlc.dll作一个简单的播放器//typedef longintptr_t;
利用MFC调用libvlc.dll作一个简单的播放器#endif
利用MFC调用libvlc.dll作一个简单的播放器//typedef unsigned longuintptr_t;


    2)发布Release版本会报内存错误。具体原因待查,应该是.lib不兼容的问题。不知道为啥Debug版就可以而Release版就不行。解决方法是用dll2lib.exe(附件提供)将0.9.9a的libvlc.dll及libvlccore.dll转换为相应的lib库,替换工程的lib/下面的相应的库,然后再次Release即可。

   Jeremiah对MFC只有一点点了解,所以上述的各个过程如果重复烦琐,及如何修复第7,8步讲的BUG及问题,请各位VC++达人指导Jeremiah。先谢过。本文附件中提供了MFCVLC的源码,只是需要把vlc-0.9.9a的libvlc.dll,libvlccore.dll, plugins目录拷贝到Debug目录下就可以编译执行。需要的自己下载添加调试。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值