当前位置: 首页 > news >正文

FFmpeg 中编译和使用 soxr 重采样引擎

1. soxr vs swr 重采样器

FFmpeg 的libswresample默认使用内置的 SWR 引擎进行音频重采样。此外还支持通过编译选项--enable-libsoxr集成 SoX Resampler (soxr) 作为替代引擎。

特性内置 SWRsoxr
重采样质量良好,适合大多数场景更高,适合对音频质量敏感的场景
性能较快略慢(高质量滤波器更长)
编译依赖无,FFmpeg 自带需要额外编译 libsoxr

适用场景:对重采样质量有较高要求的音频处理流程,例如专业音频制作、科学信号处理、需要与其他高质量重采样库对齐结果的场景等。

2. 四端编译 soxr

从 SourceForge 下载 soxr 0.1.3 源码,使用 CMake 编译静态库。

macOS (Fat 库,支持 arm64 + x86_64)

forARCHin$ARCHS;doecho"building soxr for$ARCH..."BUILD_DIR="$SHELL_DIR/soxr-build-$ARCH"mkdir-p"$BUILD_DIR"cd"$BUILD_DIR"cmake"$SOXR_SRC"-DCMAKE_OSX_ARCHITECTURES="$ARCH"\-DCMAKE_INSTALL_PREFIX="$THIN_SOXR/$ARCH"\-DBUILD_SHARED_LIBS=OFF-DCMAKE_BUILD_TYPE=Release\||exit1cmake--build.-j8||exit1cmake--install.||exit1cd-rm-rf"$BUILD_DIR"done# 合并 Fat 库lipo-create"$THIN_SOXR/arm64/lib/libsoxr.a""$THIN_SOXR/x86_64/lib/libsoxr.a"\-output"$FAT_SOXR/lib/libsoxr.a"

iOS

if["$ARCH"="i386"-o"$ARCH"="x86_64"];thenSOXR_SDK="iphonesimulator"elseSOXR_SDK="iphoneos"fiSOXR_SYSROOT=$(xcrun--sdk$SOXR_SDK --show-sdk-path)cmake"$SOXR_SRC"\-DCMAKE_OSX_ARCHITECTURES="$ARCH"\-DCMAKE_OSX_SYSROOT="$SOXR_SYSROOT"\-DCMAKE_OSX_DEPLOYMENT_TARGET="$DEPLOYMENT_TARGET"\-DCMAKE_INSTALL_PREFIX="$THIN_SOXR/$ARCH"\-DBUILD_SHARED_LIBS=OFF\-DBUILD_TESTS=OFF\-DCMAKE_BUILD_TYPE=Release

Android

cmake"$SOXR_SRC"\-DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}\-DANDROID_ABI=${ANDROID_ABI}\-DANDROID_PLATFORM=${ANDROID_PLATFORM}\-DCMAKE_INSTALL_PREFIX=${SOXR_INSTALL_DIR}\-DBUILD_SHARED_LIBS=OFF\-DCMAKE_BUILD_TYPE=Release\-DWITH_OPENMP=OFF\-DBUILD_TESTS=OFF\-DBUILD_EXAMPLES=OFF

Windows

cmake-G"Ninja"-S"${SOXR_SRC}"-B"${basepath}/soxr-build"\-DCMAKE_BUILD_TYPE=Release\-DBUILD_SHARED_LIBS=OFF\-DBUILD_TESTS=OFF\-DBUILD_SHARED_RUNTIME=OFF\-DCMAKE_INSTALL_PREFIX=${basepath}/soxr_install

Windows 注意事项:soxr 的 CMakeLists.txt 最低版本要求为 3.1,不支持CMAKE_MSVC_RUNTIME_LIBRARY。MT/MD 的切换只能通过 soxr 自身提供的BUILD_SHARED_RUNTIME选项控制(OFF= MT,ON= MD)。

编译完成后,在 FFmpeg 的 configure 中添加:

--enable-libsoxr --extra-cflags="-I${SOXR_INSTALL}/include"--extra-ldflags="-L${SOXR_INSTALL}/lib"

静态库打包:如果 soxr 和 FFmpeg 都编译为静态库,需要将libsoxr.a的目标文件合并到libswresample.a中,否则下游链接时会出现未定义符号错误。

3. 使用 soxr 引擎

在创建SwrContext后、swr_init之前(或首次swr_convert_frame前),通过 AVOption 设置引擎及参数:

SwrContext*swr=swr_alloc();av_opt_set_int(swr,"resampler",SWR_ENGINE_SOXR,0);// 切换到 soxr 引擎av_opt_set_double(swr,"precision",33.0,0);// 重采样精度(bit)av_opt_set_double(swr,"cutoff",0.84,0);// 通带截止频率

以上参数配置下的重采样效果与 Pythonresampy库的默认重采样结果一致。

可以通过运行时检测当前 FFmpeg 是否编译了 soxr 支持:

boolisSoxrSupported(){returnstrstr(swresample_configuration(),"enable-libsoxr")!=nullptr;}

4. 注意事项:soxr flush 阶段的已知问题

使用swr_convert_frame+SWR_ENGINE_SOXR复用输出 AVFrame 时,如果 output buffer 容量不足,SwrContext内部会累积未消耗的输入数据(in_buffer)。在最后 flush 阶段,FFmpeg 的 soxr 集成层(soxr_resample.c)会先向 soxr 发送输入终结信号,再尝试处理in_buffer残留数据,导致 soxr 在终结状态下收到输入而崩溃。内置 SWR 引擎不受此影响。

规避方法:每次swr_convert_frame调用前,通过swr_get_out_samples获取预期输出量,确保 output buffer 容量足够,使in_buffer始终为空:

if(swr_is_initialized(swrCtx)){intexpected=swr_get_out_samples(swrCtx,in_frame->nb_samples);// flush 时传 0reserveFrame(expected);// 仅在 expected > capacity 时才重新分配}

该问题属于 FFmpegsoxr_resample.c的集成缺陷,后续计划尝试从 FFmpeg 源码层面修复。

http://www.jsqmd.com/news/541425/

相关文章:

  • 嵌入式OLED UI组件库:轻量级C++组件化设计
  • C++ Template 特化机制详解
  • SEO_掌握核心算法,解读SEO排名背后的原因
  • 上海小程序开发公司三项测评:报价透明度,交付准时率,售后响应度
  • SEO_从基础到精通的SEO完整学习路径介绍(437 )
  • Tasker:裸机嵌入式轻量级任务调度器
  • Multisim仿真-FSK调制系统设计与性能优化
  • Webots新手避坑:用SolidReference搞定并联闭环机构,让轮腿机器人不再‘散架’
  • springboot框架高校大学生竞赛项目管理系统
  • jspssm基于Web的动漫网站论坛交流的设计与实现_n99n6cvu
  • 百川2-13B-4bits量化版对比测试:OpenClaw日常任务执行效率报告
  • QQ空间历史说说备份极简方案:从配置到导出的安全实践指南
  • LFM2.5-1.2B-Thinking-GGUF前端面试题解析实战:模拟面试与答案生成
  • 从测绘‘平差’到视觉SLAM:用Ceres手把手实现VINS中的Bundle Adjustment
  • Go Mutex 与 RWMutex 性能对比
  • 10吨燃气蒸汽锅炉价格对比
  • 在单细胞测序数据分析中,barcodes、features和matrix是三个最核心的基础文件,它们共同构成了所有分析的基石。
  • 做了十几年财务,我用RPA把最累的工作交给了“机器人”
  • 基于Matlab的正态云模型花卉特征提取:从理论到代码实现
  • OpenClaw安全实践:百川2-13B量化模型下的权限管控方案
  • 生成式人工智能赋能下的钓鱼攻击演进:基于Railway PaaS滥用的实证分析与防御重构
  • SEO_避开这些常见误区让你的SEO效果事半功倍
  • 如何用浏览器矢量图形编辑工具提升你的设计效率?
  • Windows上搭建PostgreSQL监控神器:Grafana+Prometheus+Postgres_Exporter保姆级干货教程
  • 5分钟搞定ollama+qwen2.5模型配置:从下载到对话测试全流程指南
  • 博客开荒记
  • apt-offline终极指南:离线环境下的APT包管理解决方案
  • 机械结构零件优化分析:基于Matlab的设计探索
  • 嵌入式工程师高效学习与知识管理方法论
  • GPT-5-Codex CLI实战:如何用UIUIApi中转服务稳定获取API Key(避坑指南)