5

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

 3 years ago
source link: https://blog.csdn.net/china_video_expert/article/details/70164096
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

利用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属性,这样就会避免拖动、最大化最小化及全屏还原时找不到图像的缺陷。


    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中注释掉:
#ifndef __intptr_t_defined
#define __intptr_t_defined
//typedef longintptr_t;
#endif
//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目录下就可以编译执行。需要的自己下载添加调试。

Recommend

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK