IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> Windows下编译libsndfile音频库 -> 正文阅读

[C++知识库]Windows下编译libsndfile音频库

libsndfile是一个C语言开发的音频文件读写库,开发源代码。过去libsndfile因为专利原因不支持mp3,但是mp3专利已经过期,最新源代码已经支持mp3了。
官网:http://www.mega-nerd.com/libsndfile,里面列举了目前支持的音频格式,mp3尚未添加进去。
github:https://github.com/libsndfile/libsndfile?

一.使用vcpkg安装依赖库

首先是编译器,我的编译器是2017,如果使用VS2017的话需要先把英文语言包装上(Visual Studio Installer-->修改-->语言包),这个很重要,否则在使用vcpkg时会报错。
vcpkg是windows下的c++包管理器,使用vcpkg可以极大地简化三方库的获取、编译和安装流程,而且并不依赖于Windows注册表或Visual Studio。比如说安装一个mysql客户端,只需要执行vcpkg install libmysql,而不用单独去下载mysql源码编译和安装,节省了大量时间。
vcpkg的使用教程:https://blog.csdn.net/cjmqas/article/details/79282847
vcpkg的github链接:https://github.com/microsoft/vcpkg
我下载的是vcpkg最新release:vcpkg-2021.05.12.zip,解压到E盘根目录。
打开vs2017命令提示符,然后:

cd E:\vcpkg-2021.05.12
.\bootstrap-vcpkg.bat

?此时会在该目录生成一个vcpkg.exe
参考https://github.com/libsndfile/libsndfile中的README.md,执行:

vcpkg install libogg:x86-windows-static
vcpkg install libvorbis:x86-windows-static
vcpkg install libflac:x86-windows-static
vcpkg install opus:x86-windows-static
vcpkg install mp3lame:x86-windows-static 
vcpkg install mpg123:x86-windows-static

其中,mp3lame用于mp3编码,mpg123用于mp3解码。如果要安装64位的话,就把x86改成x64。这一步一般不会报错,如果提示下载失败,尝试科学上网,再试试。
安装成功的静态库在这里:E:\vcpkg-2021.05.12\installed\x86-windows-static\debug\lib

二.编译

环境:CMake 3.1.3或以上,VS2015或以上
clone libsndfile到E盘根目录,然后:

cd E:\libsndfile
mkdir CMakeBuild
cd CMakeBuild

让配置和编译时的临时文件都存到CMakeBuild文件夹,接着:

cmake .. -DCMAKE_TOOLCHAIN_FILE=E:/vcpkg-2021.05.12/scripts/buildsystems/vcpkg.cmake -DVCPKG_TARGET_TRIPLET=x86-windows-static

成功了如下图所示,红框中提示已支持mp3;蓝框中提示不支持的项,因为未安装相关第三方库,如果需要用到这些功能,可以自己安装。如果失败了,删掉CMakeBuild文件夹中的文件,重新再来一遍。


注意:对于CMAKE项目来说,如果要通过find_package()使用安装后的三方库,必须指定CMAKE_TOOLCHAIN_FILE参数
然后,开始编译,执行:

cmake --build .

编译结束,如下图所示,有两个关于sqlite的错误,本人不关心,所以,编译成功

当然也可以打开E:\libsndfile\CMakeBuild\libsndfile.sln,用IDE编译
编译成功的静态库位于:E:\libsndfile\CMakeBuild\Debug
可以看到使用默认步骤安装的第三方库和编译的libsndfile.lib都是debug版本。下面是编译release版本要注意的地方:

1.在E:\vcpkg-2021.05.12\triplets\community中新加一个triplets:x86-windows-static-release.cmake(复制x86-windows-static.cmake并改成自己满意的名字),打开并在最后添加set(VCPKG_BUILD_TYPE release)

2.修改安装指令

vcpkg install libogg:x86-windows-static-release
vcpkg install libvorbis:x86-windows-static-release
vcpkg install libflac:x86-windows-static-release
vcpkg install opus:x86-windows-static-release
vcpkg install mp3lame:x86-windows-static-release
vcpkg install mpg123:x86-windows-static-release

?3.修改cmake参数

cmake .. -DCMAKE_TOOLCHAIN_FILE=E:/vcpkg-2021.05.12/scripts/buildsystems/vcpkg.cmake -DVCPKG_TARGET_TRIPLET=x86-windows-static-release -G"NMake Makefiles" -DCMAKE_BUILD_TYPE=RELEASE

?4.最后执行

nmake

生成的sndfile.lib在E:\libsndfile\CMakeBuild目录中。

三.测试

IDE用的是Qt Creator,在pro文件中添加:

INCLUDEPATH += E:\libsndfile\include \
               E:\libsndfile\CMakeBuild\include

CONFIG(debug, debug|release){
LIBS += -LE:\libsndfile\CMakeBuild\Debug -lsndfile \
        -LE:\vcpkg-2021.05.12\installed\x86-windows-static\debug\lib -lvorbisenc -lvorbis -lFLAC -logg -lopus -llibmpg123 -llibmp3lame-static -llibmpghip-static
} else {
LIBS += -LE:\libsndfile\CMakeBuild -lsndfile \
        -LE:\vcpkg-2021.05.12\installed\x86-windows-static-release\lib -lvorbisenc -lvorbis -lFLAC -logg -lopus -llibmpg123 -llibmp3lame-static -llibmpghip-static
}

两个include目录中分别包括sndfile.hh和sndfile.h。如果使用C++的话,可以用作者封装的SndfileHandle类(sndfile.hh头文件)来完成大部分操作。

#include "sndfile.hh"
#include <iostream>
int main()
{  
    SndfileHandle snd(R"(C:\Users\Administrator\Desktop\NorwayForest-500.mp3)");

    // 获取文件信息.
    std::cout << "frame length:" << snd.frames() << std::endl;
    std::cout << "channels:" << snd.channels() << std::endl;
    std::cout << "samplerate:" << snd.samplerate() << std::endl;
    // 音频格式采用MajorType+SubType的形式.
    if(snd.format()==SF_FORMAT_MPEG|SF_FORMAT_MPEG_LAYER_III)
    {
        std::cout << "format:mp3"  << std::endl;
    }

    // 读取PCM全部数据.
    // pcm-16每个通道每帧为一个short的长度.
    long long buffer_len = snd.frames()*snd.channels();
    short *buffer = new short[buffer_len];
    int read_count = 0;
    if(0)
    {
        // 可以一次全部读取.
        read_count = snd.read(buffer, buffer_len);
    }
    else
    {
        // 也可以分批读取.
        while (read_count < buffer_len)
        {
            const int read_limit = (buffer_len - read_count) > 1024
                    ? 1024: (buffer_len - read_count);
            const int read_len = snd.read(buffer+read_count, read_limit);
            read_count += read_len;
        }
    }
    std::cout << "read count(short):" << read_count << std::endl;

    system("pause");
}

运行结果:

参考链接:https://blog.csdn.net/gongjianbo1992/article/details/98995983
? ? ? ? ? ? ? ? ??https://gongjianbo1992.blog.csdn.net/article/details/99678466

原创不易,转载请标明出处:https://blog.csdn.net/caoshangpa/article/details/119682934

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-08-14 13:50:50  更:2021-08-14 13:52:49 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/20 6:21:51-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码