C# 修剪wav文件
我正在尝试使用中的代码修剪文件C# 修剪wav文件,c#,wpf,audio,trim,naudio,C#,Wpf,Audio,Trim,Naudio,我正在尝试使用中的代码修剪文件 如果bytesRequired我找到了解决方案,您应该中断while循环。完成后,我不得不编写writer.Dispose()。 就像这样: public static void TrimWavFile(string inPath, string outPath, TimeSpan cutFromStart, TimeSpan cutFromEnd) { using (WaveFileReader reader = new WaveFileReader(
如果
bytesRequired我找到了解决方案,您应该中断while循环。完成后,我不得不编写writer.Dispose()。
就像这样:
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;
int startPos = (int)cutFromStart.TotalMilliseconds * bytesPerMillisecond;
startPos = startPos - startPos % reader.WaveFormat.BlockAlign;
int endBytes = (int)cutFromEnd.TotalMilliseconds * bytesPerMillisecond;
endBytes = endBytes - endBytes % reader.WaveFormat.BlockAlign;
int endPos = (int)reader.Length - endBytes;
TrimWavFile(reader, writer, startPos, endPos);
writer.Dispose();
}
}
您使用的示例代码有点过时,并且有一些bug。
以下是一个更新版本(对我来说非常适用):
到
我这样做了,但我仍然明白:你知道为什么吗?输入文件可以播放吗?什么是波形?输入是可播放的,它是一个wav文件。我调试了程序,它甚至没有进入else和打破while循环。我在问题中添加了代码。奇怪-这就是using语句应该为您做的
while (reader.Position < end)
{
int bytesRequired = (int)(end - 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);
}
else if (bytesRead == 0)
{
break;
}
}
else if (bytesRequired <= 0)
{
break;
}
}
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;
int startPos = (int)cutFromStart.TotalMilliseconds * bytesPerMillisecond;
startPos = startPos - startPos % reader.WaveFormat.BlockAlign;
int endBytes = (int)cutFromEnd.TotalMilliseconds * bytesPerMillisecond;
endBytes = endBytes - endBytes % reader.WaveFormat.BlockAlign;
int endPos = (int)reader.Length - endBytes;
TrimWavFile(reader, writer, startPos, endPos);
writer.Dispose();
}
}
private void Cut()
{
var filename = @"G:\Voice\Samples\LongAudioFile.wav";
FileInfo fi = new FileInfo(filename);
var outputPath = System.IO.Path.Combine(fi.Directory.FullName, string.Format("{0}_Shorter{1}", fi.Name.Replace(fi.Extension, ""), fi.Extension));
TrimWavFile(filename, outputPath, TimeSpan.FromHours(1));
}
public static void TrimWavFile(string inPath, string outPath, TimeSpan duration)
{
using (WaveFileReader reader = new WaveFileReader(inPath))
{
using (WaveFileWriter writer = new WaveFileWriter(outPath, reader.WaveFormat))
{
float bytesPerMillisecond = reader.WaveFormat.AverageBytesPerSecond / 1000f;
int startPos = 0;
startPos = startPos - startPos % reader.WaveFormat.BlockAlign;
int endBytes = (int)Math.Round(duration.TotalMilliseconds * bytesPerMillisecond);
endBytes = endBytes - endBytes % reader.WaveFormat.BlockAlign;
int endPos = endBytes;
TrimWavFile(reader, writer, startPos, endBytes);
}
}
}
private static void TrimWavFile(WaveFileReader reader, WaveFileWriter writer, int startPos, int endPos)
{
reader.Position = startPos;
byte[] buffer = new byte[reader.BlockAlign * 1024];
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);
}
}
}
}
int startPos = 0;
int startBytes = (int)Math.Round(startPoint.TotalMilliseconds * bytesPerMillisecond);
startBytes = startBytes - startBytes % reader.WaveFormat.BlockAlign;
int startPos = startBytes;