案例如下:
$command = "ffmpeg -f v4l2 -pix_fmt mjpeg -i /dev/video0 -acodec aac -b:a 48k -ar 44100 -f mp4 -r 25 -s 1920x1080 -b:v 10M $filename";
$descriptorspec = array(
0 => array("pipe", "r"), //标准输入,子进程从此管道读取数据
1 => array("pipe", "w"), //标准输出,子进程向此管道写入数据
2 => array("file", "error-output.txt", "a") //标准错误,写入到指定文件
);
$process = proc_open($command, $descriptorspec, $pipes);
stream_set_blocking($pipes[1], 0); //非阻塞
if (is_resource($process)) {
// $pipes 现在看起来是这样的:
// 0 => 可以向子进程标准输入写入的句柄
// 1 => 可以从子进程标准输出读取的句柄
// 错误输出将被追加到文件 /tmp/error-output.txt
do {
$i = cache('end_record') ? cache('end_record') : 0;
sleep(2);
}
while ($i == 0);
fwrite($pipes[0], 'q'); // 结束指令
fclose($pipes[0]);
echo stream_get_contents($pipes[1]);
fclose($pipes[1]);
// 切记:在调用 proc_close 之前关闭所有的管道以避免死锁。
$return_value = proc_close($process);
// 修改缓存值为0,为下次录制重置条件
cache('end_record', 0);
// 添加文件到数据库
$uid = '10000001'; // TODO 修改为正式的客户端ID
$data['uid'] = $uid;
$data['code'] = $param['file_id'];
$data['videoPath'] = 'public/' . $filename;
$data['is_upload'] = 0;
$data['need_upload'] = intval($param['need_upload']);
$data['create_time'] = time();
$id = Db::name('common_file')->insertGetId($data);
$this->cut(ROOT_PATH . $filename, $filepath, $id,$param['file_id']);
// echo "command returned $return_value ";
}
以上就是“php通过proc_open函数调用命令行来实现同一线程多次命令行”的详细内容,更多请关注木子天禾科技其它相关文章!