首页 > 解决方案 > ffmpeg 命令通过命令行执行,而不是通过 PHP 脚本

问题描述

我正在开发一个简单的视频上传和压缩系统,我目前正在使用以下过程。

第一步

我使用 amultipart/form-data上传原始视频文件,我将其存储在/var/www/site/videos_pre/video.mp4. 我的公用文件夹是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,我已经能够在它们上进行转换。

我尝试将路径从绝对更改为相对,完全没有区别。

标签: phpvideoffmpegwindows-10ubuntu-18.04

解决方案


所以,我设法解决了它,结果证明这是一个权限问题。

我的/var/www/site文件夹具有这样的权限:myuser:www-data. 在对类似问题检查此答案www-data:root后,我将文件夹权限更改为并立即生效。

我希望权限更改不会影响其余的事情,但现在一切正常。


推荐阅读