原文链接:https://blog.csdn.net/weixin_41001497/article/details/118109413
准备工作
下载源码 下载地址
MediaInfo编译
将下载好的压缩包进行解压,用VS打开MediaInfoLib.sln,生成解决方案(我选择的是Release版本,64位)
此时出现报错
打开Visual Studio Installer,点击修改,勾选最新版本的SDK,进行更新。
更新完毕,重新打开项目,点击项目→重定解决方案,选择刚才下载的Windows SDK
点击生成→重新生成解决方案,成功
现在vs项目目录下会出现编译好的MediaInfo.dll和MediaInfo.lib文件
在Source/MediaInfoDLL目录下找到需要引入到我们自己项目中的MediaInfoDLL.h文件
MediaInfo的使用
我的需求是在Qt项目中使用MediaInfo,看了不少文章,在vs项目中都是直接include头文件,添加lib和dll,再声明命名空间就可以使用MediaInfo类,但我直接在Qt里面这样做会报错,具体什么原因没有找到,但参考某位大佬的博文,对MediaInfo类进行封装,就可以正常使用了。
首先,先把MediaInfo.dll添加到应用程序所在的路径下(这个路径具体是哪里因个人设定而异),
其次,将MediaInfo.lib放到你想放的位置,然后在.pro文件中用LIBS +=语句引入,这里我还是将lib文件放到应用程序所在的目录
最后,将MediaInfoDLL.h文件放到你想要的位置,并在.pro文件中引入这个文件或者这个文件所在的文件夹,这里我用INCLUDEPATH +=语句将MediaInfoDLL.h所在的目录引入,那么这个目录下的所有.h文件都会被包含进来
做完这些工作,还需要实现一个MediaInfoHelper类来对MediaInfo进行封装才能使用,以下的代码是参考这位大佬的原文指路
//MediaInfoHelper.h
#ifndef MEDIAINFOHELPER_H
#define MEDIAINFOHELPER_H
#define _UNICODE //在Qt项目中必须增加这一句,否则无法匹配字符编码,编译出错; vs项目中如果设置了"常规 - 字符集 - 使用 Unicode 字符集" 可不要这句。
#include "MediaInfoDLL.h"
#ifdef MEDIAINFO_LIBRARY
#include "MediaInfo/MediaInfo.h" //Staticly-loaded library (.lib or .a or .so)
#define MediaInfoNameSpace MediaInfoLib;
#else //MEDIAINFO_LIBRARY
//#include "MediaInfoDemo.h" //Dynamicly-loaded library (.dll or .so)
#define MediaInfoNameSpace MediaInfoDLL;
#endif //MEDIAINFO_LIBRARY
#include <iostream>
#include <iomanip>
using namespace MediaInfoNameSpace
#ifdef __MINGW32__
#ifdef _UNICODE
#define _itot _itow
#else //_UNICODE
#define _itot itoa
#endif //_UNICODE
#endif //__MINGW32
#include <QString>
class HMediaInfoHelper
{
struct HMediaInfo
{
int width; //宽
int height; //高
int duration; //时长
double frameRate; //帧率
double bitRate; //比特率
QString completeInfo; //常规信息
HMediaInfo(){
width = 0;
height = 0;
duration = 0;
frameRate = 0.0;
bitRate = 0.0;
}
};
public:
HMediaInfoHelper();
/**
* @brief 获取媒体信息
* @param mediaFile 媒体文件名
* @param mediaType 媒体类型 -1general 0图片 1视频 2音频
* @return
*/
HMediaInfo GetMediaInfo(QString mediaFile,int mediaType = -1);
};
#endif // MEDIAINFOHELPER_H
//MediaInfoHelper.cpp
#include "MediaInfoHelper.h"
HMediaInfoHelper::HMediaInfoHelper()
{
}
HMediaInfoHelper::HMediaInfo HMediaInfoHelper::GetMediaInfo(QString mediaFile, int mediaType)
{
//参数0-图片,1-视频,2-音频,3-通用
HMediaInfo res;
MediaInfo MI;
auto temp = mediaFile.toStdWString();
auto desFile = temp.c_str();
MI.Open(desFile);
MI.Option(__T("Complete"), __T("1"));
stream_t streamType = Stream_General;
if (mediaType == 0) {
streamType = Stream_Image;
} else if (mediaType == 1) {
streamType = Stream_Video;
}else if(mediaType == 2){
streamType = Stream_Audio;
} else {
streamType = Stream_General;
}
auto comp = QString::fromStdWString((std::basic_string<wchar_t>)MI.Inform()); //不获取该条信息可减少时间消耗
auto wid = QString::fromStdWString((std::basic_string<wchar_t>)MI.Get(streamType, 0, __T("Width"))).toInt();
auto hei = QString::fromStdWString((std::basic_string<wchar_t>)MI.Get(streamType, 0, __T("Height"))).toInt();
auto dur = QString::fromStdWString((std::basic_string<wchar_t>)MI.Get(streamType, 0, __T("Duration"))).toInt();
auto frameRate = QString::fromStdWString((std::basic_string<wchar_t>)MI.Get(streamType, 0, __T("FrameRate"))).toDouble();
auto bitRate = QString::fromStdWString((std::basic_string<wchar_t>)MI.Get(streamType, 0, __T("BitRate"))).toDouble();
MI.Close();
res.completeInfo = comp;
res.width = wid;
res.height = hei;
res.duration = dur;
res.frameRate = frameRate;
res.bitRate = bitRate;
return res;
}
在需要使用MediaInfo功能的地方引入MediaInfoHelper头文件,声明HMediaInfoHelper对象即可
//main.cpp
#include "MediaInfoHelper.h"
void main()
{
HMediaInfoHelper helper;
auto info = helper.GetMediaInfo("D:/11111.mp4",1); //获取该视频文件的信息
return;
}
相关资源下载
【P.S】编译环境为windows 10 VS2019,版本为64位Release 编译好的dll、lib、h文件
> 音视频开发视频教程:https://ke.qq.com/course/3202131?flowToken=1031864
> 音视频开发学习资料、教学视频,有需要的可以自行添加学习交流群:739729163 领取