利用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目录下就可以编译执行。需要的自己下载添加调试。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/447197.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用Remix编写Solidity语言的小例子

设置数值/取数值/加法运算 讲解 uint默认使用256位数的整型view表示这个函数仅仅对于数据仅仅是读取&#xff0c;没有修改操作returns(uint )&#xff0c;如果单纯指定uint&#xff0c;返回的是函数体内的return值&#xff0c;如果包含uint sum,uint SAD_a&#xff0c;那么返…

RTP协议栈简介

流媒体指的是在网络中使用流技术传输的连续时基媒体&#xff0c;其特点是在播放前不需要下载整个文件&#xff0c;而是采用边下载边播放的方式&#xff0c;它是视频会议、IP电话等应用场合的技术基础。RTP是进行实时流媒体传输的标准协议和关键技术&#xff0c;本文介绍如何在L…

使用多线程的方式调用chineseocr_API

ChineseOCR在线API 网页链接 界面 提供多种接口调用方式&#xff0c;比如在线调用、Javascript api调用、curl api调用和python api调用四种方式&#xff0c;本次使用javascript api调用的方式进行OCR识别代码 import glob import base64 import os import requests import …

开源好代码 音视频

VirtualDub 一、简介 图1VirtualDub主界面 VirtualDub是一款开源的音视频捕获、处理软件。VirtualDub也可称为一款多媒体编辑软件&#xff0c;因为它包含了多媒体输入、编辑、处理、输出等各个环节&#xff0c;但是作者并未将它定位为一款多媒体编辑软件&#xff08;参见官网&a…

深入理解Solidity 二

Solidity数据位置 所有复杂的数据类型&#xff0c;即数组、结构和映射类型&#xff0c;都会有一个额外属性“数据位置”&#xff0c;用来指定数据的存储位置&#xff0c;即数据是存储在memory还是存储在storage里面根据上下文环境&#xff0c;IDE会自动指定数据的默认存储位置…

VOIP简介

一、什么是VOIP VOIP全称为&#xff08;VoiceOver Internet Protocol&#xff09;&#xff0c;是一种利用Internet网络进行语音通信的技术&#xff0c;更通俗一点说&#xff0c;就是IP电话。就是以IP分组交换网为传输平台&#xff0c;对模拟的语音信号进行编码压缩&#xff0c…

深入理解Solidity 三

Solidity函数声明和类型 函数的值类型有两类&#xff1a;内部&#xff08;internal&#xff09;类型和外部&#xff08;external&#xff09;类型内部函数只可以在当前合约内部被调用&#xff08;即在当前代码块内&#xff0c;包括内部库函数和继承函数&#xff09;&#xff0c…

安装solc模块4.25版本

使用国产阿里云的cnpm 如果不知道cnpm 参考链接 安装solc模块4.25版本 npm i solc0.4.25 --save -g查看安装是否成功 可以配置软连接使用solc&#xff0c;我的没有配置 solcjs --version

在pycharm中使用conda虚拟环境(conda虚拟环境是已经创建好的),解决python安装包文件很费劲的问题

查看conda的虚拟环境 使用PyCharm连接conda创建的虚拟环境&#xff0c;需要一个前提就是虚拟环境必须存在&#xff0c;使用conda env list命令查看虚拟环境列表打开PyCharm软件 打开pycharm&#xff0c;选择File->setting->Project:****->Project Interperter&#…

完成一个H.265/HEVC码流分析工具

经过大约一个月左右的业余时间&#xff0c;终于初步完成一个H.265/HEVC码流分析工具。时间包括平时的周末、晚上&#xff0c;以及调休的集中时间。当然&#xff0c;中秋回家过节不写代码。截至今天&#xff0c;经过多种H.265序列测试&#xff0c;也有各种工具对比&#xff0c;基…

Golomb及指数哥伦布编码原理介绍及实现

文章来源&#xff1a; https://www.cnblogs.com/wangguchangqing/p/6297792.html &#xff0c; 写的不错&#xff0c;转发出来。 2017年的第一篇博文。 本文主要有以下三部分内容&#xff1a; 介绍了Golomb编码&#xff0c;及其两个变种&#xff1a;Golomb-Rice和Exp-Golo…

解决ipfs 出现Error: can‘t publish while offline: pass `--allow-offline` to override的问题

原因 出现这个问题的原因是因为&#xff0c;ipfs未与公网上的节点相互连接&#xff0c;因此此时处于离线状态 使用场景 部署自己的博客&#xff0c;后期的改动&#xff0c;累计追加在同一个地址&#xff0c;这个地址是唯一的&#xff0c;也就是创建ipfs生成的ID号 步骤 1&…

安装ipfs-http-client出现constants@0.1.2 install: node build.js > index.browser.js错误的解决办法

错误截图 原先的命令 npm install --save-dev ipfs-http-client 修改后的命令 npm install --save-dev ipfs-http-client --unsafe-permtrue --allow-root

安装ipfs-api的命令变了,最新版的命令如下

原先使用的命令安装ipfs-api npm install --save-dev ipfs-api 现在使用的命令安装ipfs-api npm install --save-dev ipfs-http-client 官方文档 参考教程 官方文档

区块链相关问题 理解

本博客针对区块链的部分问题进行详解&#xff0c;希望帮助大家对于区块链有一个更好的理解 1&#xff0c;如果散布虚假交易&#xff0c;怎么整&#xff1f;&#xff08;谁欠我XXX比特币&#xff09; 1&#xff0c;可以发起虚假交易&#xff0c;但是很难被全网的节点接收并写入…

区块链的相关知识点

1&#xff0c;密码学原理 密码学原理 1&#xff0c;collision resistance 哈希函数 &#xff0c;目前还是很安全的&#xff0c;没有找到任何不同的内容其哈希是一致的情形。哈希碰撞&#xff08;这个在数学上面是没法证明的&#xff0c;都是日常的实践表明&#xff0c;无法找…

使用MAC 编译合约的时候报错:

编译报错的显示内容如下&#xff1a; Error: EACCES: permission denied, mkdir /Users/chy/Documents/ipfslearn/ipfs_eth_img/client/src/contracts 最简单的解决方法 原因分析&#xff1a;执行的权限不够 解决办法&#xff1a;升级权限 使用命令 chmod 777 项目的文件夹使…

最新,使用truffle框架之后,安装ipfs的api包文件的命令变化

原因 项目文件路径变化了&#xff0c;不是先前直接在项目文件夹里面直接执行安装ipfs的命令了&#xff0c;需要切换到client文件夹下面执行 路径不对&#xff0c;会出现错误&#xff0c;错误提示如下 切换到正确的路径之后&#xff0c;使用命令 npm install --save ipfs-http-…

通过node 完成简单的web3 API调用测试

使用命令查看当前web3的版本 npm list web3输入命令 node&#xff0c;进入终端 引入web3&#xff0c;使用命令 var web3 require(web3) 查看引入web3的版本 web3.version

LInux学习笔记(四)-----实操排雷

参考书籍&#xff1a;linux就该这么学 4 Vim 编辑器与 Shell 命令脚本 4.1 Vim 文本编辑器(在 Vim 中&#xff0c;无法直接从输入模式切换到末行模式) 4.1.1 配置 Yum 软件仓库 注&#xff1a;书中好像有点问题&#xff0c;第一个 . 改成 /&#xff08;我是Ubuntu发现原来不能用…