Qt使用MediaInfo库获取媒体文件分辨率时长等信息方法示例

Qt使用MediaInfo库获取媒体文件分辨率时长等信息方法示例

之前项目中是使用ffmpeg获取图片视频分辨率的方法,大部分都能成功。但如果图片分辨率非常大,就会获取失败,虽然可以用QImageReader获取大图片的分辨率,但不适用于视频。且QImageReader获取的图片格式信息不详细。就想使用MediaInfo库统一获取图片或视频的信息。
网上有个demo是再vc项目的,能正常运行。但在Qt中编译错误,主要是字符编码问题。于是,我修改了下,使之能在Qt项目中使用。首先在MediaInfo官网下载源代码,得到MediaInfoDLL.h MediaInfo.dll MediaInfo.lib三个文件。
取消影子构建。

将dll文件放到debug目录,其他两个放到项目目录。写一个HMediaInfoHelper帮助类,在这个类头文件加入库的引用#include “MediaInfoDLL.h”
再加入一行 #define _UNICODE 。 这是因为MediaInfoDLL.h头文件中增加了vs对字符编码的支持,但对Qt支持不是很好,而Qt默认使用 unicode编码。

核心代码如下:

#ifndef HMEDIAINFOHELPER_H
#define HMEDIAINFOHELPER_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
#include
using namespace MediaInfoNameSpace

#ifdef MINGW32
#ifdef _UNICODE
#define _itot _itow
#else //_UNICODE
#define _itot itoa
#endif //_UNICODE
#endif //__MINGW32

#include
class HMediaInfoHelper
{
struct HMediaInfo
{
int width; //宽
int height; //高
int duration; //时长
double frameRate; //帧率
double bitRate; //比特率
QString completeInfo; //常规信息
HMediaInfo(){
width = 0;
height = 0;
duration = 0;
}
};
public:
HMediaInfoHelper();
/**
* @brief 获取媒体信息
* @param mediaFile 媒体文件名
* @param mediaType 媒体类型 -1general 0图片 1视频 2音频
* @return
*/
HMediaInfo GetMediaInfo(QString mediaFile,int mediaType = -1);
};

#include “HMediaInfoHelper.h”

HMediaInfoHelper::HMediaInfoHelper()
{

}

HMediaInfoHelper::HMediaInfo HMediaInfoHelper::GetMediaInfo(QString mediaFile, int mediaType)
{
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)MI.Inform()); //不获取该条信息可减少时间消耗
auto wid = QString::fromStdWString((std::basic_string)MI.Get(streamType, 0, __T(“Width”))).toInt();
auto hei = QString::fromStdWString((std::basic_string)MI.Get(streamType, 0, __T(“Height”))).toInt();
auto dur = QString::fromStdWString((std::basic_string)MI.Get(streamType, 0, __T(“Duration”))).toInt();
auto frameRate = QString::fromStdWString((std::basic_string)MI.Get(streamType, 0, __T(“FrameRate”))).toDouble();
auto bitRate = QString::fromStdWString((std::basic_string)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;
}

使用时,也很简单,在main中

#include
#include “HMediaInfoHelper.h”
#include
#include

int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QTime time;
time.start();
//QString file = QStringLiteral(“D:/素 材/[J&K.4k.视频] 1000fps彩色烟雾1000fps Colored Smoke Grenades 4K HDR.webm”);
//QString file = QString::fromLocal8Bit(“D:/素 材/[J&K.4k.视频] 1000fps彩色烟雾1000fps Colored Smoke Grenades 4K HDR.webm”);
QString file = QStringLiteral(“072a2740-4afe-446f-9195-da1c73b38940.webm”);
HMediaInfoHelper helper;
auto info = helper.GetMediaInfo(file,1);
auto timeSpend = time.elapsed();
qDebug() << "width: " << info.width ;
qDebug() << "height: " << info.height ;
qDebug() << "duration: " << info.duration ;
qDebug() << “-----------------------------------------”;
qDebug() << info.completeInfo << “\n”;
return a.exec();
}
本人使用的win10 64系统,qt5和vs2015环境下编译成32位都能编译运行成功,正常运行。其他环境未测试。
完整代码 https://pan.baidu.com/s/1B6gsNiVDycXCTRePuxzLNw
提取码:crpi

你可能感兴趣的:(MediaInfo,Qt5)