我正在使用Sox(Sound eXchange)库将.wav文件转换为.flac。如果我使用终端,它运行良好:
$Brus:~ pum$ sox outputFolder/file/file.000.wav flac/file.000.flac
文件file.000.flac被正确地转换到flac文件夹中。
同样在我的脚本中,如果我运行:
exec('sox/sox outputFolder/file/file.000.wav flac/file.000.flac');
转换效果良好。
我现在的问题是,我需要转换一批文件。我用要转换的文件列表.wav(listWav.txt)创建了一个txt文件,我想在"listWav.txt"文件中有多少行文件名的时候运行"exec()"命令。
这是listWav.txt文件:
outputFiles/file/file.000.wav
outputFiles/file/file.001.wav
这是listFlac.txt文件:
file.000.flac
file.001.flac
这是我在尝试运行"exec()"命令时写的代码,如下所述:
//read all txt files content
$file2 = fopen("listFlac.txt","r");
$file3 = fopen("listWav.txt", "r");
//loop the file and read it line by line
while(! feof($file2) && ! feof($file3)){
$tt = fgets($file2);
$tt2 = fgets($file3);
//run sox conversion
exec('sox/sox' . ' ' . $tt2 . ' ' . 'flac/' . $tt);
}
fclose($file2);
fclose($file3);
如果我打印_r('sox/sox'.''.$tt2.''.'flac/'.$tt);结果是:
sox/sox outputFiles/file/file.000.wav flac/file.000.flac sox/sox outputFiles/file/file.001.wav flac/file.001.flac
因此,"exec()"命令的循环执行的次数与文件"listWav.txt"的行数一样多,但它不能正常工作,因为只生成了"file.001.flac",所以我理解while循环允许"exec
有人知道我必须在脚本中编辑什么才能为列表中的所有文件运行"exec()"的次数吗?
EDIT:我用这种方式解决了问题,我在嵌套时将while一分为二,并调用了两个等效的"exec()"命令。代码可能不太优雅,但它符合我的目的。
while(! feof($file2)){
$tt = fgets($file2);
while (!feof($file3)) {
$tt2 = fgets($file3);
exec('sox/sox' . ' ' . $tt2 . ' ' . 'flac/' . $tt);
}
exec('sox/sox' . ' ' . $tt2 . ' ' . 'flac/' . $tt);
}
使用file
函数,并在循环中添加一个计数器。
$flacArray = file("listFlac.txt");
$wawArray = file("listWav.txt");
$i=0;
foreach ($flacArray as $flac) {
$wavInfo = pathinfo($wawArray[$i]);
exec('sox/sox' . ' ' . $flac . ' ' . 'flac/' . $wavInfo["basename"] . str_pad($i, 3, "0", STR_PAD_LEFT) .".wav");
$i++;
}
注意:这只适用于999文件。