【发布时间】:2018-10-07 10:51:13
【问题描述】:
我最近了解到 FFMPEG 的存在,我正在尝试在我的 wordpress 网站上使用它。
在网站上,我正在开发一个 html/php/js 表单页面,该页面允许用户上传图片,并设置图片显示的时间和时长。
现在我的代码只显示整个视频的一张图片。
<?php if (isset($_POST['button'])) {
echo shell_exec('ffmpeg -t '.$cap_1.' -i /myurl/beach-1866431.jpg -t '.$cap_2.' -i /myurl/orlando-1104481-1.jpg -filter_complex "scale=1280:-2" -i /myurl/audio.mp3 -c:v libx264 -pix_fmt yuv420p -t 30 -y /myurl/'.$v_title.'.mp4 2>&1');
} ?>
我尝试使用我的 php 变量设置“-t”的持续时间,但没有任何变化,我无法弄清楚每个图像的开始时间使用什么。
另外,当编写 shell_exec 命令时,有没有办法在带有换行符的 php 文件中编写工作命令代码,而不是全部放在一行上?例如 -
<?php if (isset($_POST['button'])) {
echo shell_exec('ffmpeg -t '.$cap_1.' -i /myurl/beach-1866431.jpg
-t '.$cap_2.' -i /myurl/orlando-1104481-1.jpg
-filter_complex "scale=1280:-2"
-i /myurl/audio.mp3
-c:v libx264 -pix_fmt yuv420p -t 30 -y /myurl/'.$v_title.'.mp4 2>&1');
} ?>
编辑
到目前为止,concat 文本文件似乎可以工作,但是我不知道如何设置每个图像的开始时间 ---
ffconcat version 1.0
file /path/beach-1866431.jpg
duration 3
file /path/orlando-1104481-1.jpg
duration 5
file /path/beach-1866431.jpg
还有ffmpeg命令-
shell_exec('ffmpeg -f concat -safe 0 -i /path/file.txt -filter_complex "scale=1280:-2" -i /path/audio.mp3 -c:v libx264 -pix_fmt yuv420p -t 30 -y /path/'.$v_title.'.mp4 2>&1');
编辑 2
使用建议的 concat 方法,我的代码现在看起来像这样 --
<?php if (isset($_POST['button'])) {
echo shell_exec('ffmpeg \
-loop 1 -framerate 24 -t 10 -i goldmetal.jpg \
-i 3251.mp3 \
-loop 1 -framerate 24 -t 10 -i cash-register-1885558.jpg \
-loop 1 -framerate 24 -t 10 -i ice-1915849.jpg \
-filter_complex "[0:v][1:a][2:v][3:v]concat=n=4:v=1:a=1[v][a]" -map "[v]" -map "[a]" -c:v libx264 /path/'.$v_title.'.mp4 2>&1');
} ?>
但是我收到了这个错误——
**Stream specifier ':v' in filtergraph description [0:v][1:a][2:v][3:v]concat=n=4:v=1:a=1[v][a] matches no streams.**
编辑 3
我几乎可以根据需要使用 2 个命令,一个用于图像和淡入淡出,另一个用于合并音频。我遇到的唯一问题是更改每张图片的显示时间。 --
echo shell_exec('ffmpeg \
-loop 1 -t 5 -i '.$thepath .'/'.$v_pix1.' \
-loop 1 -t 5 -i ' .$thepath . '/cash-register-1885558.jpg \
-loop 1 -t 5 -i ' .$thepath . '/ice-1915849.jpg \
-loop 1 -t 5 -i '.$thepath .'/'.$v_pix1.' \
-loop 1 -t 5 -i ' .$thepath . '/ice-1915849.jpg \
-filter_complex \
"[0:v]setpts=PTS-STARTPTS,fade=t=out:st=4:d=1,scale=1280:720,setdar=16/9,setsar=sar=300/300[v0]; \
[1:v]setpts=PTS-STARTPTS,fade=t=in:st=0:d=1,fade=t=out:st=4:d=1,scale=1280:720,setdar=16/9,setsar=sar=300/300[v1]; \
[2:v]setpts=PTS-STARTPTS,fade=t=in:st=0:d=1,fade=t=out:st=4:d=1,scale=1280:720,setdar=16/9,setsar=sar=300/300[v2]; \
[3:v]setpts=PTS-STARTPTS,fade=t=in:st=0:d=1,fade=t=out:st=4:d=1,scale=1280:720,setdar=16/9,setsar=sar=300/300[v3]; \
[4:v]setpts=PTS-STARTPTS,fade=t=in:st=0:d=1,fade=t=out:st=4:d=1,scale=1280:720,setdar=16/9,setsar=sar=300/300[v4]; \
[v0][v1][v2][v3][v4]concat=n=5:v=1:a=0,format=yuv420p[v]" -map "[v]" -y '.$thepath .'/fadeout.mp4 2>&1');
echo shell_exec('ffmpeg \
-i '.$thepath .'/fadeout.mp4 \
-i '.$thepath .'/3251.mp3 \
-filter_complex "[0:v:0][1:a:0] concat=n=1:v=1:a=1 [vout] [aout]" -map "[vout]" -map "[aout]" -c:v libx264 -r 1 -y '.$thepath .'/mergetest.mp4 2>&1');
【问题讨论】:
-
您的问题本质上是三个问题:1)如何将图像与
ffmpeg? 连接起来,2)如何在 PHP 脚本中实现该命令,以及 3)如何添加换行符在 PHP 脚本的命令中?这个网站上有很多ffmpegconcat 答案(example)。至于 PHP,在尝试编写脚本之前,您应该先让ffmpeg命令在 cli 中运行。 -
3251.mp3应该在显示特定图像期间播放,还是在整个视频期间播放?由于您介绍了音频,所有其他片段也需要音频,同样每个音频片段都需要相应的视频片段。因此,除非3251.mp3在整个视频期间播放,否则您需要为每个图像生成无声音频,并为3251.mp3生成或提供相应的视频片段。请参阅 anullsrc 的示例链接以制作静音音频。 -
.mp3 音频应该在整个视频中播放(不循环播放)@LordNeckbeard
-
@LordNeckbeard 我尝试完全按照您的示例进行操作,但出现此错误-过滤器图描述中的流说明符':v' [0:v] [4:a] [1:v] [1 :a][2:v][4:a][3:v][4:a]concat=n=4:v=1:a=1 不匹配任何流
标签: command-line video ffmpeg php exec