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

Posted

技术标签:

【中文标题】使用 FFMPEG 高效连接和交叉淡化 .ts 文件【英文标题】:Efficiently concatenating & crossfading .ts files with FFMPEG 【发布时间】:2019-09-10 19:37:22 【问题描述】:

我想有效地将多个传输文件交叉淡入淡出到一个 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 的解决方案)以进行比较。底部是我的程序产生的。

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

我的问题是:

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

感谢所有阅读本文的人。

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

【问题讨论】:

【参考方案1】:

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

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

TLDR。你是索尔。

【讨论】:

谢谢!您是否有推荐的资源(在线文档、教科书等)供我将来回答类似问题?

以上是关于使用 FFMPEG 高效连接和交叉淡化 .ts 文件的主要内容,如果未能解决你的问题,请参考以下文章

如何在应用模糊的情况下交叉淡化 UIImageView 的图像

如何更改我的 FFMPEG 命令以使我的 HTTP Live Streams 更高效?

在 MongoDB 或其他 DB 中存储 100Mb 文件和高效的交叉连接操作

如何使用FFmpeg连接两个MP4文件? concat视频过滤器concat demuxer concat协议

使用 ffmpeg 实时流式传输 MPEG-TS 和 windows 媒体服务

iPhone HTTP Streaming .m3u8 和 .ts 文件 - 如何使用 ffmpeg 创建