9

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

目前,我正在使用 FFMPEG 的分割功能将音频文件编码和分割成更小的块。我对它们进行分段的原因是我可以从文件中间开始流式传输,而不是从头开始(否则我会使用 UNIX 拆分来拆分文件,如此处所示。问题是当我将音频片段重新组合在一起,我得到片段之间的音频弹出。

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

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

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

系统信息

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

提前致谢。我试图尽可能清楚,但如果您需要澄清,我非常愿意提供。

4

1 回答 1

2

由于 PCM 是未压缩格式,因此可以无缝播放。没有什么可以造成故障。如果您使用像 flac 这样的无损编解码器,也会发生同样的事情。另一方面,如果您使用任何有损编解码器,如 mp3、wma 等......没有任何干预就无法避免故障。例如,WMA 解码器总是会为您提供比您最初在编码时提供的更多的 PCM。额外的字节会产生一个小故障,它也会搞砸持续时间。此外,这种级联播放(剪辑列表)的持续时间将更长。您可以尝试使用一些 DSP 过滤来平滑故障。您甚至可以尝试一些简单的操作,例如交叉淡入淡出等。也许它会产生一些有用的结果。

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

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

于 2013-05-16T07:29:33.747 回答