【问题标题】:How to detect silence and cut mp3 file without re-encoding using NAudio and .NET如何在不使用 NAudio 和 .NET 重新编码的情况下检测静音和剪切 mp3 文件
【发布时间】:2014-01-16 09:04:25
【问题描述】:

我一直在到处寻找答案,但我只能找到一些零碎的东西。我想要做的是加载多个 mp3 文件(暂时合并它们),然后使用静音检测将它们切成碎片。

我的理解是我可以为此使用 Mp3FileReader,但问题是: 1. 如何从 mp3 文件中读取 20 秒的音频?我需要阅读 20 次 reader.WaveFormat.AverageBytesPerSecond 吗?或者可能继续阅读帧,直到 Mp3Frame.SampleCount / Mp3Frame.SampleRate 的总和超过 20 秒? 2. 我如何实际检测到静音?我会查看适当数量的连续样本,以检查它们是否都低于某个阈值。但是,无论它们是 8 位还是 16 位、单声道或立体声等,我如何访问这些样本?我可以直接解码 MP3 帧吗? 3. 检测到样本 10465 的静音后,如何将其映射回 mp3 帧索引以执行剪切而不重新编码?

【问题讨论】:

    标签: naudio


    【解决方案1】:

    这是我推荐的方法(确实涉及重新编码)

    1. 使用 AudioFileReader 在 Read 方法中直接将 MP3 作为浮点样本获取
    2. 找到一个开源噪声门算法,将其移植到 C#,并使用它来检测静音(即,当噪声门关闭时,您将获得静音。您需要调整阈值和攻击/释放时间)
    3. 创建使用噪声门的派生ISampleProvider,并且在其Read 方法中,不返回处于静音状态的样本
    4. 要么:将输出传递到 WaveFileWriter 以创建 WAV 文件并将 WAV 文件编码为 MP3 或者:使用NAudio.Lame 直接编码,无需WAV 步骤。您可能需要先从 SampleProvider 转回 16 位 WAV 提供程序

    【讨论】:

    【解决方案2】:

    阅读以下内容之前: Mark 的回答更容易实现,而且您几乎肯定会对结果感到满意。这个答案适合那些愿意在上面花费过多时间的人。

    话虽如此,实际上可以在不重新编码或完全解码的情况下基于静音切割 MP3 文件...基本上,您可以查看每个帧的侧面信息和每个颗粒的增益和霍夫曼数据来“估计”沉默。

    • 寻找寂静
    • 将静音前的所有帧复制到一个新文件中

    现在变得棘手了......

    • 从静音后的帧中提取音频数据,跟踪哪个帧头与哪个音频数据一起使用。
    • 开始写入第二个新文件,但在写出帧时,请更新 main_data_begin 字段,以便位存储库与音频数据的实际位置同步。

    【讨论】:

      【解决方案3】:

      MP3 是一种压缩音频格式。您不能只剪掉一些位,然后期望其余部分仍然是有效的 MP3 文件。事实上,由于它是基于 DCT 的变换,因此比特位在频域而不是时域中。样本 10465 根本没有位。有一个包含样本 10465 的帧,并且有一组描述该帧中所有频率的位。

      在样本 10465 处剪切音频并继续使用其他随机样本可能会导致不连续性,这意味着结果帧中存在的频率数量会猛增。所以这绝对意味着一个完整的重新编码。更好的方法是平滑过渡,但这不是一个简单的操作。结果当然与输入略有不同,所以它仍然意味着重新编码。

      1. 我不明白你为什么要阅读 20 秒的音频。这个数字是从哪里来的?您通常想阅读所有内容。

      2. 声音是波;完全可以预期它会过零。所以接近零并不特别。对于 20 Hz 波(听力阈值),过零每秒发生 40 次,但每次您将有多个接近零的样本。所以你基本上需要多个样本,它们都接近于零,但在两边。 5 6 7 对于 16 位声音来说并不多,但它很可能是最大为 10000 的波形的一部分。您确实应该检查至少 0.05 秒才能捕捉到那些 20 Hz 的声音。

      3. 由于您在 50 毫秒间隔内检测到静默,因此您的“位置”大约有数百个样本宽。运气好的话,那里有一个框架边界。剪在那里。否则是时候重新编码了。

      【讨论】:

        猜你喜欢
        • 2021-01-07
        • 1970-01-01
        • 2012-10-14
        • 1970-01-01
        • 1970-01-01
        • 2021-06-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多