• 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 oolkit filestream.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、理解数据的粒度

  • 相关阅读:
    Vue-cli3 项目配置 Vue.config.js( 代替vue-cli2 build config)
    vue-cli 3 脚手架搭建(create)
    动态设置微信小程序 navigationBarTitle 的值
    微信小程序 获取cookie 以及设置 cookie
    微信小程序 scroll-view 左右横向滑动没有效果(无法滑动)问题
    JavaScript.Array.some() 方法用法
    vue 路由传参中刷新页面参数丢失 及传参的几种方式?
    vue $router.push 传参的问题
    将博客搬至CSDN
    再见,2020
  • 原文地址:https://www.cnblogs.com/163yun/p/10063122.html
Copyright © 2020-2023  润新知