【问题标题】:run ffmpeg from PHP web script从 PHP Web 脚本运行 ffmpeg
【发布时间】:2014-02-19 00:11:39
【问题描述】:

我需要在网站运行幻灯片时管理其记录/捕获,以便从这些幻灯片中获取视频。

我的做法是:

<?php 

define('FFMPEG_LIBRARY', '/usr/bin/ffmpeg ');

$ffmpegcmd = "ffmpeg -f x11grab -r 25 -s 800x600 -i :0.0 /tmp/output.mpg";

shell_exec($ffmpegcmd);  

?>

但是我从 php 错误日志中得到这个错误:

[x11grab @ 0x81e8aa0] device: :0.0 -> display: :0.0 x: 0 y: 0 width: 800 height: 600
No protocol specified
No protocol specified
[x11grab @ 0x81e8aa0] Could not open X display.
:0.0: Input/output error

来自控制台的类似命令运行良好。

请帮助获得显示并能够从浏览器 php 脚本控制 ffmpeg?

提前致谢。


感谢您的宝贵时间。

我消除了 X 显示错误,但我仍然没有捕获。

使用 xvfb 我在 /tmp 处得到一个由 www-data 用户编写的未知文件: -rw-r--r-- 1 www-data www-data 11252 Sep 12 09:49 server-B20D7FC79C7F597315E3E501AEF10E0D866E8E92.xkm

运行 startx 我在 /tmp 也得到了一个未知文件 -rw------- 1 www-data www-data 59 Sep 12 09:53 serverauth.oLcFlG7tXC

两者中的任何一个都会增长,因此它不会捕获任何东西。内容是一些二进制的东西。 这些文件是关于什么的?

我正在尝试编写一个脚本,在该脚本中我可以控制 ffmpeg 捕获桌面以从网站上显示的 jquery 幻灯片创建视频的时间。

我从控制台的尝试更接近,但如果我可以通过浏览器完成,我将能够知道在幻灯片完成后何时停止发送 AJAX 请求。

这是我从控制台尝试的:

#!/bin/bash

# start the slide website: I will need to change it to control by querystring the language and course level
firefox http://www.languagecourse.net/vocabulary-trainer.php &
# start recording: I will need to adjust the frame to capture
ffmpeg -f x11grab -r 25 -s 800x600 -i :0.0 /tmp/output2.mpg &
# since I can't control the time a course takes I pause an arbitrary time
sleep 5
# look for the capture PID and close it
for i in $(ps aux | grep ffmpeg | sed "s/  */#/g" | cut -f2 -d#)
do
  echo "proceso $i killed"
  kill -9 $i
done

我想知道一旦网站打开我可以继续从 AJAX 进行控制,但不知道我是否能够获得 ffmpeg PID 来停止命令。

我会感谢任何类型的 cmets。

问候, ·_-

【问题讨论】:

  • 您的网络服务器的用户 ID 将无权与控制台 X11 通信,因为它在其他 ID 下运行。

标签: php ffmpeg


【解决方案1】:

您可以使用 Xvfb 模拟 x 环境

<?php
$ffmpegcmd = "xvfb-run -a  ffmpeg -f x11grab -r 25 -s 800x600 -i :0.0 /tmp/output.mpg";

shell_exec($ffmpegcmd);  

或类似的东西

<?php 
$ffmpegcmd = "startx -- `which Xvfb` :1 -screen 0 800x600x24 && DISPLAY=:1 && ffmpeg -f x11grab -r 25 -s 800x600 -i :0.0 /tmp/output.mpg");
shell_exec($ffmpegcmd); 

摆脱“无法打开X显示”应该很好。错误,并且可能会解决您的问题。

【讨论】:

  • 我偶然发现了这个答案,起初它给我造成了server already running 错误。然后我用ps aux | grep -i xvfb找到运行服务器的进程,然后用sudo kill 123456杀掉它的进程id。之后,上面的xvfb-run 命令完美运行!在此之前,我花了几个小时与cannot open display 问题作斗争,希望在此过程中学到很多东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-14
  • 2013-01-29
  • 2019-07-20
  • 2015-05-08
  • 1970-01-01
  • 2014-03-02
  • 2017-11-04
相关资源
最近更新 更多