ffmpeg 命令通过命令行执行,而不是通过 PHP 脚本执行
ffmpeg command executes via command line, but not via PHP script
我正在开发一个简单的视频上传和压缩系统,我目前正在使用以下流程。
第一步
我使用 multipart/form-data
上传原始视频文件,我将其存储在 /var/www/site/videos_pre/video.mp4
中。我的 public 文件夹是 var/www/site/public_html/
。我在我的数据库中存储了一个包含视频信息的条目。
第二步
我有一个非常基本的转换器进程,但可以完成工作(至少在 CLI 中)。
它有以下代码:
public function converter($content_id)
{
$content = $this->videos_m->get($content_id);
$id = uniqid();
$name_mp4 = $content->name_slug.'_'.$id.'.mp4';
$name_webm = $content->name_slug.'_'.$id.'.webm';
$command_mp4 = 'ffmpeg -i ../videos_pre/'.$content->original_file.' -b:v 1500k -bufsize 1500k ./videos/'.$name_mp4;
system($command_mp4);
$command_webm = 'ffmpeg -i ./videos/'.$name_mp4.' -c:v vp9 -c:a libvorbis ./videos/'.$name_webm;
system($command_webm);
$update_video = new stdClass();
$update_video->archivo_mp4 = $name_mp4;
$update_video->archivo_webm = $name_webm;
$this->db->where('content_id', $content_id);
$this->db->update('Videos', $update_video);
}
第三步-出现问题的地方
我已经在 Windows 10 和 Ubuntu 18.04 上测试过了。该代码在 php 和 cli 中都适用于 Windows 10。 Ubuntu 上的代码仅适用于 cli。
生成的命令是这样的:
// First command to reduce the bitrate of the mp4
ffmpeg -i /var/www/site/videos_pre/video.mp4 -b:v 1500k -bufsize 1500k /var/www/site/public_html/videos/video_5e757d3e0d762.mp4
// Second command to convert the mp4 to a webm to get both types
ffmpeg -i /var/www/site/public_html/videos/video_5e757d3e0d762.mp4 -c:v vp9 -c:a libvorbis /var/www/site/public_html/videos/video_5e757d3e0d762.webm
如果我执行这些命令,它们将完美运行。如果我 运行 php 脚本,无论是在浏览器中还是通过 CLI,几乎什么都不会发生。没有任何错误消息。
我不确定这是否是权限问题,是否有特定于 php 至 运行 的内容,或者我尚未激活的某些模块。我有足够的执行时间,我有 600 秒,但正如我所说,它甚至不需要时间,它什么都不做。
我什至可以回显命令,它们就会出现。所以,基本上问题是我需要能够 运行 来自 PHP 的那些命令。我是在 Windows 上做的,但是 Ubuntu 18.04 不允许我这样做。这两个操作系统最近都安装了 ffmpeg,我已经能够在这两个操作系统上进行转换。
我尝试将路径从绝对路径更改为相对路径,完全没有区别。
所以,我设法解决了,原来是权限问题。
我的 /var/www/site
文件夹的权限如下:myuser:www-data
。在检查了类似问题的 this answer 后,我将文件夹权限更改为 www-data:root
并立即生效。
我希望权限更改不会影响其他事情,但目前一切正常。
我正在开发一个简单的视频上传和压缩系统,我目前正在使用以下流程。
第一步
我使用 multipart/form-data
上传原始视频文件,我将其存储在 /var/www/site/videos_pre/video.mp4
中。我的 public 文件夹是 var/www/site/public_html/
。我在我的数据库中存储了一个包含视频信息的条目。
第二步
我有一个非常基本的转换器进程,但可以完成工作(至少在 CLI 中)。
它有以下代码:
public function converter($content_id)
{
$content = $this->videos_m->get($content_id);
$id = uniqid();
$name_mp4 = $content->name_slug.'_'.$id.'.mp4';
$name_webm = $content->name_slug.'_'.$id.'.webm';
$command_mp4 = 'ffmpeg -i ../videos_pre/'.$content->original_file.' -b:v 1500k -bufsize 1500k ./videos/'.$name_mp4;
system($command_mp4);
$command_webm = 'ffmpeg -i ./videos/'.$name_mp4.' -c:v vp9 -c:a libvorbis ./videos/'.$name_webm;
system($command_webm);
$update_video = new stdClass();
$update_video->archivo_mp4 = $name_mp4;
$update_video->archivo_webm = $name_webm;
$this->db->where('content_id', $content_id);
$this->db->update('Videos', $update_video);
}
第三步-出现问题的地方
我已经在 Windows 10 和 Ubuntu 18.04 上测试过了。该代码在 php 和 cli 中都适用于 Windows 10。 Ubuntu 上的代码仅适用于 cli。
生成的命令是这样的:
// First command to reduce the bitrate of the mp4
ffmpeg -i /var/www/site/videos_pre/video.mp4 -b:v 1500k -bufsize 1500k /var/www/site/public_html/videos/video_5e757d3e0d762.mp4
// Second command to convert the mp4 to a webm to get both types
ffmpeg -i /var/www/site/public_html/videos/video_5e757d3e0d762.mp4 -c:v vp9 -c:a libvorbis /var/www/site/public_html/videos/video_5e757d3e0d762.webm
如果我执行这些命令,它们将完美运行。如果我 运行 php 脚本,无论是在浏览器中还是通过 CLI,几乎什么都不会发生。没有任何错误消息。
我不确定这是否是权限问题,是否有特定于 php 至 运行 的内容,或者我尚未激活的某些模块。我有足够的执行时间,我有 600 秒,但正如我所说,它甚至不需要时间,它什么都不做。
我什至可以回显命令,它们就会出现。所以,基本上问题是我需要能够 运行 来自 PHP 的那些命令。我是在 Windows 上做的,但是 Ubuntu 18.04 不允许我这样做。这两个操作系统最近都安装了 ffmpeg,我已经能够在这两个操作系统上进行转换。
我尝试将路径从绝对路径更改为相对路径,完全没有区别。
所以,我设法解决了,原来是权限问题。
我的 /var/www/site
文件夹的权限如下:myuser:www-data
。在检查了类似问题的 this answer 后,我将文件夹权限更改为 www-data:root
并立即生效。
我希望权限更改不会影响其他事情,但目前一切正常。