我正在尝试创建一个基于3个主要部分的视频的应用: -
- into - 变量长度视频(〜20至30秒长)
-
seagments - 来自" sepments Video"的3个剪辑 - 这是一个固定的长度视频(始终400秒),其中包含100个单独的视频,这些视频均精确地为4秒,例如。" segment 1" 是从
0
到4
秒," sement 3 "是从8
到12
秒。 - outro - 可变长度视频(〜10到20秒长)
用户从视频列表中挑选介绍,段和拆卸,并将应用程序串联在一起(并随机提取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
但是,此解决方案有两个问题: -
- 我必须定义 Into Into 视频(
[1:v]trim=0:30 ...
)和Outro Video([3:v]trim=0:20 ...
)的长度 - 这些是可变的,如果我可以简单地限制整个视频,则将是可取的。<<<<<<<<<<<<<</li> - 修剪每个音轨(使用每个视频长度的运行总数),例如
[0:a]atrim=0:30 ...
=>[0:a]atrim=30:34 ...
=>[0:a]atrim=34:38 ...
=>等。
任何建议都非常感谢!
经过大量阅读,反复试验和错误,我得到了一个更好的解决方案: -
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个段的3次。
concat
复杂过滤器然后仅连接视频。
[1][s1][s2][s3][3]concat=n=5:v=1:a=0[outv]
它从介绍视频([1]
),新创建的片段剪辑视频([s1][s2][s3]
)中获取视频,最后是Outro Video([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