在 .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)的主要内容,如果未能解决你的问题,请参考以下文章
用ogg容器封装RTP包中提取的opus payload的实现
是否可以使用 opus API 将 opus-fltp 转换为 opus-s16(或)将 opus-fltp 解码为 pcm