首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FFmpeg -连接可变长度的引线/外接固定段和单独的音频音轨

FFmpeg -连接可变长度的引线/外接固定段和单独的音频音轨
EN

Stack Overflow用户
提问于 2017-09-21 09:21:00
回答 1查看 592关注 0票数 1

我正在尝试创建一个基于三个主要部分的视频生成应用程序:-

  1. Intro -可变长度视频(~ 20至30秒长)
  2. 片段-从“片段视频”中获取的3段视频--这是一个固定长度的视频(始终为400秒),其中包含100个单独的视频,长度精确地为4秒,例如“段1”从04秒,“段3”从812秒。
  3. Outro -可变长度视频(~ 10至20秒长)

用户从视频列表中选择介绍、片段和外部内容,应用程序将它们连接在一起(并随机提取3片段)。用户还选择一个音频文件来播放整个视频。生成的文件应该如下所示:

生成视频

代码语言:javascript
复制
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 (它可以工作)将以下内容合并起来:

代码语言:javascript
复制
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. 我已经定义了介绍视频([1:v]trim=0:30 ...)和外部视频([3:v]trim=0:20 ...)的长度--这些都是可变的,如果我可以简单地连接整个视频,那就更好了。
  2. 每个音频音轨都被裁剪(使用每个视频长度的运行总数),例如[0:a]atrim=0:30 ...、=>、[0:a]atrim=30:34 ...、=>、[0:a]atrim=34:38 ...、=>等。如果简单地说--“这是音频音轨--根据生成的视频的长度而定--”则会容易得多。

任何建议都非常感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-09-21 13:35:05

经过多次阅读,反复尝试,我找到了一个更好的解决方案:-

代码语言:javascript
复制
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复合滤波器只连接视频。

代码语言:javascript
复制
[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)的音频来映射视频。

代码语言:javascript
复制
-map "[outv]" -map 0:a -shortest generated.mkv

假设音频轨道大于生成的视频的长度,因此-shortest参数将输出限制为最短流(即生成视频的长度)。

这帮助我理解了-map命令- https://ffmpeg.org/ffmpeg.html#Advanced-options

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46340082

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档