我正在尝试创建一个基于三个主要部分的视频生成应用程序:-
0到4秒,“段3”从8到12秒。用户从视频列表中选择介绍、片段和外部内容,应用程序将它们连接在一起(并随机提取3片段)。用户还选择一个音频文件来播放整个视频。生成的文件应该如下所示:
生成视频
VIDEO | Intro (20 - 30) | Seg 1 (4) | Seg 2 (4) | Seg 3 (4) | Outro (10 - 20) |
--------+-----------------+------------+------------+------------+-------------------+
AUDIO | Audio track which spans full video (e.g. 4 minutes long) ... |我已经能够使用ffmpeg (它可以工作)将以下内容合并起来:
ffmpeg -y \
-i audio/audio-19.m4a \
-i videos/intro/intro-23.mkv \
-i videos/segments/segments-88.mkv \
-i videos/outro/outro-12.mkv \
-filter_complex \
"[1:v]trim=0:30,setpts=PTS-STARTPTS[v0]; \
[0:a]atrim=0:30,asetpts=PTS-STARTPTS[a0]; \
[2:v]trim=20:24,setpts=PTS-STARTPTS[v1]; \
[0:a]atrim=30:34,asetpts=PTS-STARTPTS[a1]; \
[2:v]trim=60:64,setpts=PTS-STARTPTS[v2]; \
[0:a]atrim=34:38,asetpts=PTS-STARTPTS[a2]; \
[2:v]trim=132:136,setpts=PTS-STARTPTS[v3]; \
[0:a]atrim=38:42,asetpts=PTS-STARTPTS[a3]; \
[3:v]trim=0:20,setpts=PTS-STARTPTS[v4]; \
[0:a]atrim=42:62,asetpts=PTS-STARTPTS[a4]; \
[v0][a0][v1][a1][v2][a2][v3][a3][v4][a4]concat=n=5:v=1:a=1[out]" \
-map "[out]" generated.mkv然而,这个解决方案有两个问题:-
[1:v]trim=0:30 ...)和外部视频([3:v]trim=0:20 ...)的长度--这些都是可变的,如果我可以简单地连接整个视频,那就更好了。[0:a]atrim=0:30 ...、=>、[0:a]atrim=30:34 ...、=>、[0:a]atrim=34:38 ...、=>等。如果简单地说--“这是音频音轨--根据生成的视频的长度而定--”则会容易得多。任何建议都非常感谢!
发布于 2017-09-21 13:35:05
经过多次阅读,反复尝试,我找到了一个更好的解决方案:-
ffmpeg -y \
-i audio/audio-19.m4a \
-i videos/intro/intro-23.mkv \
-i videos/segments/segments-88.mkv \
-i videos/outro/outro-12.mkv \
-filter_complex \
"[2:v]trim=20:24,setpts=PTS-STARTPTS[s1]; \
[2:v]trim=60:64,setpts=PTS-STARTPTS[s2]; \
[2:v]trim=132:136,setpts=PTS-STARTPTS[s3]; \
[1][s1][s2][s3][3]concat=n=5:v=1:a=0[outv]" \
-map "[outv]" -map 0:a -shortest generated.mkv使用此解决方案,我只修剪段视频(例如,[2:v]trim=20:24),并将时间戳重置为零(setpts=PTS-STARTPTS[s1] -参见https://trac.ffmpeg.org/wiki/FilteringGuide关于为什么有必要)。这是做了3次的三个部分。
然后,concat复合滤波器只连接视频。
[1][s1][s2][s3][3]concat=n=5:v=1:a=0[outv]它从介绍视频([1])、新创建的片段剪辑视频([s1][s2][s3])以及最终的outro视频([3])中获取视频,并将它们连接在一起。但是,它忽略了音频,即concat=n=5:v=1:a=0 (与以前的解决方案中的concat=n=5:v=1:a=1相比),并将其保存到一个名为[outv]的新视频流中。
有关连接的更多信息,请参见https://ffmpeg.org/ffmpeg-filters.html#concat。
最后,我们使用这个新的级联视频流"[outv]"和来自第一个输入文件(0:a)的音频来映射视频。
-map "[outv]" -map 0:a -shortest generated.mkv假设音频轨道大于生成的视频的长度,因此-shortest参数将输出限制为最短流(即生成视频的长度)。
这帮助我理解了-map命令- https://ffmpeg.org/ffmpeg.html#Advanced-options。
https://stackoverflow.com/questions/46340082
复制相似问题