此文已由作者郑博授权网易云社区发布。

欢迎访问网易云社区,了解更多网易技术产品运营经验

最近开始开发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)的更多相关文章

  1. UWP平台Taglib编译(2)

    此文已由作者郑博授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验 #endif  // _WIN32 } class FileStream::FileStreamPrivate ...

  2. xamarin UWP平台线程交互问题

    先吐槽一下,xamarin到现在为止,虽然开发一下应用尚可,对于一些简单的app开发使用xamarin-forms方式开发,虽然有一些优势,可以省下开发三个平台共同功能的时间,但是当我们随着项目深入的 ...

  3. QT全平台设置图标,全平台静态编译 good

    1.  概述 当我们用QT写好了一个软件,要把你的程序分享出去的时候,不可能把编译的目录拷贝给别人去运行.编译好的程序应该是一个主程序,加一些资源文件,再加一些动态链接库,高大上一些的还可以做一个安装 ...

  4. [UWP]在UWP平台中使用Lottie动画

    最近QQ影音久违的更新了,因为记得QQ影音之前体验还算不错(FFmepg的事另说),我也第一时间去官网下载体验了一下,结果发现一些有趣的事情. 是的,你没看错,QQ影音主界面上这个动画效果是使用Lot ...

  5. Unity3d依赖于平台的编译

    Unity的这一功能被命名为"依赖于平台的编译". 这包括了一些预编译处理指令,让你能够专门的针对不同的平台分开编译和运行一段代码. 此外,你能够在编辑器下运行一些代码用于測试而不 ...

  6. webrtc所有平台下载编译步骤详细说明

    webrtc所有平台下载编译步骤详细说明 1.安装depot tools Windows:国外下载:https://storage.googleapis.com/chrome-infra/depot_ ...

  7. DevEco Device Tool 2.1 Beta1 的Hi3861在Windows平台的编译体验

    DevEco Device Tool迎来了2.1 Beta1,其中的亮点之一是:支持Hi3861开发板的源码在Windows平台编译.带着浓厚的兴趣,第一时间做了一次体验. 首先在官网下载" ...

  8. qml支持多平台的编译--尤其对于需要支持xp的情况

    http://www.oschina.net/p/deepin-boot-maker 系统支持: Windows平台: Windows 7/ Windows 8 需要安装显卡驱动 Windows XP ...

  9. Lichee(两) 在sun4i_crane该平台下编译

    让我们先来回顾一下编译命令 $ cd workdir/lichee $ ./build.sh -p sun4i_crane -k 3.0  lichee文件夹下的build.sh #!/bin/bas ...

随机推荐

  1. MyBatis 学习记录4 MyBatis的一级缓存

    主题 分享记录一下MyBatis的一级缓存相关的学习. Demo public static void firstLevelCache() { init("mybatis-config.xm ...

  2. Promethus安装指南

    由于Prometheus是go语言写的,所以不需要编译,安装的过程非常简单,仅需要解压然后运行.Prometheus官方下载地址:https://prometheus.io/download/ 安装P ...

  3. Linux实战教学笔记52:GlusterFS分布式存储系统

    一,分布式文件系统理论基础 1.1 分布式文件系统出现 计算机通过文件系统管理,存储数据,而现在数据信息爆炸的时代中人们可以获取的数据成指数倍的增长,单纯通过增加硬盘个数来扩展计算机文件系统的存储容量 ...

  4. 02- 画文字和图片-------------之前写的那个微博项目,可以试试用画图片的方式来处理,这样应该比UILabel 代码少点,一会试试

    1.画图片 - (void)drawRect:(CGRect)rect { // Drawing code UIImage *image = [UIImage imageNamed:@"pa ...

  5. 获取网页上的所有QQ号码,并生成exel报表

    需要的jar如下: package jsoup.zr.com.utils; /** * * @author LF * */ public class Constant { /** * 网站链接地址ַ ...

  6. PythonScripter2.7报错ascii codec can't encode characters in position 0-1:ordinal not in range(128)

    1. 这是Python 2 mimetypes的bug2. 需要将Python2.7\lib\mimetypes.py文件中如下片段注释或删除:try: ctype = ctype.encode(de ...

  7. gitlab centos 安装配置运维笔记

    写在前面 如果你需要一个git服务器,为企业或自己的团队托管代码而又不希望将代码仓库存储到第三方.你可以在自己的服务器上搭建一个gitlab. 本文为我在最初安装配置gitlab服务器的时候留存的笔记 ...

  8. Photo2

    Story: 驯鹿:“其实我只是想要一个肩膀而已.” 小男孩:“当你需要我的时候,我会在你身边.” Profession: 页面的主色调是淡黄色,这种柔和的色调表达出了柔和的气氛,整个画面颜色的运用都 ...

  9. C# 实现对PPT编辑

    C# Presentation 文本替换 我们可以通过插入占位符的方式,使用新的字词替换已有幻灯片里的文字. 本文将详细描述如何使用Spire.Presentation 来替换Prsentation ...

  10. PreparedStatement的setDate方法如何设置日期

    pstmt.setString(12, "to_char(sysdate,'YYYY-MM-DD HH24:MI:SS')");这样写不对,应该如何写 该方法用于将指定的参数设置为 ...