【发布时间】:2020-11-28 03:54:18
【问题描述】:
场景
我有一堆 MP3 文件,其中一些具有恒定比特率,另一些具有可变比特率,一些以 128 kbps 编码,一些以其他比特率编码,一些是立体声,一些是联合立体声。全部为 44,100 khz
为了自动化处理这数千个 MP3 文件的任务,我正在尝试开发一种算法,该算法应该在这些 MP3 文件中以不同的任意位置/持续时间插入任意持续时间的静音(例如,插入 500 毫秒的静音到一个 MP3 文件的位置 00:02:30,然后在另一个 MP3 文件的位置 00:40:02 插入 750 毫秒的静音)。
研究
我发现的唯一信息是在 MP3 文件的开头或结尾插入静音。这不是我想要的,因为我需要在任意位置插入静音。大多数情况下,对于大多数文件,我需要在 MP3 文件的中间附近添加静音,也许很少有时候我需要在 MP3 文件的开头添加它。我永远不需要在文件末尾添加静音。
有人建议使用 SOX 或 FFMPEG 命令行应用程序在 MP3 文件的开头或结尾插入静音。我不知道这些应用程序是否可以满足我的目的,但无论如何我的目标是使用 C# 或 VB.NET 语言来做到这一点,而不依赖于任何第三方应用程序,所以这样我可以完全控制哪些修改我将在文件中进行处理,并以编程方式处理生成的修改文件以执行其他任务(因为插入静音只是我对这些 MP3 文件真正需要做的事情之一)。
但我赞成使用任何外部库,我记得 NAudio for .NET,一个很棒的音频处理库,我发现这个有趣的 sn-p 不是关于插入静音但连接文件:
https://markheath.net/post/concatenating-sample-providers-in-naudio
我认为通过 NAudio,我将有机会开发一种算法以在特定持续时间插入静音。
方法
很明显,我没有足够的知识来理解如何完成这项任务。
我想出的一种方法是尝试在流的特定位置插入/填充零,我知道该怎么做,但是......我应该如何翻译零(一个字节)以毫秒计算要插入 MP3 文件的静音持续时间?所以我不知道仅仅插入一个零序列是否会起到沉默的作用,如果它有效,我不知道如何将该零序列转换为时间,我也不知道这种方法是否对所有类型的 MP3 文件变体(CBR、VBR、ABR、单声道或立体声通道等)都是安全的。
我想到的第二种方法是使用任何音频编辑器软件生成一个包含 1 毫秒静音的 MP3 文件,然后在 MP3 的特定位置根据需要多次插入和连接该静音文件流。我想我需要为每个可能的 CBR 比特率生成这个 1 毫秒的 MP3 文件,但是 VBR 和 ABR 会发生什么?我坚持这个想法。
可能最终事情会比我想象的要容易得多,并且肯定 NAudio 可以帮助我完成这项任务,或者至少以更少的努力完成其中的大部分。
问题
如何在未确定的 MP3 文件格式(可能是 CBR、VBR、ABR、单声道或立体声通道、联合立体声、128 或 320 kbps 等)的特定位置/持续时间插入特定持续时间的静音C# 或 VB.NET 是否有 NAudio 或其他 .NET 库的帮助?
要求
-
不使用第三方命令行应用程序也不自动化 GUI 应用程序。
-
文件修改应在不丢失音频的情况下进行,即不重新编码文件。就像 MP3DirectCut 一样,您可以在其中插入静音或剪切和粘贴而无需重新编码。
-
最好能实现一个可重用的通用函数,如下面的函数,使用这个我想尝试简化的参数原型:
public static MemoryStream InsertSilence( Stream inputFile, // pass the raw file stream data TimeSpan startPosition, // eg: new TimeSpan(0, 2, 10) TimeSpan silenceDuration // eg. TimeSpan.FromSeconds(10) ) { // Do the work, save the data into a new stream and return it. return null; }
【问题讨论】:
标签: c# .net vb.net audio naudio