запускать команду exec () столько раз, сколько строк в текстовом файле

Я использую библиотеку 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), которые нужно конвертировать, и я хочу запускать команду «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);

If i 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

Решение

использование 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.

1

Другие решения

Других решений пока нет …