Я использую библиотеку 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()" количество раз для всех файлов в списке?
EDIT: Я решил таким образом, я разделил время на два в то время как вложенные и назвал две эквивалентные команды "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.