Я использую библиотеку 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);
}
использование 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.
Других решений пока нет …