Разделение Wav-файла с помощью NAudio удаляет 1 секунду из каждой части.C#

Место общения программистов C#
Ответить
Anonymous
 Разделение Wav-файла с помощью NAudio удаляет 1 секунду из каждой части.

Сообщение Anonymous »

Я использую NAudio для разделения Wav-файла на несколько частей с равными интервалами. Я использую версию кода, доступную на сайте Sound Code Марка Хита:
public static void TrimWavFile(string inPath, string outPath, TimeSpan cutFromStart, TimeSpan cutFromEnd)
{
using (WaveFileReader reader = new WaveFileReader(inPath))
{
using (WaveFileWriter writer = new WaveFileWriter(outPath, reader.WaveFormat))
{
//int bytesPerMillisecond = reader.WaveFormat.AverageBytesPerSecond / 1000;
float bytesPerMillisecond = reader.WaveFormat.AverageBytesPerSecond / 1000f;
int startPos = (int)cutFromStart.TotalMilliseconds * (int)bytesPerMillisecond;
startPos = startPos - startPos % reader.WaveFormat.BlockAlign;

int endBytes = (int)cutFromEnd.TotalMilliseconds * (int)bytesPerMillisecond;
endBytes = endBytes - endBytes % reader.WaveFormat.BlockAlign;
int endPos = (int)reader.Length - endBytes;

TrimWavFile(reader, writer, startPos, endPos);
}
}
}

private static void TrimWavFile(WaveFileReader reader, WaveFileWriter writer, int startPos, int endPos)
{
reader.Position = startPos;
byte[] buffer = new byte[reader.WaveFormat.BlockAlign * 100];
while (reader.Position < endPos)
{
int bytesRequired = (int)(endPos - reader.Position);
if (bytesRequired > 0)
{
int bytesToRead = Math.Min(bytesRequired, buffer.Length);
int bytesRead = reader.Read(buffer, 0, bytesToRead);
if (bytesRead > 0)
{
writer.Write(buffer, 0, bytesRead);
}
}
}
}

Это разделение файла Wav, но каждая часть на 1 секунду короче указанного интервала. Я не знаю, проблема ли это в коде или в самой библиотеке. Кто-нибудь сталкивался с той же проблемой? Если да, смог ли кто-нибудь решить эту проблему?
Изменить
Это то, что я отправляю в функцию:
TimeSpan cutFromStart = new TimeSpan(0, 0, 0);
TimeSpan cutFromEnd = new TimeSpan(0, 0, 0);
cutFromEnd = totalTime.Subtract(interval);

for (i = 0; i < numberOfParts; i++)
{
outPath = inpath + prefix + (i + 1).ToString() + ".wav";
TrimWavFile(inPath, outPath, cutFromStart, cutFromEnd);
cutFromStart = cutFromStart.Add(interval);
cutFromEnd = cutFromEnd.Subtract(interval);
}


Подробнее здесь: https://stackoverflow.com/questions/488 ... -each-part
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»