You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SoX reverse方法在Android调用崩溃,求非换库的解决办法

Android SoX包装器reverse命令崩溃的解决方案

问题描述

  • 测试多个Android SoX包装器时,发现reverse命令会触发崩溃,但tempo、noisered、fade、compand等命令可正常处理音频并生成新文件
  • 崩溃日志:

E can't create temporary file: No such file or directory
A FORTIFY: pthread_mutex_lock called on a destroyed mutex (0x7abf7a05a8)
A Fatal signal 6 (SIGABRT), code -1 (SI_QUEUE) in tid 29073 (RenderThread), pid 29025 (mmandlibandroid)
A FORTIFY: pthread_mutex_lock called on a destroyed mutex (0x7b7c775d30)

  • 崩溃触发的命令示例:sox input.wav output.wav reverse : restart
  • 该命令在OSX上可正常运行,推测核心问题为SoX无法创建输出文件或临时文件,目前正在调试pxhbug123的SoX包装器

可行解决办法

1. 修复文件路径与权限

  • 使用应用私有存储路径:将输入/输出文件放在getFilesDir()或getExternalFilesDir(null)返回的目录下,避免公共存储的权限限制
  • 提前创建输出目录:如果输出路径所在目录不存在,先调用mkdirs()创建,示例代码:
File outputDir = new File(getExternalFilesDir(null), "sox_audio");
if (!outputDir.exists()) {
    outputDir.mkdirs();
}
String outputPath = new File(outputDir, "output.wav").getAbsolutePath();
  • 适配Android权限规则:Android 10及以上可使用Scoped Storage,或在Manifest中添加android:requestLegacyExternalStorage="true"做兼容,同时确保已申请WRITE_EXTERNAL_STORAGE权限

2. 调整SoX命令参数

  • 简化命令:去掉: restart扩展参数,尝试基础命令sox input.wav output.wav reverse,部分Android包装器可能不支持该扩展语法
  • 显式指定临时目录:SoX处理reverse时需要临时文件,通过--tmp参数指定应用有权限访问的目录,示例:
sox --tmp /data/data/你的应用包名/files/tmp input.wav output.wav reverse

需提前创建该临时目录并确保权限

3. 调试包装器代码逻辑

  • 检查路径转义:确认包装器是否正确处理含空格的文件路径,避免路径解析错误
  • 配置环境变量:修改包装器代码,将TMPDIR环境变量指向应用私有目录,确保SoX能找到合法的临时文件存储位置
  • 替换文件创建逻辑:如果包装器默认使用的临时目录不可访问,手动替换为应用有权限的私有目录

4. 内存IO绕过文件系统

  • 修改包装器代码,支持将输入音频读取到内存后直接处理,再将结果写入内存后导出到文件,彻底绕开文件系统权限问题

内容的提问来源于stack exchange,提问作者Dawid Jewdokimow

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 14:18:24