首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在不使用mp3和NAudio重新编码的情况下检测静音和剪切.NET文件

如何在不使用mp3和NAudio重新编码的情况下检测静音和剪切.NET文件
EN

Stack Overflow用户
提问于 2014-01-16 09:04:25
回答 3查看 3.6K关注 0票数 7

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

我的理解是,我可以使用Mp3FileReader来处理这个问题,但问题是: 1.如何从mp3文件中读取20秒的音频?我需要读20遍reader.WaveFormat.AverageBytesPerSecond吗?或者继续阅读帧,直到Mp3Frame.SampleCount / Mp3Frame.SampleRate之和超过20秒? 2.我如何实际检测到沉默?我将查看适当数量的连续样本,以检查它们是否都低于某个阈值。但是,我如何访问样本,不管它们是8或16位,单或立体声等?我可以直接解码一个MP3帧吗? 3。在我检测到沉默在例如样本10465,我如何将它映射回mp3帧索引,以执行切割不需要重新编码?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-01-16 22:34:42

在阅读下面的文章之前,Mark的答案要容易得多,而且您几乎肯定会对结果感到满意。这个答案是给那些愿意花大量时间在这上面的人。

也就是说,在没有重新编码或完全解码的情况下,基于沉默的MP3文件实际上是有可能的.基本上,您可以查看每个帧的侧信息和每个颗粒的增益& huffman数据来“估计”沉默。

  • 找到寂静
  • 将沉默前的所有帧复制到一个新文件中。

现在变得棘手..。

  • 在沉默后从帧中提取音频数据,跟踪哪个帧头与什么音频数据相匹配。
  • 开始编写第二个新文件,但是当您写出帧时,更新main_data_begin字段,以便位存储库与音频数据的实际位置同步。
票数 2
EN

Stack Overflow用户

发布于 2014-01-16 15:38:15

下面是我推荐的方法(包括重新编码)

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

Stack Overflow用户

发布于 2014-01-16 10:02:45

MP3是一种压缩音频格式。您不能仅仅删除部分,并期望剩余部分仍然是一个有效的MP3文件。事实上,由于它是一种基于DCT的变换,所以比特是在频域而不是时域。简单地说,样本10465没有位。有一个包含样本10465的帧,并且有一组比特描述该帧中的所有频率。

在样本10465时,普通切割音频,然后继续一些随机的其他样本,可能会导致不连续,这意味着在产生的帧中出现的频率急剧上升。所以这绝对意味着一个完整的重新定位。更好的方法是平稳过渡,但这不是一个简单的操作。当然,结果与输入略有不同,所以它仍然意味着重新编码。

  1. 我不明白你为什么要读20秒的音频。那个号码是从哪来的?你通常想看所有的东西。
  2. 声音是一种波,完全可以预料它会超过零。所以接近于零并不特别。对于20赫兹波(听觉阈值),零交叉每秒发生40次,但每次你将有多个样本接近于零。所以你基本上需要多个样本,都接近于零,但都在两边。5 6 7不太适合16位的声音,但它很可能是一个最高值为10000的波的一部分。你真的应该检查至少0.05秒来捕捉那些20赫兹的声音。
  3. 因为你在50毫秒的间隔内检测到寂静,你有一个“位置”,大约几百个样本宽。如果运气好的话,那里面有一个框架边界。停在那儿。否则就该重新编码了。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21157403

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档