Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Silverlight 如何修剪WAV文件?_Silverlight_Windows Phone 7_Wav - Fatal编程技术网

Silverlight 如何修剪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

我需要修剪wp7中的.wav文件。我有一些代码,但不起作用。有人知道如何在WindowsPhone7中修剪wav文件吗

下面是我的代码,它不工作

    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循环之外,返回到流的开始。那是修理厂恭喜修理厂。当你有能力的时候,确保接受你的答案,这样其他人可以从你的解决方案中学习。干杯~祝贺你成功。当你有能力的时候,确保接受你的答案,这样其他人可以从你的解决方案中学习。干杯~