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
相关产品推荐
相关产品推荐

