如何 运行 在 php shell_exec 中执行多个 ffmpeg 任务

How to run multiple ffmpeg tasks in php shell_exec

我正在尝试执行以下任务。

  1. 将视频从 webm 格式转换为 mp4 格式
  2. 调整视频大小
  3. 在右下角添加水印
  4. 生成缩略图

我可以通过 运行 多个 shell 命令来完成。有没有办法一次完成所有四个任务。例如

$watermark = "https://dummyimage.com/150x50/bf1fbf/ffffff.png";
shell_exec("ffmpeg -i test.webm -vf scale=100:-1, {$watermark} -filter_complex overlay=x=(main_w-overlay_w):y=(main_h-overlay_h) test.mp4 -ss 00:00:01.000 -vframes 1 test.jpg");

使用 -filter_complex 的单个实例进行所有过滤:

$watermark = "https://dummyimage.com/150x50/bf1fbf/ffffff.png";
shell_exec("ffmpeg -i test.webm -i '{$watermark}' -filter_complex '[0:v]scale=100:-2[bg];[1]rotate=-3*PI/180[fg];[bg][fg]overlay=x=(main_w-overlay_w):y=(main_h-overlay_h):format=auto,format=yuv420p,split=outputs=2[vid][img]' -map '[vid]' -map 0:a test.mp4 -map '[img]' -ss 00:00:01.000 -frames:v 1 test.jpg");
  • 参见 FFmpeg Filtering Documentation

  • 您的 ffmpeg 必须支持 HTTPS 协议才能使用 HTTPS 输入。请参阅 ffmpeg -protocols 进行检查。否则,在 运行 ffmpeg.

    之前先下载 PNG

过滤图的解释

  • [0:v]scale=100:-2[bg] - 从输入 #0 ([0:v]) 获取视频,scale 到 100 像素宽,auto-scale 高以保留纵横比,但要确保它能被 2 整除(libx264 的要求)。标记比例输出[bg](你可以给它起任何名字)。

  • [1]rotate=-3*PI/180[fg] 将输入 #1 ([1]) 旋转 -3 度。将其命名为 [fg].

  • [bg][fg]overlay=x=(main_w-overlay_w):y=(main_h-overlay_h):format=auto - Overlay [bg] [fg]。将叠加层放在右下角。 format 选项允许它自动 select 适当的像素格式以获得最佳质量。

  • format=yuv420p 使用format filter 制作像素格式yuv420p。这是为了 chroma-subsampling 兼容性,因为基于 non-FFmpeg 的播放器只能支持 YUV 4:2:0 H.264。

  • split=outputs=2[vid][img] Split 将过滤后的输出分成两个相同的流,分别命名为 [vid][img]。当使用相同的过滤输出进行两个输出时,这是必需的,因为您不能 re-use 相同的过滤器输出多次。