Silverlight 如何修剪WAV文件?
我需要修剪wp7中的.wav文件。我有一些代码,但不起作用。有人知道如何在WindowsPhone7中修剪wav文件吗 下面是我的代码,它不工作Silverlight 如何修剪WAV文件?,silverlight,windows-phone-7,wav,Silverlight,Windows Phone 7,Wav,我需要修剪wp7中的.wav文件。我有一些代码,但不起作用。有人知道如何在WindowsPhone7中修剪wav文件吗 下面是我的代码,它不工作 public IsolatedStorageFileStream TrimWavFile(string FileName, TimeSpan cutFromStart, TimeSpan cutFromEnd) { long start = Convert.ToInt64((16 / 8) * 16000 * cutFr
public IsolatedStorageFileStream TrimWavFile(string FileName, TimeSpan cutFromStart, TimeSpan cutFromEnd)
{
long start = Convert.ToInt64((16 / 8) * 16000 * cutFromStart.TotalSeconds);
long end = Convert.ToInt64((16 / 8) * 16000 * cutFromEnd.TotalSeconds);
IsolatedStorageFile storage = IsolatedStorageFile.GetUserStoreForApplication();
IsolatedStorageFileStream stream = storage.OpenFile(FileName as string, FileMode.Open, FileAccess.Read);
byte[] buffer = new byte[stream.Length];
stream.Read(buffer, 0, buffer.Length);
return TrimWavFile(stream, start, end);
}
private IsolatedStorageFileStream TrimWavFile(IsolatedStorageFileStream reader, long startPos, long endPos)
{
IsolatedStorageFile storage = IsolatedStorageFile.GetUserStoreForApplication();
IsolatedStorageFileStream writer = new IsolatedStorageFileStream("t", FileMode.OpenOrCreate,storage);
reader.Position = startPos;
byte[] buffer = new byte[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);
}
}
Makewav.WriteHeader(writer, (int)writer.Length - 44, 1, 16000);
}
return writer;
}
公共隔离存储文件流TrimWavFile(字符串文件名、TimeSpan cutFromStart、TimeSpan cutFromEnd)
{
长启动=转换为64((16/8)*16000*cutFromStart.TotalSeconds);
长端=转换为64((16/8)*16000*cutFromEnd.TotalSeconds);
IsolatedStorageFile存储=IsolatedStorageFile.GetUserStoreForApplication();
IsolatedStorageFileStream=storage.OpenFile(文件名为string,FileMode.Open,FileAccess.Read);
byte[]buffer=新字节[stream.Length];
stream.Read(buffer,0,buffer.Length);
返回文件(流、开始、结束);
}
专用隔离存储文件流文件(隔离存储文件流读卡器、长启动程序、长结束程序)
{
IsolatedStorageFile存储=IsolatedStorageFile.GetUserStoreForApplication();
IsolatedStorageFileStream编写器=新的IsolatedStorageFileStream(“t”,FileMode.OpenOrCreate,storage);
reader.Position=startPos;
字节[]缓冲区=新字节[1024];
while(reader.Position0)
{
int bytesToRead=Math.Min(bytesRequired,buffer.Length);
int bytesRead=reader.Read(缓冲区,0,bytesToRead);
如果(字节读取>0)
{
writer.Write(缓冲区,0,字节读取);
}
}
Makewav.WriteHeader(writer,(int)writer.Length-44,116000);
}
返回作者;
}
首先,当您跳转到StartPO时,您似乎没有考虑wav头,因此您的位置将被关闭
第二,我猜可能存在块对齐问题。当你试着玩它时,它是静态的吗?NAudio的一些示例代码显示了如何修剪wav文件(),如下所示:
startPos = startPos - startPos % reader.WaveFormat.BlockAlign;
所以你只需要计算出块对齐的大小,然后像这样计算,很有可能。与您的结束位置相同。首先,当您跳转到startPos时,您似乎没有考虑wav标题,因此您的位置将被关闭 第二,我猜可能存在块对齐问题。当你试着玩它时,它是静态的吗?NAudio的一些示例代码显示了如何修剪wav文件(),如下所示:
startPos = startPos - startPos % reader.WaveFormat.BlockAlign;
所以你只需要计算出块对齐的大小,然后像这样计算,很有可能。与您的结束位置相同。我将波头放在循环中,将其移出循环,在
writer.length中删除-44
我只需从头开始寻找流,它就工作了。我在循环中找到了波浪头,将其移出循环,在writer.length中删除了-44
我只需从头开始寻找流,它就工作了。为了找到头信息,如采样率、num samples。。。等等,您可能需要阅读WAV文件规范
这个开源项目可能会给你一个参考。它是用Java编写的,但是修剪逻辑是相同的。为了找到诸如采样率、num samples。。。等等,您可能需要阅读WAV文件规范
这个开源项目可能会给你一个参考。它是用Java编写的,但是修剪逻辑是相同的。我不得不移动Makewav.WriteHeader(writer,(int)writer.Length,11600);在while循环之外,返回到流的开始。这就是我必须移动Makewav.WriteHeader(writer,(int)writer.Length,11600)的修正;在while循环之外,返回到流的开始。那是修理厂恭喜修理厂。当你有能力的时候,确保接受你的答案,这样其他人可以从你的解决方案中学习。干杯~祝贺你成功。当你有能力的时候,确保接受你的答案,这样其他人可以从你的解决方案中学习。干杯~