php - 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,我已经能够在它们上进行转换。
我尝试将路径从绝对更改为相对,完全没有区别。
解决方案
所以,我设法解决了它,结果证明这是一个权限问题。
我的/var/www/site
文件夹具有这样的权限:myuser:www-data
. 在对类似问题检查此答案www-data:root
后,我将文件夹权限更改为并立即生效。
我希望权限更改不会影响其余的事情,但现在一切正常。
推荐阅读
- rxjs - RxJS observable 从第一次发射开始发射先前值和当前值
- php - 将变量 SESSION 放入另一个变量中,删除 SESSION 内容变量
- google-data-studio - 如何将 UTC 日期时间转换为 EST 时区?
- javascript - React Redux 持久化
- vue.js - Vuejs,在生产模式下捕获警告
- c++ - C++ - gtkmm 在 ToolButton 中显示文本和图像
- rxjs - 如何重置 ReplaySubject 上的扫描累加器?
- java - 如何使用 Mockito 模拟服务?
- angular - 阻止角度分量上的路由器更改
- python - 错误:不支持轮子