FFMPEG-连接可变长度介绍 /右固定段和单独的音轨

  • 本文关键字:单独 音轨 连接 FFMPEG- ffmpeg
  • 更新时间 :
  • 英文 :


我正在尝试创建一个基于3个主要部分的视频的应用: -

  1. into - 变量长度视频(〜20至30秒长)
  2. seagments - 来自" sepments Video"的3个剪辑 - 这是一个固定的长度视频(始终400秒),其中包含100个单独的视频,这些视频均精确地为4秒,例如。" segment 1" 是从 04秒," sement 3 "是从 812秒。
  3. 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

但是,此解决方案有两个问题: -

  1. 我必须定义 Into Into 视频([1:v]trim=0:30 ...)和Outro Video([3:v]trim=0:20 ...)的长度 - 这些是可变的,如果我可以简单地限制整个视频,则将是可取的。<<<<<<<<<<<<<</li>
  2. 修剪每个音轨(使用每个视频长度的运行总数),例如[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

最新更新