我一直在到处寻找答案,我只能找到一些零碎的东西。我想要做的是加载多个mp3文件(某种程度上暂时合并它们),然后使用静默检测将它们分割成碎片。
我的理解是,我可以使用Mp3FileReader来处理这个问题,但问题是: 1.如何从mp3文件中读取20秒的音频?我需要读20遍reader.WaveFormat.AverageBytesPerSecond吗?或者继续阅读帧,直到Mp3Frame.SampleCount / Mp3Frame.SampleRate之和超过20秒? 2.我如何实际检测到沉默?我将查看适当数量的连续样本,以检查它们是否都低于某个阈值。但是,我如何访问样本,不管它们是8或16位,单或立体声等?我可以直接解码一个MP3帧吗? 3。在我检测到沉默在例如样本10465,我如何将它映射回mp3帧索引,以执行切割不需要重新编码?
发布于 2014-01-16 22:34:42
在阅读下面的文章之前,:Mark的答案要容易得多,而且您几乎肯定会对结果感到满意。这个答案是给那些愿意花大量时间在这上面的人。
也就是说,在没有重新编码或完全解码的情况下,基于沉默的MP3文件实际上是有可能的.基本上,您可以查看每个帧的侧信息和每个颗粒的增益& huffman数据来“估计”沉默。
现在变得棘手..。
发布于 2014-01-16 15:38:15
下面是我推荐的方法(包括重新编码)
AudioFileReader直接在Read方法中获取MP3作为浮点样本ISampleProvider,并在其Read方法中不返回处于静默状态的样本。发布于 2014-01-16 10:02:45
MP3是一种压缩音频格式。您不能仅仅删除部分,并期望剩余部分仍然是一个有效的MP3文件。事实上,由于它是一种基于DCT的变换,所以比特是在频域而不是时域。简单地说,样本10465没有位。有一个包含样本10465的帧,并且有一组比特描述该帧中的所有频率。
在样本10465时,普通切割音频,然后继续一些随机的其他样本,可能会导致不连续,这意味着在产生的帧中出现的频率急剧上升。所以这绝对意味着一个完整的重新定位。更好的方法是平稳过渡,但这不是一个简单的操作。当然,结果与输入略有不同,所以它仍然意味着重新编码。
5 6 7不太适合16位的声音,但它很可能是一个最高值为10000的波的一部分。你真的应该检查至少0.05秒来捕捉那些20赫兹的声音。https://stackoverflow.com/questions/21157403
复制相似问题