首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将wav文件转换为8000 to 16位Mono

将wav文件转换为8000 to 16位Mono
EN

Stack Overflow用户
提问于 2016-03-06 08:42:52
回答 2查看 2.9K关注 0票数 3

我需要将Wav文件转换为8000 to 16位Mono。我已经有了一个代码,它可以很好地处理NAudio库,但是我想使用MemoryStream而不是临时文件。

代码语言:javascript
复制
using System.IO;
using NAudio.Wave;

    static void Main()
    {
        var input = File.ReadAllBytes("C:/input.wav");
        var output = ConvertWavTo8000Hz16BitMonoWav(input);
        File.WriteAllBytes("C:/output.wav", output);
    }

    public static byte[] ConvertWavTo8000Hz16BitMonoWav(byte[] inArray)
    {
        using (var mem = new MemoryStream(inArray))
        using (var reader = new WaveFileReader(mem))
        using (var converter = WaveFormatConversionStream.CreatePcmStream(reader))
        using (var upsampler = new WaveFormatConversionStream(new WaveFormat(8000, 16, 1), converter))
        {
            // todo: without saving to file using MemoryStream or similar
            WaveFileWriter.CreateWaveFile("C:/tmp_pcm_8000_16_mono.wav", upsampler);
            return File.ReadAllBytes("C:/tmp_pcm_8000_16_mono.wav");
        }
    }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-03-06 09:50:01

不知道这是不是最理想的方法,但它有效.

代码语言:javascript
复制
    public static byte[] ConvertWavTo8000Hz16BitMonoWav(byte[] inArray)
    {
        using (var mem = new MemoryStream(inArray))
        {
            using (var reader = new WaveFileReader(mem))
            {
                using (var converter = WaveFormatConversionStream.CreatePcmStream(reader))
                {
                    using (var upsampler = new WaveFormatConversionStream(new WaveFormat(8000, 16, 1), converter))
                    {
                        byte[] data;
                        using (var m = new MemoryStream())
                        {
                            upsampler.CopyTo(m);
                            data = m.ToArray();
                        }
                        using (var m = new MemoryStream())
                        {
                            // to create a propper WAV header (44 bytes), which begins with RIFF 
                            var w = new WaveFileWriter(m, upsampler.WaveFormat);
                            // append WAV data body
                            w.Write(data,0,data.Length);
                            return m.ToArray();
                        }   
                    }
                }
            }
        }
    }
票数 3
EN

Stack Overflow用户

发布于 2016-09-26 23:20:32

它可能会增加,很抱歉,我还不能评论,因为缺乏点。NAudio 总是写46字节头,在某些情况下会导致崩溃。我想增加这一点,以防有人在寻找线索时,有人把这封信,为什么n音频wav文件只开始崩溃某些程序。

我在弄清楚如何用NAudio转换和/或示例wav之后就解决了这个问题,并且在使用了2天之后,我才用十六进制编辑器解决了这个问题。

(两个额外的字节位于数据子集d、a、t、a、size<4bytes>之前的字节37和38。下面是两个波文件头的比较,左边由NAudio保存,46个字节保存;右边由Audity44个字节保存

您可以通过查看WaveFormat.cs在第310行中的WaveFormat.cs在第310行 src来检查这一点,其中保留了fmt 18+extra而不是16个字节(+额外,因为有些wav文件包含比46个字节还要大的头),但是NAudio似乎总是编写46个字节头,而不是44个字节(MS标准)。还需要注意的是,实际上NAudio能够读取44个字节头(WaveFormat.cs中的第210行)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35824819

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档