高效连接&;使用FFMPEG的CrossFacing.ts文件

高效连接&;使用FFMPEG的CrossFacing.ts文件,ffmpeg,aac,Ffmpeg,Aac,我想高效地将多个传输文件交叉淡入m4a文件。这意味着分割文件,在连续传输文件的开始/结束时交叉淡入3秒,然后将子集和新交叉淡入的重叠连接在一起,以最小化解码/重新编码 正确地交叉淡入音频文件列表。我能够修改这个程序,为我的目的生成正确的输出文件。但是,这需要重新编码每个音频文件的全部内容。要交叉淡入10个音频文件(每个文件的长度在3-5分钟之间),此解决方案将运行8-12秒,这不符合为我的实时/实时流用例提供此音频的标准 为了避免这种解码/重新编码瓶颈,我编写了一个程序来分割每个传输文件,交叉淡

我想高效地将多个传输文件交叉淡入m4a文件。这意味着分割文件,在连续传输文件的开始/结束时交叉淡入3秒,然后将子集和新交叉淡入的重叠连接在一起,以最小化解码/重新编码

正确地交叉淡入音频文件列表。我能够修改这个程序,为我的目的生成正确的输出文件。但是,这需要重新编码每个音频文件的全部内容。要交叉淡入10个音频文件(每个文件的长度在3-5分钟之间),此解决方案将运行8-12秒,这不符合为我的实时/实时流用例提供此音频的标准

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

下面是连接两个10秒传输文件的缩写版本(
a.ts
b.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.ts
b_0.ts
)需要写入.m4a,然后转换回.ts。试图交叉淡入->.ts或连接.ts和.m4a文件会导致
out.m4a
文件中的音频无法播放或丢失

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

请注意,在交叉渐变的边界处引入了“伪影”。这些小间隙会导致音频文件在crossfade开始时音量“下降”,并且在crossfade结束时会有一个咔嗒声。这些伪影不适用于常规、低效的交叉淡入

我的问题是:

  • 是什么导致引入这些工件
  • 检查
    xfade.m4a
    波形可以发现在开头添加了一个轻微的渐变,但是ffmpeg文档没有提到这一点。这是在.ts/.m4a之间转换时进行muxing/demuxing的结果吗
  • 这个额外的渐变并不能解释结尾处的剪辑。这种连接是否也会给这些.ts文件引入工件
感谢所有读过这篇文章的人


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

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

示例中的间隙是您切断的存储库中丢失的位和/或新编码的启动样本


TLDR。你是索尔

谢谢大家!!你有没有推荐资源(在线文档、教科书等)让我将来可以回答类似的问题?