如何在编码和分割audio文件时,在重构audio文件时不会在音段之间产生间隙(或audio突变)?

我正在开发一个Web应用程序,需要多个audio文件的stream式传输和同步。 为此,由于定时audio的重要性,我使用HTML5audio标签上的Web Audio API 。

目前,我正在使用FFMPEG的分段function来编码和分割audio文件成更小的块。 我分割它们的原因是我可以从文件的中间开始stream式传输,而不是从头开始(否则我只需要使用UNIX split来分割文件, 如下所示 。问题是,当我将stringaudio片段一起回来,我得到段之间的audiostream行音乐。

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

我正在寻找以下解决scheme之一的问题:

  • 如何无缝地分割编码的audio文件,
  • 如何强制编码器不使用ffmpeg(或其他工具)填充audio帧,或者
  • 什么是更好的方式来stream式audio(开始在一个任意的轨道时间),而不使用audio标签?

系统信息

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

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

由于PCM是未压缩格式,所以预计可以无缝播放。 没有什么可以造成一个小故障。 同样的事情会发生,如果你使用像flac一些无损编解码器。 另一方面,如果你使用任何有损编解码器,如MP3,WMA等…没有任何干预没有办法避免毛刺。 例如,WMA解码器总是会给你更多的PCM,而不是你在编码时最初提供的。 多余的字节会产生一个小故障,并且也会导致持续时间缩短。 另外,这样的连接播放(cutlist)将会有更长的持续时间。 您可以尝试用一些DSP滤波来平滑毛刺。 你甚至可以尝试一些简单的操作,如交叉淡入淡出,等等。也许会给出一些有用的结果。

如果某些无损编解码器由于带宽而不能被接受,则另一种方法是创build具有诸如mp3之类的有损编解码器的压缩文件,并从计算出的位置开始stream式传输。 当然,你不能像PCM那样对样本进行精确search,而且在解码时你会得到less量无用的PCM,因为你将在中间开始解码压缩数据,而不需要解码器要求的“先前数据”。 编码这样的文件时,我会build议恒定比特率,因为在开始stream式传输之前,您将能够计算出更精确的压缩文件中的查找位置。

关于这里的故障,如果你开始编码这样的mp3文件,并且创build这些文件,而不停止编码器,那么切换文件时就不会出现毛病,因为你只是将压缩数据分成多个文件。 当然,你可能必须自己实现这个。