运行exec()命令的次数与txt文件的行数一样多

时间:2014-11-11 15:30:04

标签: php batch-processing sox

我正在使用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); 
}

1 个答案:

答案 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文件。