Windows下编译libsndfile音频库
Posted 草上爬
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
以上是关于Windows下编译libsndfile音频库的主要内容,如果未能解决你的问题,请参考以下文章