Пытаюсь написать выполнение консольной команды после нажатия на кнопку. Вот что получилось
<tr class="method1">
<th style="color: #831623" scope="row">record</th>
<td>
<button id="recordStart" name="record">start</button>
<?php
$output = shell_exec($_POST['ffmpeg -i udp://@239.239.2.1:1234 -vcodec copy -an -r 25 -t 20 -pix_fmt yuv420p -f mp4 video_for_test.mp4']);
?>
</td>
</tr>
к сожалению это не работает. В чем причина, так и не могу понять
PHP, скорее всего, отрабатывает и возвращает результат выполнения команды. Но на этом всё заканчивается, хотя ffmpeg продолжает работать. Нужно зациклить чтение шелла, примерно так (Найдено на ENSO):
<?php
function liveExecuteCommand($cmd)
{
while (@ ob_end_flush()); // end all output buffers if any
$proc = popen("$cmd 2>&1 ; echo Exit status : $?", 'r');
$live_output = "";
$complete_output = "";
while (!feof($proc))
{
$live_output = fread($proc, 4096);
$complete_output = $complete_output . $live_output;
echo "$live_output";
@ flush();
}
pclose($proc);
// get exit status
preg_match('/[0-9]+$/', $complete_output, $matches);
// return exit status and intended output
return array (
'exit_status' => $matches[0],
'output' => str_replace("Exit status : " . $matches[0], '', $complete_output)
);
}
?>
Пример использования:
$result = liveExecuteCommand('ls -la');
if($result['exit_status'] === "0"){
// do something if command execution succeeds
} else {
// do something on failure
}
Оригинал: http://stackoverflow.com/questions/20107147/php-reading-shell-exec-live-output
Я проверял так:
<?php
$cmd = '/usr/bin/ffmpeg -i /home/drop.avi -r 10 -s 100x200 /home/apache/out.avi'; - В переменную добавляем команду для exec. Взять файл drop и сконвертировать в out.avi
$out=exec($cmd, $output, $value); - Собственно, выполняем команду.
var_dump($output); - Смотрим что исполненая команда дала на выход.
var_dump($value); - Статус завершения - это результат выполнения приложения, т.е. с каким кодом он завершил работу. Если 0 - то всё хорошо. Если НЕ 0 - значит завершился с ошибкой.
var_dump($cmd); - На всякий случай выводим использованную команду.
exit;
?>
При успешном выполнении должны получить что-то вроде :
array(0) { } int(0) string(72) "/usr/bin/ffmpeg -i /home/drop.avi -r 10 -s 100x200 /home/apache/out2.avi"
Нашел то что мне нужно.
я сделал это немного проще чем ваше решение, единственное что еще не подключил, это то, что выдает ffmpeg "2>&1"
<form method="post">
<input type="submit" name="recordStart" value="start" />
<?php
if(isset($_POST['recordStart'])){
$output = shell_exec('ffmpeg -i <input_файл> -vcodec copy -an -t <время_записи> -r <FPS> -pix_fmt yuv420p -f mp4 <output_файл>.mp4');
}
?>
</form>
Единственное что не сделано, 2>&1
это то что выдает FFMPEG
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Такая проблема: COOKIE почему-то хранятся только в пределах одной папкиНапример, на сайте перешел в папку site
Пользователь заходит на главный сайт (xxxru), на нем он регистрируется и открывает виртуальную компанию - после регистрации ему должен выделяться...