MFC调用libvlc.dll

2023-10-24 02:38
文章标签 dll 调用 mfc libvlc

本文主要是介绍MFC调用libvlc.dll,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

vlc的应用之八:MFC调用libvlc.dll
2009-07-27 23:00:58
标签: libvlc vlc mfc
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。 http://jeremiah.blog.51cto.com/539865/184115
    本篇博客将简单介绍MFC调用libvlc.dll作一个简单的播放器,抛砖引玉,各位VC++达人继续深入研究,Jeremiah对VC++确实不太感兴趣,所以就不做太深入的研究了。
 
2009.10.29修改:加入clip_children属性设置。参考第1步。
2010.04.14修改:中文路径问题。参考第7步。
 
    环境:
        1) VC6 SP5
        2) vlc-0.9.9a

    0. 引言
    根据上一篇博客的研究,任何一个VC环境都可以调用MinGW/Gcc编译得到的libvlc.dll。VLC在编译打包之后(也就是执行完make package-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. 建立工程
    新建MFC AppWizard(exe)工程,名字为:MFCVLC。选择项目为Dialog based,点击完成。删除Dialog窗体上的所有的控件,包括“确定”、“取消”按钮及"TODO"静态文本。勾选窗口的clip_children属性,这样就会避免拖动、最大化最小化及全屏还原时找不到图像的缺陷。
   
    2. 画控件
    画四个控件,两个静态文本框,一个输入框,一个按钮。其中,第一个静态文本框修改Caption为“路径:”,第二个文本框为视频的显示区域,所以讲ID改为IDC_DISPLAY,Caption去掉。输入框关联一个变量,CString类型,命名为m_path。按钮的Caption改为“播放”,并为BN_CLICKED增加一个Function。在CMFCVLCdlg的构造方法中加入一下语句方便调试。
m_path = _T( "d:/01.avi"); // 输入常用的视频地址
   
    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中新建文件夹及导入上述文件,最后入下图所示。
 
    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中加入头文件导入。
#include "vlc.h"
在button的onclick关联函数中加入代码:
void CMFCVLCDlg::OnButton1()    
{
   // TODO: Add your control notification handler code here
    char path[100];
    this->GetDlgItemText(IDC_EDIT1, path, 100);
    libvlc_exception_t ex;
    libvlc_exception_init(&ex);
     int vlc_argc = 0;
     char *vlc_argv[100];
    vlc_argv[vlc_argc++] = "--ignore-config";
    libvlc_instance_t *p_instance = libvlc_new(
          vlc_argc, vlc_argv, &ex);
    libvlc_media_t *p_media = libvlc_media_new(
          p_instance, path, &ex);
    libvlc_media_player_t *p_media_player    
        = libvlc_media_player_new_from_media(
            p_media, &ex);
    libvlc_drawable_t hwnd =    
        (libvlc_drawable_t) this->GetDlgItem(IDC_DISPLAY)->GetSafeHwnd();
    libvlc_media_player_set_drawable(p_media_player, hwnd, &ex);
    libvlc_media_player_play(p_media_player, &ex);
}

    6. 关联静态库及编译运行
    打开Project Setting,在link标签的Object/library modules:下输入 lib/libvlc.lib lib/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不成功,弹出新窗口。其他几位朋友测试则正常。
上面的代码如果开带中文路径的地址会无法打开,因为传入的中文路径vlc识别不了。需要将路径也就是path变量从ANSIZ转换为UTF8代码。具体怎么转换,各位VC达人自己研究吧。
8. 用VC6以上版本调试结果
Jeremiah使用了vs2003及vs2005。
1)  会两个重复定义的错误,解决方法是将stdint.h中注释掉:
#ifndef __intptr_t_defined
#define __intptr_t_defined
//typedef long intptr_t;
#endif
//typedef unsigned long uintptr_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目录下就可以编译执行。需要的自己下载添加调试。

本文出自 “海狗哥的流媒体空间” 博客,请务必保留此出处http://jeremiah.blog.51cto.com/539865/184115

这篇关于MFC调用libvlc.dll的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/272160

相关文章

qt5cored.dll报错怎么解决? 电脑qt5cored.dll文件丢失修复技巧

《qt5cored.dll报错怎么解决?电脑qt5cored.dll文件丢失修复技巧》在进行软件安装或运行程序时,有时会遇到由于找不到qt5core.dll,无法继续执行代码,这个问题可能是由于该文... 遇到qt5cored.dll文件错误时,可能会导致基于 Qt 开发的应用程序无法正常运行或启动。这种错

电脑提示xlstat4.dll丢失怎么修复? xlstat4.dll文件丢失处理办法

《电脑提示xlstat4.dll丢失怎么修复?xlstat4.dll文件丢失处理办法》长时间使用电脑,大家多少都会遇到类似dll文件丢失的情况,不过,解决这一问题其实并不复杂,下面我们就来看看xls... 在Windows操作系统中,xlstat4.dll是一个重要的动态链接库文件,通常用于支持各种应用程序

Java调用C#动态库的三种方法详解

《Java调用C#动态库的三种方法详解》在这个多语言编程的时代,Java和C#就像两位才华横溢的舞者,各自在不同的舞台上展现着独特的魅力,然而,当它们携手合作时,又会碰撞出怎样绚丽的火花呢?今天,我们... 目录方法1:C++/CLI搭建桥梁——Java ↔ C# 的“翻译官”步骤1:创建C#类库(.NET

C/C++和OpenCV实现调用摄像头

《C/C++和OpenCV实现调用摄像头》本文主要介绍了C/C++和OpenCV实现调用摄像头,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录准备工作1. 打开摄像头2. 读取视频帧3. 显示视频帧4. 释放资源5. 获取和设置摄像头属性

使用Python实现调用API获取图片存储到本地的方法

《使用Python实现调用API获取图片存储到本地的方法》开发一个自动化工具,用于从JSON数据源中提取图像ID,通过调用指定API获取未经压缩的原始图像文件,并确保下载结果与Postman等工具直接... 目录使用python实现调用API获取图片存储到本地1、项目概述2、核心功能3、环境准备4、代码实现

电脑提示Winmm.dll缺失怎么办? Winmm.dll文件丢失的多种修复技巧

《电脑提示Winmm.dll缺失怎么办?Winmm.dll文件丢失的多种修复技巧》有时电脑会出现无法启动程序,因为计算机中丢失winmm.dll的情况,其实,winmm.dll丢失是一个比较常见的问... 在大部分情况下出现我们运行或安装软件,游戏出现提示丢失某些DLL文件或OCX文件的原因可能是原始安装包

无法启动此程序因为计算机丢失api-ms-win-core-path-l1-1-0.dll修复方案

《无法启动此程序因为计算机丢失api-ms-win-core-path-l1-1-0.dll修复方案》:本文主要介绍了无法启动此程序,详细内容请阅读本文,希望能对你有所帮助... 在计算机使用过程中,我们经常会遇到一些错误提示,其中之一就是"api-ms-win-core-path-l1-1-0.dll丢失

使用@Cacheable注解Redis时Redis宕机或其他原因连不上继续调用原方法的解决方案

《使用@Cacheable注解Redis时Redis宕机或其他原因连不上继续调用原方法的解决方案》在SpringBoot应用中,我们经常使用​​@Cacheable​​注解来缓存数据,以提高应用的性能... 目录@Cacheable注解Redis时,Redis宕机或其他原因连不上,继续调用原方法的解决方案1

C#通过进程调用外部应用的实现示例

《C#通过进程调用外部应用的实现示例》本文主要介绍了C#通过进程调用外部应用的实现示例,以WINFORM应用程序为例,在C#应用程序中调用PYTHON程序,具有一定的参考价值,感兴趣的可以了解一下... 目录窗口程序类进程信息类 系统设置类 以WINFORM应用程序为例,在C#应用程序中调用python程序

Java调用Python的四种方法小结

《Java调用Python的四种方法小结》在现代开发中,结合不同编程语言的优势往往能达到事半功倍的效果,本文将详细介绍四种在Java中调用Python的方法,并推荐一种最常用且实用的方法,希望对大家有... 目录一、在Java类中直接执行python语句二、在Java中直接调用Python脚本三、使用Run