gpt4 book ai didi

ffmpeg - 使用 FFMPEG 高效连接和交叉淡化 .ts 文件

转载 作者:行者123 更新时间:2023-12-04 23:13:46 25 4
gpt4 key购买 nike

我想有效地将​​多个传输文件交叉淡入淡出到一个 m4a 文件中。这意味着分割文件,在连续传输文件的开始/结束处交叉淡入淡出 3 秒,然后将子集和新交叉淡入淡出的重叠连接在一起,以最大限度地减少解码/重新编码。

Gyan provides a solution正确交叉淡化音频文件列表。我能够修改这个程序来为我的目的生成正确的输出 m4a 文件。但是,这需要对每个音频文件的整体进行重新编码。要交叉淡入淡出 10 个音频文件(每个文件长度在 3-5 分钟之间),此解决方案运行 8-12 秒,这不符合为我的实时/直播流用例提供此音频的标准。

为了避免这种解码/重新编码瓶颈,我编写了一个程序来分割每个传输文件,交叉淡入淡出重叠,然后连接所有相关组件。对于上面的 10 个音频文件案例,该程序在 1-2 秒内运行,这确实符合我的实时用例。

下面是连接两个 10 秒传输文件(a.tsb.ts)的缩略版本。这些文件是 AAC 编码的,单声道,只包含不同频率的正弦保存。

ffmpeg -i a.ts -map 0 -f segment -segment_times 7 -c:a copy a_%d.ts
ffmpeg -i b.ts -map 0 -f segment -segment_times 3 -c:a copy b_%d.ts

ffmpeg -i a_1.ts -i b_0.ts -filter_complex acrossfade=d=3:c1=qua:c2=qua xfade.m4a
ffmpeg -i xfade.m4a -c:a copy xfade.ts

ffmpeg -i "concat:a_0.ts|xfade.ts|b_1.ts" -c:a copy out.m4a

请注意,交叉淡入淡出两个重叠的 ~3 秒文件( a_1.tsb_0.ts)需要写入 .m4a,然后转换回 .ts。尝试交叉淡入淡出 -> .ts,或连接 .ts 和 .m4a 文件会导致 out.m4a 中的音频无法播放或丢失音频文件。

该程序生成一个几乎正确的音频文件(17 秒的音频,两个文件之间的 3 秒交叉渐变)。下面是波形的图像。顶部是常规淡入淡出产生的波形,对整个文件(Gyan 的解决方案)进行了编码以进行比较。底部是我的程序产生的。

Waveforms comparison
请注意,这是在交叉淡入淡出的边界处引入的“伪影”。这些小间隙导致音频文件在交叉淡入淡出开始时音量“下降”,并且在交叉淡入淡出结束时有咔哒声。对于常规的、低效的淡入淡出,这些伪影不存在。

我的问题是:
  • 是什么导致这些工件被引入?
  • 检查 xfade.m4a波形显示在开头添加了一个轻微的斜坡,但 ffmpeg 文档没有引用这一点。这是在 .ts/.m4a 之间转换时复用/解复用的结果吗?
  • 这个额外的斜坡并没有考虑到最后的剪辑。这种连接是否也将工件引入这些 .ts 文件?

  • 感谢任何阅读本文的人。

    编辑:我应该补充一点,无论使用什么分段时间/音频文件作为输入,这些伪影都会存在。工件似乎也是确定性的。对于完全相同的输入,它们也会在完全相同的时间出现。

    最佳答案

    音频编码器使用一种称为“位储存器”的东西,这意味着不能连接单个帧,因为它们可能需要来自另一个帧中储存器的位。为了引导该过程,一些编解码器使用称为启动样本的东西。这些样本组成了一个虚拟帧来启动比特储存器。长话短说,无缝连接音频意味着前一帧和下一帧必须就容器的状态和内容达成一致。有一些技术可以解决这个问题,但它们都需要重新编码。

    您示例中的空白是您切断的水库中丢失的位和/或新编码的启动样本。

    TLDR。你是 Solr 。

    关于ffmpeg - 使用 FFMPEG 高效连接和交叉淡化 .ts 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57877233/

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