加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

UWP平台Taglib编译(1)

发布时间:2020-12-14 04:28:42 所属栏目:大数据 来源:网络整理
导读:此文已由作者郑博授权网易云社区发布。 欢迎访问 网易云社区 ,了解更多网易技术产品运营经验 最近开始开发UWP平台的App,项目需要用到Taglib进行音视频文件的标签信息读写,Google并没有现成的Binaries可以使用;下面记录下自己编译的全过程。 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上是禁止使用的,我们要修改taglibtoolkittfilestream.cpp,完整修改代码如下:

/***************************************************************************
? ?copyright ? ? ? ? ? ?: (C) 2002 - 2008 by Scott Wheeler
? ?email ? ? ? ? ? ? ? ?: [email?protected]
***************************************************************************/

/***************************************************************************
* ? 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,data,-1,nullptr,0);
?if (size > 0) {
? ?auto wstr = std::make_unique(size);

? ?if (MultiByteToWideChar(CP_UTF8,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(),NULL,NULL);
? ?else if(!path.str().empty())
? ? ?return CreateFileA(path.str().c_str(),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,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(),file);
?}

相关文章:
【推荐】?从golang的垃圾回收说起(上篇)
【推荐】?2018中国云原生用户大会:网易云深度解析微服务框架

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读