修剪音频文件(.wav,.mp3)

时间:2011-06-24 09:23:48

标签: c#

我正在使用用户指定的标记来实现与修剪音频文件相关的软件,例如,如果音频文件播放1分钟并且用户想要将该文件从20秒修剪为40秒并保存它有新文件。代码示例将不胜感激。

提前致谢。

4 个答案:

答案 0 :(得分:9)

感谢大家的回复,但我得到了Mark Heath NAudio的解决方案。这是样本 希望它有所帮助:)

public static class WavFileUtils
{
    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);
            }
        }
    }

    private static void TrimWavFile(WaveFileReader reader, WaveFileWriter writer, int startPos, int endPos)
    {
        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.WriteData(buffer, 0, bytesRead);
                }
            }
        }
    }
}

答案 1 :(得分:2)

ffmpeg -ss 00:00:30.0 -t 00:00:10.0 -i input.mp3 -acodec copy output.mp3

这可以使用 Ffmpeg 来实现。 因此,请为Windows下载 ffmpeg ,然后将 FFmpeg 作为Process下载。

PS:-ss Pun Offset -t Length,在示例中将音频文件从30秒修剪为40秒(10秒长度)

答案 2 :(得分:1)

答案 3 :(得分:-1)

尝试更改代码:

byte[] buffer = new byte[1024];

byte[] buffer = new byte[endPosition-startPosition];