UWP平台Taglib编译(1)
此文已由作者郑博授权网易云社区发布。
欢迎访问网易云社区,了解更多网易技术产品运营经验
最近开始开发UWP平台的App,项目需要用到Taglib进行音视频文件的标签信息读写,Google并没有现成的Binaries可以使用;下面记录下自己编译的全过程。
1.工具准备:
a)Taglib源码:https://taglib.github.io/releases/taglib-1.10.tar.gz (这里选用1.10版本,其他版本可以在https://taglib.github.io上下载)
b)Zlib源码:https://github.com/madler/zlib/archive/v1.2.8.zip (这里选用1.2.8版本,其他版本可以在https://github.com/madler/zlib/releases上下载)
c)CMake工具:https://cmake.org/files/v3.4/cmake-3.4.1-win32-x86.exe (这里选用3.4.1版本,因为3.4.0以后的版本才支持VS2015)
工具安装和源码解压过程不再赘述。
2.Zlib编译:
a)点击“Browse Source...”选择zlib源码的存储目录,点击“Browse Build...”选择工程目录(这里不建议跟源码放在一个目录中,因为UWP要3个平台)
b)点击“Configure”这是会弹出一个选择compiler的弹框,这里简单说明一下,X86选Visual Studio 14 2015,X64选Visual Studio 14 2015 Win64,ARM选Visual Studio 14 2015 ARM,3个平台均勾选Use default native compilers即可,选Finish进行确认
c)修改CMAKE_C_FLAGS,最末尾添加/DWINAPI_FAMILY=WINAPI_FAMILY_APP /D_WIN32_WINNT=0x0A00
d)修改CMAKE_C_STANDARD_LIBRARIES,清空全部字段,填写WindowsApp.lib
e)修改各种INSTALL路径,改成自己的目标目录即可,不再赘述
f)点击Generate,在工程目录里打开zlib.sln,右键INSTALL工程,Build完Zlib就编译完成了,3个平台方法一致
3.Taglib编译:
a)同zlib
b)同zlib
c)修改CMAKE_C_FLAGS & CMAKE_CXX_FLAGS,最末尾添加/D_UNICODE /DUNICODE /DWINAPI_FAMILY=WINAPI_FAMILY_APP /D_WIN32_WINNT=0x0A00
d)修改CMAKE_C_STANDARD_LIBRARIES & CMAKE_CXX_STANDARD_LIBRARIES,清空全部字段,填写WindowsApp.lib
e)勾选ENABLE_STATIC
f)配置ZLIB_INCLUDE_DIR/ZLIB_LIBRARY_DEBUG/ZLIB_LIBRARY_RELEASE
g)修改各种INSTALL路径,改成自己的目标目录即可,不再赘述
h)点击Generate生成工程文件
因为Taglib在文件操作时使用了CreateFileW,但是这些接口UWP上是禁止使用的,我们要修改taglib\toolkit\tfilestream.cpp,完整修改代码如下:
/***************************************************************************
copyright : (C) 2002 - 2008 by Scott Wheeler
email : wheeler@kde.org
***************************************************************************/
/***************************************************************************
* This library is free software; you can redistribute it and/or modify *
* it under the terms of the GNU Lesser General Public License version *
* 2.1 as published by the Free Software Foundation. *
* *
* This library is distributed in the hope that it will be useful, but *
* WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
* Lesser General Public License for more details. *
* *
* You should have received a copy of the GNU Lesser General Public *
* License along with this library; if not, write to the Free Software *
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA *
* 02110-1301 USA *
* *
* Alternatively, this file is available under the Mozilla Public *
* License Version 1.1. You may obtain a copy of the License at *
* http://www.mozilla.org/MPL/ *
***************************************************************************/
#include "tfilestream.h"
#include "tstring.h"
#include "tdebug.h"
#ifdef _WIN32
# include
#else
# include
# include
#endif
#ifdef _WIN32
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM)
# include
/*
convert string to wstring
*/
std::wstring c2w(const char *data)
{
int size = MultiByteToWideChar(CP_UTF8, 0, data, -1, nullptr, 0);
if (size > 0) {
auto wstr = std::make_unique(size);
if (MultiByteToWideChar(CP_UTF8, 0, data, -1, wstr.get(), size) > 0) {
return std::wstring(wstr.get());
}
}
return std::wstring(L"");
}
#endif
#endif
using namespace TagLib;
namespace
{
#ifdef _WIN32
// Uses Win32 native API instead of POSIX API to reduce the resource consumption.
typedef FileName FileNameHandle;
typedef HANDLE FileHandle;
const FileHandle InvalidFileHandle = INVALID_HANDLE_VALUE;
inline FileHandle openFile(const FileName &path, bool readOnly)
{
const DWORD access = readOnly ? GENERIC_READ : (GENERIC_READ | GENERIC_WRITE);
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM)
const wchar_t *fp = NULL;
std::wstring wstr = path.wstr();
if (!wstr.empty())
fp = wstr.c_str();
else if (!path.str().empty()) {
wstr = c2w(path.str().c_str());
if (!wstr.empty())
fp = wstr.c_str();
}
if (fp)
return CreateFile2(fp, access, FILE_SHARE_READ, OPEN_EXISTING, NULL);
#else
if(!path.wstr().empty())
return CreateFileW(path.wstr().c_str(), access, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
else if(!path.str().empty())
return CreateFileA(path.str().c_str(), access, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
#endif
else
return InvalidFileHandle;
}
inline void closeFile(FileHandle file)
{
CloseHandle(file);
}
inline size_t readFile(FileHandle file, ByteVector &buffer)
{
DWORD length;
if(ReadFile(file, buffer.data(), static_cast(buffer.size()), &length, NULL))
return static_cast(length);
else
return 0;
}
inline size_t writeFile(FileHandle file, const ByteVector &buffer)
{
DWORD length;
if(WriteFile(file, buffer.data(), static_cast(buffer.size()), &length, NULL))
return static_cast(length);
else
return 0;
}
#else // _WIN32
struct FileNameHandle : public std::string
{
FileNameHandle(FileName name) : std::string(name) {}
operator FileName () const { return c_str(); }
};
typedef FILE* FileHandle;
const FileHandle InvalidFileHandle = 0;
inline FileHandle openFile(const FileName &path, bool readOnly)
{
return fopen(path, readOnly ? "rb" : "rb+");
}
inline void closeFile(FileHandle file)
{
fclose(file);
}
inline size_t readFile(FileHandle file, ByteVector &buffer)
{
return fread(buffer.data(), sizeof(char), buffer.size(), file);
}
inline size_t writeFile(FileHandle file, const ByteVector &buffer)
{
return fwrite(buffer.data(), sizeof(char), buffer.size(), file);
}
相关文章:
【推荐】 MongoDB账号管理及实践
【推荐】 关于内容审核,你需要了解的东西,这里都有!
【推荐】 深入浅出“跨视图数据粒度计算”--1、理解数据的粒度
UWP平台Taglib编译(1)的更多相关文章
- UWP平台Taglib编译(2)
此文已由作者郑博授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验 #endif // _WIN32 } class FileStream::FileStreamPrivate ...
- xamarin UWP平台线程交互问题
先吐槽一下,xamarin到现在为止,虽然开发一下应用尚可,对于一些简单的app开发使用xamarin-forms方式开发,虽然有一些优势,可以省下开发三个平台共同功能的时间,但是当我们随着项目深入的 ...
- QT全平台设置图标,全平台静态编译 good
1. 概述 当我们用QT写好了一个软件,要把你的程序分享出去的时候,不可能把编译的目录拷贝给别人去运行.编译好的程序应该是一个主程序,加一些资源文件,再加一些动态链接库,高大上一些的还可以做一个安装 ...
- [UWP]在UWP平台中使用Lottie动画
最近QQ影音久违的更新了,因为记得QQ影音之前体验还算不错(FFmepg的事另说),我也第一时间去官网下载体验了一下,结果发现一些有趣的事情. 是的,你没看错,QQ影音主界面上这个动画效果是使用Lot ...
- Unity3d依赖于平台的编译
Unity的这一功能被命名为"依赖于平台的编译". 这包括了一些预编译处理指令,让你能够专门的针对不同的平台分开编译和运行一段代码. 此外,你能够在编辑器下运行一些代码用于測试而不 ...
- webrtc所有平台下载编译步骤详细说明
webrtc所有平台下载编译步骤详细说明 1.安装depot tools Windows:国外下载:https://storage.googleapis.com/chrome-infra/depot_ ...
- DevEco Device Tool 2.1 Beta1 的Hi3861在Windows平台的编译体验
DevEco Device Tool迎来了2.1 Beta1,其中的亮点之一是:支持Hi3861开发板的源码在Windows平台编译.带着浓厚的兴趣,第一时间做了一次体验. 首先在官网下载" ...
- qml支持多平台的编译--尤其对于需要支持xp的情况
http://www.oschina.net/p/deepin-boot-maker 系统支持: Windows平台: Windows 7/ Windows 8 需要安装显卡驱动 Windows XP ...
- Lichee(两) 在sun4i_crane该平台下编译
让我们先来回顾一下编译命令 $ cd workdir/lichee $ ./build.sh -p sun4i_crane -k 3.0 lichee文件夹下的build.sh #!/bin/bas ...
随机推荐
- HTML5服务器推送消息的各种解决办法,html5服务器
HTML5服务器推送消息的各种解决办法,html5服务器 摘要 在各种BS架构的应用程序中,往往都希望服务端能够主动地向客户端推送各种消息,以达到类似于邮件.消息.待办事项等通知. 往BS架构本身存在 ...
- 双 MySQL 启动、停止脚本
5.5 启动 #!/bin/bash # author: Wang Xiaoqiang # func: Start MySQL 5.5 pid=`netstat -lnpt | awk -F '[ / ...
- C#隐式类型局部变量&隐式类型数组
[隐式类型局部变量] 可以赋予局部变量推断“类型”var 而不是显式类型.var 关键字指示编译器根据初始化语句右侧的表达式推断变量的类型.推断类型可以是内置类型.匿名类型.用户定义类型或 .NET ...
- JRE,JVM,JDK
JRE,JVM,JDK的关系.JRE(Java Runtime Environment)java运行环境,我们可以把它看成是一个操作系统.也就是说JRE提供了Java执行的软件平台. JVM (Jav ...
- C++——堆、栈、静态存储区
栈 堆 静态存储区 生命周期 函数结束即释放 new,malloc开辟,delete,free释放 释放前,一直存在 最长,程序退出才释放 程序.局部变量 new,malloc申请的空间,用于 ...
- 通过snmp监控linux
一.linux snmpd安装 yum install -y net-snmp net-snmp-utils 二.snmp的配置(vim /etc/snmp/snmpd.conf) com2sec n ...
- LoadRunner11学习记录二 -- 进行cookie模拟
1.LoadRunner录制打开一个网页的脚本,会生成脚本夹杂迅雷,迅雷看看,百度等链接地址,这是因为ie打开之后会加载未禁用的加载项.需要把相关的加载项禁用掉. 禁用ie加载项步骤,工具--管理加载 ...
- 【Django】Django Debug Toolbar调试工具配置
正在发愁怎么调试Django,就遇到了Django Debug Toolbar这个利器. 先说遇到的问题: 网上也有教程,不过五花八门的,挨个尝试了一遍,也没有成功运行.最后终于找到问题所在: 从开发 ...
- mac安装mysql及终端操作mysql与pycharm的数据库可视化
一.Mac安装mysql 首先下载mysql,地址:https://dev.mysql.com/downloads/mysql/ 然后已知安装就好了,会出现让你记住密码的提示,然后就安装好了.... ...
- 基于AspNet Core2.0(测试版) 开发框架,包含简单的个人博客Demo
大家好,最近离职了,利用闲暇时间就捣鼓了一个基于AspNet Core开发框架,分享出来希望能给AspNet Core学者带来一些帮助,同时也能跟大家一起学习.当然了,由于我的个人技术及经验的有限,框 ...