NAudio разделить mp3 файл
Я очень новичок в аудио или mp3 материалах, искал способ иметь возможность разделить mp3-файл на C#, asp.net. После того, как я погуглил в течение трех дней без особой помощи, я надеюсь, что кто-то здесь может указать мне верное направление.
Могу ли я использовать NAudio для этого? Есть ли пример кода для этого? Заранее спасибо.
5 ответов
Мое окончательное решение для разделения mp3 файлов в C# - использовать NAudio. Вот пример сценария для этого, надеюсь, он поможет кому-то в сообществе:
string strMP3Folder = "<YOUR FOLDER PATH>";
string strMP3SourceFilename = "<YOUR SOURCE MP3 FILENAMe>";
string strMP3OutputFilename = "<YOUR OUTPUT MP3 FILENAME>";
using (Mp3FileReader reader = new Mp3FileReader(strMP3Folder + strMP3SourceFilename))
{
int count = 1;
Mp3Frame mp3Frame = reader.ReadNextFrame();
System.IO.FileStream _fs = new System.IO.FileStream(strMP3Folder + strMP3OutputFilename, System.IO.FileMode.Create, System.IO.FileAccess.Write);
while (mp3Frame != null)
{
if (count > 500) //retrieve a sample of 500 frames
return;
_fs.Write(mp3Frame.RawData, 0, mp3Frame.RawData.Length);
count = count + 1;
mp3Frame = reader.ReadNextFrame();
}
_fs.Close();
}
Спасибо предложению Марка Хита для этого.
Требуемое пространство имен - NAudio.Wave.
Файл MP3 состоит из последовательности кадров MP3 (плюс часто теги ID3 в начале и в конце). Самый чистый способ разделить MP3-файл - это скопировать определенное количество кадров в новый файл (и при желании взять с собой теги ID3, если это важно).
NAudio-х MP3FileReader
класс имеет ReadNextFrame
метод. Это возвращает MP3Frame
класс, который содержит необработанные данные в виде байтового массива в RawData
имущество. Он также включает в себя SampleCount
свойство, которое вы можете использовать для точного измерения длительности каждого кадра MP3.
Предыдущие ответы помогли мне начать. NAudio - это путь.
Для моего PodcastTool мне нужно было разделять подкасты с 2-минутными интервалами, чтобы ускорить поиск в определенном месте.
Вот код для разделения mp3 каждые N секунд:
var mp3Path = @"C:\Users\ronnie\Desktop\mp3\dotnetrocks_0717_alan_dahl_imagethink.mp3";
int splitLength = 120; // seconds
var mp3Dir = Path.GetDirectoryName(mp3Path);
var mp3File = Path.GetFileName(mp3Path);
var splitDir = Path.Combine(mp3Dir,Path.GetFileNameWithoutExtension(mp3Path));
Directory.CreateDirectory(splitDir);
int splitI = 0;
int secsOffset = 0;
using (var reader = new Mp3FileReader(mp3Path))
{
FileStream writer = null;
Action createWriter = new Action(() => {
writer = File.Create(Path.Combine(splitDir,Path.ChangeExtension(mp3File,(++splitI).ToString("D4") + ".mp3")));
});
Mp3Frame frame;
while ((frame = reader.ReadNextFrame()) != null)
{
if (writer == null) createWriter();
if ((int)reader.CurrentTime.TotalSeconds - secsOffset >= splitLength)
{
// time for a new file
writer.Dispose();
createWriter();
secsOffset = (int)reader.CurrentTime.TotalSeconds;
}
writer.Write(frame.RawData, 0, frame.RawData.Length);
}
if(writer != null) writer.Dispose();
}
Если вы хотите разделить подкасты, скопируйте дорожки на аудиоустройство (в моем случае плавающие заголовки) и включите небольшой аудиозаголовок, созданный с помощью службы Text To Speech от Google, чтобы идентифицировать дорожки. (например, «История мира в сотне объектов. Эпизод 15. Трек 1 из 4») вы можете проверить небольшой bash-скрипт https://github.com/pulijon/cpodcast/blob/main/cutpodcast.bash
Готов добавить аудиозаголовок на испанском языке. Для других языков вы должны изменить опцию -l и строку заголовка
gtts-cli "Corte $((10#$ntrack)) de $((10#$numtracks)). $5 " -l es --output pre_$track