我想知道是否可以输出由输入视频的多个片段组成的视频。例如,输出由输入的每一分钟的前 10 秒组成的视频。
我知道您可以通过编程方式执行此操作,ffmpeg
使用 -ss 和 -t 调用多次来创建块然后合并它们,但是是否可以使用视频过滤器在一个命令中执行此操作?
答案1
解决了!这是最终的解决方案:
每分钟的前 2 秒,音频和视频。
ffmpeg -i fullmovie.mp4
-vf "select='gte(mod(t\,60),0)*lte(mod(t\,60),2)',setpts='N/(FRAME_RATE*TB)'"
-vcodec libx264 -crf 23 -acodec libfaac -ac 1 -ab 56k
-af "aselect='gte(mod(t\,60),0)*lte(mod(t\,60),2)',asetpts='N/(SAMPLE_RATE*TB)'" trailer.mp4
- 选择过滤器评估每个输入帧的表达式,如果结果为 0,则丢弃它,如果结果为 1,则保留它
- 我的表达式在每分钟的前 2 秒返回 1
- setpts 根据帧/样本的数量和帧率/采样率修改每个帧/样本的 PTS
答案2
不,目前这还不可能。您必须编写一个脚本,使用给定的和选项ffmpeg
多次调用- 至少这是最直接的方法。-ss
-t
不要忘记位置很-ss
重要:
当用作输入选项(在 -i 之前)时,在此输入文件中搜索位置。当用作输出选项(在输出文件名之前)时,解码但丢弃输入,直到时间戳到达位置。这较慢,但更准确。
我本来想说你可以使用select
过滤器,它允许你评估诸如“仅选择 10 到 20 秒之间的帧”之类的表达式,但如果不复制帧并产生正确(即剪切)的输出,我就无法让它工作。