如何在R中捕获seewave调用sox输出的音频文件时长?
解决seewave调用sox无法捕获音频时长的问题
问题原因
seewave::sox()函数执行时,仅调用外部sox程序将时长打印到控制台,函数本身返回的是sox命令的退出状态码(0表示执行成功),而非音频时长。常规的sink()、capture.output()只能捕获R函数的返回值或R内部输出,无法捕获外部程序直接输出到控制台的内容。
解决方案:直接用base R的system2()捕获输出
绕过seewave的封装函数,直接调用system2()执行sox命令,通过stdout = TRUE参数捕获外部程序的输出:
# 替换为你的FLAC文件路径 flac <- "your/file/path.flac" # 指定sox.exe的完整路径(注意要包含sox.exe,不是仅文件夹) sox_exe <- "C:/Program Files (x86)/sox-14-4-2/sox.exe" # 执行sox命令并捕获输出 duration_str <- system2(sox_exe, args = c("--i", "-D", flac), stdout = TRUE) # 转换为数值类型 duration_sec <- as.numeric(duration_str) # 查看结果 duration_sec
补充说明
- 确保sox路径指向
sox.exe可执行文件,而非仅安装文件夹,否则会报错找不到命令。 system2()的args参数需要将命令拆分为参数列表,避免字符串拼接可能带来的路径空格问题。
内容的提问来源于stack exchange,提问作者jmwiniarski
相关产品推荐
相关产品推荐

