在重构时,如何在段之间没有间隙(或音频弹出)的情况​​下对音频文件进行编码和分段?

fen*_*uru 8 html5 ffmpeg audio-streaming node.js web-audio-api

我正在开发一个需要流式传输和同步多个音频文件的Web应用程序.为此,我使用Web Audio API而非HTML5音频标签,因为计时音频的重要性.

目前,我正在使用FFMPEG的分段功能将音频文件编码并分段为更小的块.我正在对它们进行分段的原因是我可以从文件的中间开始流式传输而不是从头开始(否则我只是使用UNIX拆分来拆分文件,如下所示.问题是当我串起音频片段重新组合在一起,我在片段之间获得了音频流.

如果我在.wav文件中使用PCM编码(pcm_s24le)对段进行编码,则回放是无缝的,这使我相信编码器正在填充文件的开头或结尾.由于我将处理许多不同的音频文件,使用.wav将需要太多的带宽.

我正在寻找以下解决方案之一:

  • 如何无缝分割编码的音频文件,
  • 如何强制编码器使用ffmpeg(或其他实用程序)填充音频帧,或者
  • 什么是更好的方式来流式传输音频(从任意轨道时间开始)而不使用音频标签?

系统信息

  • 自定义node.js服务器
  • 上传音频文件后,node.js将数据传输到ffmpeg的编码器中
  • 需要使用HTML5 Web Audio API支持的编码
  • 服务器通过WebSockets套接字一次发送音频块1

提前致谢.我试图尽可能清楚,但如果你需要澄清我会更愿意提供它.

use*_*961 3

由于 PCM 是未压缩格式,因此可以实现无缝播放。没有什么可以造成故障。如果您使用一些无损编解码器(例如 flac),也会发生同样的情况。另一方面,如果您使用任何有损编解码器,例如 mp3、wma 等……则无法在没有任何干预的情况下避免故障。例如,WMA 解码器将始终为您提供比编码时最初提供的更多的 PCM。额外的字节会产生故障,并且还会破坏持续时间。此外,这种串联播放(剪切列表)的持续时间将比应有的持续时间更长。您可以尝试使用一些 DSP 滤波来平滑故障。您甚至可以尝试一些简单的操作,例如交叉淡入淡出过渡等。也许它会给出一些有用的结果。

如果某些无损编解码器因带宽而无法接受,另一种方法是使用有损编解码器(如 mp3)创建压缩文件,并从计算的位置开始流式传输。当然,你不能像在 PCM 中那样对样本进行精确的搜索,并且在解码时你会得到少量无用的 PCM,因为你将在中间开始解码压缩数据,而解码器不需要“先前的数据”。我建议在对此类文件进行编码时使用恒定的比特率,因为您将能够在开始流式传输之前计算出压缩文件中更准确的搜索位置。

关于这里的故障,如果您开始编码此类 mp3 文件并在不停止编码器的情况下创建这些文件,那么在切换文件时不会出现故障,因为您只是将压缩数据划分为更多文件。当然,您可能必须自己实现这一点。