如何处理PHP中shell_exec调用SoX返回的无格式文本块
嘿,看来你已经能用PHP调用SoX获取音频信息了,就是返回的无格式文本不好处理对吧?我给你几个实用的方案,帮你把这些杂乱的文本转换成好用的结构:
1. 解析成关联数组(最灵活的方式)
这种方法会把SoX的输出转换成键值对数组,之后你可以轻松调用任意音频属性:
$soxOutput = shell_exec('sox --i /path/to/audiofile/file.mp3'); $audioInfo = []; // 先把输出按换行分割成每一行 $lines = explode("\n", trim($soxOutput)); foreach ($lines as $line) { // 以第一个冒号为界,分割键和值 list($key, $value) = explode(':', $line, 2); // 清理掉多余的空格、单引号等无关字符 $cleanKey = trim($key); $cleanValue = trim($value, " \t\n\r\0\x01'"); $audioInfo[$cleanKey] = $cleanValue; } // 示例:访问具体属性 echo "音频时长: " . $audioInfo['Duration'] . "\n"; echo "比特率: " . $audioInfo['Bit Rate'] . "\n"; echo "采样率: " . $audioInfo['Sample Rate'] . "\n";
2. 提取特定字段(按需获取)
如果你只需要某几个特定信息,用正则表达式直接提取会更高效:
$soxOutput = shell_exec('sox --i /path/to/audiofile/file.mp3'); // 提取采样率 preg_match('/Sample Rate\s+:\s+(\d+)/', $soxOutput, $sampleRateMatch); $sampleRate = $sampleRateMatch[1] ?? '未知'; // 提取时长(只取时分秒部分) preg_match('/Duration\s+:\s+([\d:]+)/', $soxOutput, $durationMatch); $duration = $durationMatch[1] ?? '未知'; // 提取文件大小 preg_match('/File Size\s+:\s+([\d.]+[MK])/', $soxOutput, $fileSizeMatch); $fileSize = $fileSizeMatch[1] ?? '未知'; echo "采样率: {$sampleRate} Hz\n"; echo "时长: {$duration}\n"; echo "文件大小: {$fileSize}\n";
3. 格式化输出为可读结构(用于展示)
如果要把这些信息展示给用户,可以整理成整洁的列表(HTML或纯文本都可以):
$soxOutput = shell_exec('sox --i /path/to/audiofile/file.mp3'); $lines = explode("\n", trim($soxOutput)); // 输出为HTML列表(适合网页展示) echo "<div class='audio-info'>"; echo "<h3>音频信息</h3>"; echo "<ul>"; foreach ($lines as $line) { list($key, $value) = explode(':', $line, 2); $cleanKey = trim($key); $cleanValue = trim($value, " \t\n\r\0\x01'"); echo "<li><strong>{$cleanKey}:</strong> {$cleanValue}</li>"; } echo "</ul>"; echo "</div>";
小提示:如果shell_exec返回null,大概率是SoX命令执行出错了(比如文件不存在、权限不足、SoX未正确安装),记得先做错误检查哦!
内容的提问来源于stack exchange,提问作者spice
相关产品推荐
相关产品推荐

