我正在使用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');
转换效果很好。
我现在的问题是,我需要转换一批文件。我创建了一个txt文件,其中包含要转换的文件列表.wav(listWav.txt),我希望运行“exec()”命令的次数与“listWav.txt”中包含文件名的行一样多“档案。
这是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);
如果我是print_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()”只取“listWav.txt”文件的结束行,并运行它。
是否有人知道我必须在我的脚本中编辑什么来运行“exec()”列表中所有文件的次数?
编辑:我用这种方式解决了,我在嵌套时分裂了两个,并调用了两个等效的“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);
}
答案 0 :(得分:1)
改为使用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文件。