gpt4 book ai didi

FFmpeg - 连接可变长度的前奏/后奏固定片段和单独的音轨

转载 作者:行者123 更新时间:2023-12-04 22:59:49 25 4
gpt4 key购买 nike

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

  • 简介 - 可变长度视频(约 20 到 30 秒长)
  • 分割 - 来自“片段视频”的 3 个剪辑 - 这是一个固定长度的视频(始终为 400 秒),其中包含 100 个单独的视频,所有视频的长度都精确为 4 秒,例如“段 1”来自 04秒和“段 3”来自 812秒。
  • 结尾 - 可变长度视频(约 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:v]trim=0:30 ... ) 和结尾视频 ( [3:v]trim=0:20 ... ) 的长度 - 这些都是可变的,如果我可以简单地连接整个视频会更好。
  • 每个音轨都被修剪(使用每个视频长度的运行总数),例如[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] ) 和最后的结尾视频 ( [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

    关于FFmpeg - 连接可变长度的前奏/后奏固定片段和单独的音轨,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46340082/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com