在 .NET 中将 Opus (.ogg) 转换为 PCM (.wav)

Posted

技术标签:

【中文标题】在 .NET 中将 Opus (.ogg) 转换为 PCM (.wav)【英文标题】:Convert Opus (.ogg) to PCM (.wav) in .NET 【发布时间】:2018-11-28 15:19:07 【问题描述】:

我有一个 .ogg 文件,我需要将其转换为 .wav。我正在尝试使用Opus.Net(使用 NAudio),但我在 OpusDecoder.Decode() 中得到了这个异常:

“System.Exception: '解码失败 - InvalidPacket'”

这是代码:

byte[] audioBynary = File.ReadAllBytes($"filePathfileOgg");

_decoder = OpusDecoder.Create(48000, 1);
var pcmBinary = _decoder.Decode(audioBynary, audioBynary.Length, out int decodedLenght);

WaveFileWriter.CreateWaveFile($"filePathfileWav", new WaveFileReader(new MemoryStream(pcmBinary)));

【问题讨论】:

该项目看起来不再更新。你可以试试 Logan Stromberg 的版本,它对我很有效:github.com/lostromb 【参考方案1】:

这对我有用,我用 Concentus 读取 ogg/opus 文件,将它的字节复制到 memoryStream,然后用它来创建 RawSourceWaveStream。 我可以从 RawSourceWaveStream 获得一个 ISampleProvider,这是您需要提供的 WaveFileWriter.CreateWaveFile16.

        var filePath = $@"C:\Users\blabla\foo\bar\";
        var fileOgg = "testAudio.ogg";
        var fileWav = "testAudio.wav";

        using (FileStream fileIn = new FileStream($"filePathfileOgg", FileMode.Open))
        using (MemoryStream pcmStream = new MemoryStream())
        
            OpusDecoder decoder = OpusDecoder.Create(48000, 1);
            OpusOggReadStream oggIn = new OpusOggReadStream(decoder, fileIn);
            while (oggIn.HasNextPacket)
            
                short[] packet = oggIn.DecodeNextPacket();
                if (packet != null)
                
                    for (int i = 0; i < packet.Length; i++)
                    
                        var bytes = BitConverter.GetBytes(packet[i]);
                        pcmStream.Write(bytes, 0, bytes.Length);
                    
                
            
            pcmStream.Position = 0;
            var wavStream = new RawSourceWaveStream(pcmStream, new WaveFormat(48000, 1));
            var sampleProvider = wavStream.ToSampleProvider(); 
            WaveFileWriter.CreateWaveFile16($"filePathfileWav", sampleProvider);

【讨论】:

它工作正常,正是我需要的!谢谢! 您是否知道如何在 android Studio 中的 java 中执行此操作?

以上是关于在 .NET 中将 Opus (.ogg) 转换为 PCM (.wav)的主要内容,如果未能解决你的问题,请参考以下文章

使用 NAudio 将 WAV 流转换为 Opus

用ogg容器封装RTP包中提取的opus payload的实现

在 WP8 中将 ogg 文件解码为 wav

尽管列为可用格式,但将 ogg 转换为 wav 不起作用

是否可以使用 opus API 将 opus-fltp 转换为 opus-s16(或)将 opus-fltp 解码为 pcm

从 .opus 转换为 .wav