command-line - ffmpeg 图像到具有不同开始时间和持续时间的视频

标签 command-line video ffmpeg php exec

我最近了解到 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');

最佳答案

这个答案解决了 ffmpeg您广泛的多问题中的具体问题。

此示例将获取任意大小的图像,将它们放入 1280x720 的盒子中,在图像之间淡入淡出,同时播放音频。只要图像或音频结束,视频就会结束:以最短者为准。

ffmpeg \
-i audio1.mp3 \
-i audio2.wav \
-loop 1 -t 5 -i image1.jpg \
-loop 1 -t 5 -i image2.png \
-loop 1 -t 5 -i image3.jpg \
-filter_complex \
"[2:v]scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2,setsar=1,fade=t=out:st=4:d=1[v1]; \
 [3:v]scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2,setsar=1,fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v2]; \
 [4:v]scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2,setsar=1,fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v3]; \
 [0:a][1:a]amerge=inputs=2[a];
 [v1][v2][v3]concat=n=3:v=1:a=0,format=yuv420p[v]" \
-map "[v]" -map "[a]" -ac 2 -shortest -movflags +faststart output.mp4

关于command-line - ffmpeg 图像到具有不同开始时间和持续时间的视频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50048052/

相关文章:

android - 使用 ffmpeg 创建一个 android 可播放的音乐幻灯片

linux - 如何从 grep 输出中获取提交

ffmpeg - 如何使用带间隔的 FFMPEG 创建动画 GIF?

api - ffmpeg,音频流 : How to get type (fourcc) of it with the API?

ios - 在 iOS 7 横向模式下播放视频

video - FFMpeg:在保持纵横比的同时以最大宽度和高度缩小视频

ios - 相机视频不工作 - React Native

C - 使用系统调用打印文件?

xml - 有没有办法从命令行向 Maven POM 添加依赖项?

powershell - 卸载以特定字符串开头的所有软件