Я хочу использовать proc_open для чтения каждого кадра из видео с помощью ffmpeg, а затем использовать PHP, чтобы что-то сделать с кадрами. Вот пример, который делает обратное - он посылает кадр за кадром из PHP в ffmpeg:
$descriptors = array(
0 => array("pipe", "r"),
1 => array("pipe", "w"),
2 => array("file", "C:/error-output.txt", "a")
);
$frames = glob('Q:/images/*.jpg');
$command = "ffmpeg -f image2pipe -pix_fmt rgb24 -framerate 10 -c:v mjpeg -i - ".
"-r 10 -vcodec libx264 -pix_fmt yuv420p -preset faster -crf 17 ".
"-y test.mp4";
$ffmpeg = proc_open($command, $descriptors, $pipes);
if (!is_resource($ffmpeg))
{
die('Could not run ffmpeg');
}
foreach ($frames AS $frame)
{
fwrite($pipes[0], file_get_contents($frame) );
}
fclose($pipes[0]);
А вот как я пытаюсь, но не могу понять это правильно:
$descriptors = array(
0 => array("pipe", "r"),
1 => array("pipe", "w"), write to
2 => array("file", "C:/error-output.txt", "a")
);
$command = "ffmpeg -i 1.gif -ss 00:00:3 -s 650x390 -vframes 100 -c:v png -f image2pipe -";
$ffmpeg = proc_open($command, $descriptors, $pipes);
if (!is_resource($ffmpeg))
{
die('Could not run ffmpeg');
}
while (!feof($pipes[1]))
{
$frame = fread($pipes[1], 5000);
}
fclose($pipes[1]);
Самая большая проблема в том, что я не знаю, сколько данных нужно прочитать из ffmpeg, чтобы получить целый кадр.