【问题标题】:Using NAudio for .NET how do I remove the silence wave at the end of mp3 file?使用 NAudio for .NET 如何删除 mp3 文件末尾的静音波?
【发布时间】:2012-10-14 04:04:01
【问题描述】:

我正在开发一个 C# WPF 应用程序,它将一组单词(大约 17,000 个单词)组合在一起,并生成一个匹配 mp3 文件的播放列表(每个 mp3 文件都是一个单词)。

目前,每个 mp3 文件在其波形结束时都有 1 秒到 30 秒之间的随机静音。

我希望能够以编程方式从文件末尾删除静音波。

使用 NAudio for .NET 如何从 mp3 文件末尾删除静音波?

【问题讨论】:

标签: c# .net audio mp3 naudio


【解决方案1】:

我使用SoX完成了

SoX Silence 文档: http://digitalcardboard.com/blog/2009/08/25/the-sox-of-silence/

SoX Silence 文件结尾的 Stackoverflow 帮助参考: https://stackoverflow.com/a/11834671/677607

使用 C# 执行命令行: https://stackoverflow.com/a/1469790/677607

【讨论】:

【解决方案2】:

有两种方法可以修剪 MP3 文件。第一种是使用 Mp3FileReader 将音频读出为 WAV,然后使用 WaveFileWriter 仅将您想要的数量写入新的 WAV 文件。然后您可以使用 LAME.exe 等工具将其转换回 MP3,因为 NAudio 不包含 MP3 编码器。

第二个是丢弃 Mp3Frames,它的好处是不需要解码和重新编码。 MP3 文件由一系列 Mp3Frames 组成(并且可以选择在开始或结束处包含 ID3 标签等元数据)。然后,您可以创建一个新的 MP3 文件,只需将您想要的 MP3 帧附加到一个新文件中,跳过最后一个(并选择确保您的 ID3 标签包含在截断的文件中)。查看 Mp3FileReader 的源代码,了解如何从 MP3 文件中逐一读取 Mp3Frame。

【讨论】:

  • Currently each mp3 file has a random silence between 1 second to 30 seconds at the end of its wave. 你怎么知道要跳过多少帧?!我猜 OP 是在确定静音帧之后 :)
  • 每个 Mp3Frame 都有一个 SampleCount 属性,您可以从中计算出它的持续时间。检测静音是另一回事 - 您可以通过使用 Mp3FileReader 转换为 PCM 来获取样本值,但通常当人们说“静音”时,他们的意思是低于某个音量阈值,因此您需要检查每个样本的值和确定它是否低于您的阈值
  • 马克,我正在查看您的代码 (naudio),有几个问题。我需要从音频文件中删除“静音”(格式并不重要,因为我可以使用 SoX 转换格式,例如)。 SoX 运行良好,但是......我不仅需要从音频文件中删除静音,还需要设置用于删除部分的特殊标签并将此标签写入文件。你能给我一些建议吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-30
  • 2020-05-23
相关资源
最近更新 更多