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);
  }
相关文章:
【推荐】 从golang的垃圾回收说起(上篇)
【推荐】 2018中国云原生用户大会:网易云深度解析微服务框架
                    
                
                
            
        
浙公网安备 33010602011771号