如何修剪WAV文件?

时间:2011-11-06 18:40:21

标签: silverlight windows-phone-7 wav

我需要在wp7中修剪.wav文件。我有一些代码,但它不起作用。有谁知道如何修剪Windows Phone 7中的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;
    }

3 个答案:

答案 0 :(得分:1)

首先,当你跳到你的startPos时,看起来你不会考虑wav标题,所以你的位置将会关闭。

其次我猜测可能存在块对齐问题。当你尝试播放时,它是否会以静态形式出现?来自NAudio的一些示例代码显示了如何修剪wav文件(http://mark-dot-net.blogspot.com/2009/09/trimming-wav-file-using-naudio.html),这显示了这一点:

startPos = startPos - startPos % reader.WaveFormat.BlockAlign;

所以你只需要找出你的块对齐大小并尽可能地计算它。与你的最终位置相同。

答案 1 :(得分:0)

我在循环中有波形标题,我将其移出循环,删除了writer.length中的-44。

我只需要将流回到开头就可以了。

答案 2 :(得分:0)

为了找到标题信息,例如采样率,num样本等,您可能需要阅读WAV文件规范https://ccrma.stanford.edu/courses/422/projects/WaveFormat/

此开源项目http://code.google.com/p/musicg/可能会为您提供参考。它是用Java编写的,但修剪逻辑是一样的。