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 并立即生效。

我希望权限更改不会影响其他事情,但目前一切正常。