为了账号安全,请及时绑定邮箱和手机立即绑定

使用 php、ffmpeg 和 proc_open 逐帧读取视频

使用 php、ffmpeg 和 proc_open 逐帧读取视频

PHP
忽然笑 2022-12-30 16:05:32
我想使用 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 读取多少数据才能获得整个帧。
查看完整描述

1 回答

?
明月笑刀无情

TA贡献1828条经验 获得超4个赞

$descriptors = array(

    0 => array("pipe", "r"),    

    1 => array("pipe", "w"), 

    2 => array("file", "C:/path/error-output.txt", "a") 

);


$command = 'ffmpeg -i INPUT.mp4 -ss 00:00:10 -t 120 -c:v png -f image2pipe  -compression_level 0 -';


$ffmpeg = proc_open($command, $descriptors, $pipes);


if (!is_resource($ffmpeg))

{

    die('Could not run ffmpeg');


}


$k = 0;


$buff = '';


$blend = 0; 


while (!feof($pipes[1]))

{

    $buff .= fread($pipes[1], 50000);


    $pos = strpos($buff, chr(137).'PNG', 1);


    if ($pos !== false)

    {

        $frame = substr($buff, 0, $pos);

        $buff = substr($buff, $pos);


        handleFrame($frame, $k);    


        $k++;       

    }

}


handleFrame($buff, $k);


fclose($pipes[0]);

fclose($pipes[1]);




function handleFrame(&$str, $num)

{

    $im = imagecreatefromstring($str);

    ...

}


查看完整回答
反对 回复 2022-12-30
  • 1 回答
  • 0 关注
  • 79 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信