如何 运行 在 php shell_exec 中执行多个 ffmpeg 任务
How to run multiple ffmpeg tasks in php shell_exec
我正在尝试执行以下任务。
- 将视频从 webm 格式转换为 mp4 格式
- 调整视频大小
- 在右下角添加水印
- 生成缩略图
我可以通过 运行 多个 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
必须支持 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 相同的过滤器输出多次。
我正在尝试执行以下任务。
- 将视频从 webm 格式转换为 mp4 格式
- 调整视频大小
- 在右下角添加水印
- 生成缩略图
我可以通过 运行 多个 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");
您的
之前先下载 PNGffmpeg
必须支持 HTTPS 协议才能使用 HTTPS 输入。请参阅ffmpeg -protocols
进行检查。否则,在 运行ffmpeg
.
过滤图的解释
[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 相同的过滤器输出多次。